TIL

2023.12.19 TIL - AWS SDK(Feat.S3) Credential 로드

AWS SDK Credential 설정

파일 업로드 기능을 AWS S3를 이용하여 구현하였다.

S3 연동을 위해서는 AWS Client를 생성하여 리소스에 Credential 정보를 설정해야한다.

application.yml 에 IAM의 access key와 secret key를 넣어놓고

AWS SDK의 AWSStaticCredentialsProvider를 통해 Credential을 생성하였다.

후에 프로젝트 피드백을 다음과 같이 받았다.

S3Config에서 AWSStaticCredentialsProvider보다는 DefaultCredentialProviderChain를 이용하는 것이 더 좋습니다. (체이닝 방식으로 IAM 권한을 순차적으로 확인하여 서비스 운영 환경이 여러 개여도 코드는 한줄로 대응이 가능합니다.) 예) 환경변수 -> {사용자 디렉토리}/.aws/credential -> ECS 등이라면, SES를 통해 얻은 임시 자격 증명 사용

요약하자면

서버 프로퍼티로 민감정보를 저장해서 만들지말고 SDK에서 체이닝하여 권한을 확인하는 `DefaultAWSCredentialsProviderChain` 을 이용하여 Credential 정보를 생성하자이다.

DefaultAWSCredentialsProviderChain

코드작성은 다음과 같다.

AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                       .withCredentials(DefaultAWSCredentialsProviderChain.getInstance())
                       .build();

 

AWS SDK for Java 2.x 버전 기준으로 `DefaultAWSCredentialsProviderChain`는 다음과 같은 순서대로

Credential을 찾는다.

 

환경 변수

환경 변수에 설정된 AWS_ACCESS_KEY_ID 와 AWS_SECRET_ACCESS_KEY 의 값을 가져온다.
AWS SDK for Java에서 사용하려면, EnvironmentVariableCredentialsProvider 클래스를 사용하여 자격 증명을 로드한다.


자바 시스템 프로퍼티

Java 시스템 프로퍼티는 VM options 에서 설정되는 -D 옵션으로 설정되는 값을 의미한다.

java -jar application.jar -Dspring.active.profiles=??


자바 시스템 프로퍼티에 설정된 aws.accessKeyId 와 aws.secretKey
의 값을 가져온다.


AWS SDK for Java에서 사용하려면, SystemPropertiesCredentialsProvider 클래스를 사용하여 자격 증명을 로드한다.


기본 Credential 프로필 파일

  • 일반적으로 ~/.aws/credentials (플랫폼마다 다를 수 있음)에 있으며 많은 AWS SDKs 및 AWS CLI에서 공유한다.
    • AWS CLI에서 제공하는 aws configure 명령을 사용하여 자격 증명 파일을 생성하거나 텍스트 편집기에서
      이 파일을 편집하여 새로 생성할 수 있음
    • 아래와 같은 형태로 생성되어 관리됨
[default]
aws_access_key_id = ?
aws_secret_access_key = ?
AWS SDK for Java의 ProfileCredentialsProvider를 사용하여 자격 증명을 로드


Amazon ECS 컨테이너 크리덴셜

  • 환경 변수 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI 가 설정되면 Amazon ECS에서 로드
  • AWS SDK for Java의 ContainerCredentialsProvider 를 사용하여 자격 증명을 로드
    • 이 값에 대한 IP 주소를 지정할 수 있다.


인스턴스 프로파일 자격 증명

  • 어플리케이션이 Amazon EC2 인스턴스에 실행되는 경우에만, 사용 가능하며 IAM과 연관된 메타데이터를 불러온다.
  • AWS SDK for Java의 InstanceProfileCredentialsProvider 를 사용하여 이러한 자격 증명을 로드
728x90