Post

AWS - S3

AWS - S3

0. 서론

AWSS3서비스는 스토리지 서비스로 다양한 종류의 데이터를 업로드하거나 내려받을 수 있는 서비스이다.

실제로 S3로 파일이나 정적 데이터를 서비스하고 EC2는 동적인 리소스를 처리하는 방식으로 구성하다니 한번 실습하도록 하겠다.


1. S3 세팅

S3서비스에서 [버킷 - 버킷만들기]를 이용하면 설정 페이지가 나오는데 엑세스 설정은 외부에서 사용 가능하도록 설정한다.

Image


버킷을 생성 후 [권한] 설정을 위해 생성한 버컷을 선택하고 [권한] 항목에서 버킷 정책 편집을 선택하면 문자열 작성하는 페이지가 나오는데 쉽게 하기 위해 [정책 생성기]를 이용한다.

Image Image


정책을 생성할 때 주의할 점

  • 첫단계에서 S3 Bucket Policy를 선택
  • Principal 항목에는 *을 입력
  • Actions항목에는 GetObject,PutObject,DeleteObject를 선택
  • Amazon Resource Name항목에 생성한 버킷의 ARN값 뒤에 /*를 추가

Image


위 과정을 다하고 밑에 [Generate Policy]를 실행하면 JSON이 만들어지게 된다.
생성된 JSON 문자열을 복사해서 이전 버킷 정책으로 지정하고 저장하여 완료하자.

Image


완료가 되었으면 버킷에 파일을 업로드하여 테스트를 해보자
참고로 업로드 한 다음 파일 객체를 선택해서 [객체 URL]를 선택하면 파일을 볼 수 있다.

Image Image



2. 제어 설정


스프링 부트와 같은 프로그램으로 S3에 접근해서 파일 업로드를 진행하기 위해서 추가적인 보안 설정이 필요하다.
먼저 AWSIAM항목에 들어가 [사용자]항목을 선택하여 사용자 생성을 하도록 하자

Image Image


사용자의 정책은 검색해서 amazonS3FullAccess를 찾아서 지정하자.

Image

사용자를 생성하면 [액세스 키 만들기]를 이용해 [CLI]를 선택하여 엑세스 키를 만들고 나면 따로 기록하든지 아님 .csv파일 내려받아서 보관하도록 하자.

Image Image Image


이제 사용자 생성이 완료되었으니 다시 S3항목으로 돌아와서 생성한 버킷의 [권한]을 확힌해 보면 [객체 소유권]이라는 항목이 있을텐데 [ACL 활성화됨]으로 편집해 주어야 한다.

Image Image


3. 인텔리제이에서 S3를 이용하기 위한 의존성 및 설정


인텔리제이에서 S3관련해서 이용할려면 아래와 같은 라이브러리 의존성 추가, 설정을 해줘야 하는데 책에는 없지만 난 config설정 클래스도 만들어 빈으로 등록까지 해야 에러가 나지 않았다.

  • build.gradle
1
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'


  • application.properties
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cloud.aws.credentials.access-key=${AWS_ACCESS_KEY_ID}
cloud.aws.credentials.secret-key=${AWS_SECRET_ACCESS_KEY}

cloud.aws.s3.bucket=생성한 버킷 이름

cloud.aws.region.static=자신이 이용하는 지역
cloud.aws.stack.auto=false

com.example.upload.path=파일을 실제로 저장할 폴더 경로


spring.servlet.multipart.enabled=true
spring.servlet.multipart.location=파일 업로드 시 임시 저장할 폴더 경로
spring.servlet.multipart.max-request-size=30MB
spring.servlet.multipart.max-file-size=10MB

logging.level.com.amazonaws.util.EC2MetadataUtils=error
  • Amazon Config
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Configuration
public class S3config {

    @Value("${cloud.aws.credentials.access-key}")
    private String accessKey;

    @Value("${cloud.aws.credentials.secret-key}")
    private String secretKey;

    @Value("${cloud.aws.region.static}")
    private String region;

    @Bean
    public AmazonS3 amazonS3Client(){
        BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);

        return AmazonS3ClientBuilder.standard()
                .withRegion(region)
                .withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
                .build();
    }
}

4. EC2에서 S3 설정


로컬에서 이것저것 테스트를 했다면 EC2환경에서 확인하고 싶을 텐데 난 인텔리제이에서 테스트한 프로젝트를 깃허브에 푸시 시도를 할려고 하였는데 application.properties파일에 엑세스 키 정보를 적었기 때문에 설정 파일에 입력한 민감한 정보는 환경 변수로 설정하는 것이 좋다고 한다.

  • application.properties
1
2
cloud.aws.credentials.access-key=${AWS_ACCESS_KEY_ID}
cloud.aws.credentials.secret-key=${AWS_SECRET_ACCESS_KEY}


그러면 정상적으로 수정한 프로젝트를 다시 푸시하면 올라갈 것이고, EC2에서 이 엑세스 키를 환경 변수 설정을 위한 수정을 해야 한다.
먼저 홈 디렉터리에서 .bashrc파일을 수정한다.

1
nano ~/.bashrc


.bashrc파일 아래에 다음과 같이 환경 변수를 추가한다.

1
2
export AWS_ACCESS_KEY_ID="your-aws-access-key-id"
export AWS_SECRET_ACCESS_KEY="your-aws-secret-access-key"


이렇게 수정이 완료 되었으면 EC2에서 정상적으로 프로젝트가 실행할 수 있을 것이다.


This post is licensed under CC BY 4.0 by the author.