Published on

AWS S3 버킷 생성하고 권한 부여하기

Authors
  • avatar
    Name
    손예지(Liv)

현재 프로젝트에서 S3를 사용해 이미지를 업로드 해보기로 해 S3 bucket을 생성하게 되었습니다. S3를 생성하는 과정은 어렵지 않지만 이미지 관련된 권한을 부여하는 과정에서 꽤 많은 시간을 썼습니다. AWS에서 제공해주는 문서를 찾아보는 부분도 처음 접하는 사람에게는 쉽지 않을 수 있어서 저와 같은 어려움을 겪는 누군가에게 도움이 되었으면 하는 마음으로 작성해보겠습니다.

S3 Bucket 생성하기

먼저 이 글은 AWS 계정을 이미 보유하고 있다고 가정하고 진행합니다. AWS 계정이 아직 없으시다면 먼저 계정을 만드신 후 글을 읽어보시는 것을 추천합니다!

먼저 AWS 계정에 접속합니다. 여기서는 S3 bucket과 IAM 계정 생성을 하기 위해 root 계정으로 로그인 하였습니다. 계정 접속 후 S3를 검색해 S3 콘솔로 진입을 합니다.

진입한 후 Create Bucket 을 클릭하면 아래와 같이 생성할 수 있는 창이 나타납니다. 먼저, bucket의 이름을 생성해 줍니다. 이미 생성된 bucket이 존재하는 경우 Choose Bucket 을 통해 동일한 설정을 가지고 올 수 있습니다.

AWS는 Object Ownership을 disable로 설정하는 것을 권장합니다. 그 이유는 disable로 설정했을때 접근 제어를 Bucket Policy와 IAM Policy로만 관리할 수 있습니다. enable로 설정했을때 다른 사용자가 생성한 객체에 버킷 소유자가 접근하지 못하게 되는 일이 발생할 수 있기 때문입니다.

Block Public Access 역시 기본적으로 Block public access를 설정하도록 권장합니다. 그렇지만 저는 스프링부트를 사용해 S3에 이미지를 업로드 하려고 하기 때문에 public access를 허용해주도록 하겠습니다. IAM 사용자 권한을 통해서 제한을 줄 수 있습니다.

그 외에 남은 설정들을 살펴보면 Bucket Versioning은 객체의 모든 버전을 보존할 것인지에 대한 설정입니다. 이전버전으로 롤백할 수 있는 장점이 있지만 저장 비용이 증가할 수 있습니다. Encryption의 경우 아마존 S3가 관리하는 키로 암호화 하는 SSE-S3를 기본키로 설정합니다.

생성한 bucket은 General Purpose Bucket에서 확인할 수 있습니다.

IAM User 생성과 권한부여

S3 bucket을 생성한 후에는 사용자가 S3에 접근할 수 있도록 권한 부여가 필요합니다. IAM > Access management > Users 메뉴에서 사용자 생성을 클릭합니다.

원하는 계정이름을 입력한 후 권한을 부여합니다. Attatch Policies Directly를 설정한 후 AmazonS3FullAccess를 선택합니다. 설정을 검토한 후 생성을 누르면 사용자가 생성됩니다.

사용자를 생성한 후 사용자가 접근 하기 위한 Access Key, Secret Key의 발급이 필요합니다. 생성된 사용자를 클릭하게 되면 사용자를 관리할 수 있는 페이지가 나옵니다. 여기서 Create access key 를 클릭합니다.

Access key를 생성할때 어떤 용도로 사용할지 고르는 부분이 있습니다. CLI는 AWS CLI 도구를 컴퓨터에서 사용할 경우, Local code는 개발환경에서 AWS를 사용할때 사용하도록 설명하고 있습니다. 용도를 분리해서 사용할 수 있지만 CLI로 발급한 키를 Local code 에서도 사용 가능합니다.

S3 bucket 권한 설정

권한 부여를 한 이후에도 여전히 접근은 되지 않습니다. 그 이유는 bucket에서 사용자에 대한 접근 권한을 부여해 줘야 하기 때문입니다. General Purpose buckets > Permissions > Bucket policy 메뉴로 접근합니다. 이곳에서 접근 권한을 부여할 수 있습니다. 현재는 어떤 public access 도 허용되지 않은 상태입니다(초기설정).

설정은 json 형식으로 입력할 수 있는데, 입력 창에서 선택하는 방식으로 제공도 해주고 있습니다. 저는 모든 사용자에게 이미지를 조회할 수 있는 권한을 부여하고, 아까 생성한 user에게만 수정, 삭제 권한을 주려고 합니다. 아래와 같이 생성할 수 있습니다.

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Principal": "*",
			"Action": [
				"s3:GetObject"
			],
			"Resource": "arn:aws:s3:::{bucket 이름}/*"
		},
		{
			"Effect": "Allow",
			"Principal": {
				"AWS": "arn:aws:iam::{Account ID}:user/{iam user 이름}"
			},
			"Action": [
				"s3:PutObject",
				"s3:DeleteObject"
			],
			"Resource": "arn:aws:s3:::{bucket 이름}/*"
		}
	]
}

이렇게 설정하고 나면 아래와 같이 public access에 Read 권한이 생긴 것을 확인할 수 있습니다.

알게된 점

AWS에 많은 서비스들이 있고, 설정할 수 있는 부분들이 정말 많기 때문에 AWS를 사용하는 것이 여전히 어렵게 느껴집니다. 특히, EC2를 개설하고 인스턴스를 제대로 닫지 않아 과금이 여러번 된적이 있기 때문에 더 조심스러운 것 같습니다. 그래서 먼저 생성을 시도해보고 다시 한번 똑같은 과정을 연습하면서 글을 작성 해 보았습니다. 현업에서 실제로 직접 AWS 환경을 구성하는 역할까지는 하지 않을 수도 있을 것 같습니다. 그러나 생성된 IAM user 을 통해 접근하고, 또 코드에서 access 하는 부분을 알기 위해서는 꼭 학습이 필요한 부분이라고 생각이 듭니다.

참고자료

[Spring boot] AWS S3 를 이용한 파일 업로드
rest api로 spring boot + S3 버킷 이미지 업로드
Access control list (ACL) overview