IAM 역할을 사용하여 Amazon EC2에서 AWS 리소스에 대한 액세스 부여 - Java용 AWS SDK

IAM 역할을 사용하여 Amazon EC2에서 AWS 리소스에 대한 액세스 부여

Amazon Web Services(AWS)에 대한 모든 요청은 AWS가 발급한 자격 증명을 이용해 암호화 서명되어야 합니다. IAM 역할을 사용하여 Amazon EC2 인스턴스에서 AWS 리소스에 대한 보안 액세스 권한을 편리하게 부여할 수 있습니다.

이 주제에서는 Amazon EC2에서 실행 중인 Java SDK 애플리케이션과 함께 IAM 역할을 사용하는 방법에 대해 설명합니다. IAM 인스턴스에 대한 자세한 내용은 Amazon EC2 User Guide for Linux Instances의 Amazon EC2의 IAM 역할을 참조하십시오.

기본 공급자 체인 및 EC2 인스턴스 프로파일

애플리케이션은 기본 생성자를 사용하여 AWS 클라이언트를 생성하는 경우 클라이언트는 다음 순서대로 기본 자격 증명 공급자 체인을 사용하여 자격 증명을 검색합니다.

  1. Java 시스템 속성 aws.accessKeyIdaws.secretKey에서

  2. 시스템 환경 변수 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY에서

  3. 기본 자격 증명 파일(이 파일의 위치는 플랫폼마다 다름)에서

  4. AWS_CONTAINER_CREDENTIALS_RELATIVE_URI 환경 변수가 설정되어 있고 보안 관리자가 변수에 액세스할 수 있는 권한이 있는 경우 Amazon EC2 Container Service를 통해 제공되는 자격 증명

  5. 인스턴스 프로파일 자격 증명(EC2 인스턴스의 IAM 역할과 연결된 인스턴스 메타데이터 안에 존재함)에서

  6. 환경 또는 컨테이너의 웹 자격 증명 토큰 자격 증명

기본 공급자 체인의 인스턴스 프로파일 자격 증명 단계는 Amazon EC2 인스턴스에서 애플리케이션을 실행 중일 때만 사용할 수 있지만, Amazon EC2 인스턴스 작업 시 최상의 용이성과 최대 보안을 제공합니다. 또한 InstanceProfileCredentialsProvider 인스턴스를 클라이언트 생성자로 직접 전달하여 전체 기본 공급자 체인을 따라 진행하지 않고도 인스턴스 프로파일 자격 증명을 가져올 수 있습니다.

다음 예를 참조하십시오.

AmazonS3 s3 = AmazonS3ClientBuilder.standard() .withCredentials(new InstanceProfileCredentialsProvider(false)) .build();

이 접근 방법을 사용할 경우 SDK는 인스턴스 프로파일의 Amazon EC2 인스턴스에 대한 IAM 역할과 연결된 자격 증명과 동일한 권한을 가진 임시 AWS 자격 증명을 가져옵니다. 이러한 자격 증명은 임시용이므로 기간이 경과되면 만료되지만, InstanceProfileCredentialsProvider는 가져온 자격 증명을 통해 계속 AWS에 액세스할 수 있도록 자격 증명을 정기적으로 새로 고칩니다.

중요

자동 자격 증명 새로 고침은 기본 클라이언트 생성자를 사용하는 경우(고유의 InstanceProfileCredentialsProvider를 기본 공급자 체인의 일부로서 생성함) 또는 InstanceProfileCredentialsProvider 인스턴스를 클라이언트 생성자에 직접 전달할 때 발생합니다. 다른 메서드를 사용하여 인스턴스 프로파일 자격 증명을 가져오거나 전달하는 경우 개발자 스스로 만료된 자격 증명을 확인하고 새로 고쳐야 합니다.

클라이언트 생성자가 자격 증명 공급자 체인을 사용하여 자격 증명을 찾을 수 없는 경우 AmazonClientException이 발생합니다.

연습: EC2 인스턴스에서 IAM 역할 사용

다음 연습에서는 IAM 역할을 사용하여 액세스를 관리하기 위해 Amazon S3에서 객체를 가져오는 방법을 보여줍니다.

IAM 역할 생성

Amazon S3에 대한 읽기 전용 액세스를 부여하는 IAM 역할을 생성합니다.

IAM 역할을 만들려면

  1. IAM 콘솔을 엽니다.

  2. 탐색 창에서 [Roles]를 클릭한 다음 [Create New Role]을 선택합니다.

  3. 역할 이름을 입력한 다음 [Next Step]을 클릭합니다. 이 이름은 Amazon EC2 인스턴스를 시작할 때 필요하므로 꼭 기억해 두십시오.

  4. [Select Role Type] 페이지의 [AWS Service Roles]에서 [Amazon EC2]를 선택합니다.

  5. [Set Permissions] 페이지의 [Select Policy Template]에서 [Amazon S3 Read Only Access]를 선택한 후 [Next Step]을 선택합니다.

  6. [Review] 페이지에서 [Create Role]을 선택합니다.

EC2 인스턴스 시작과 IAM 역할 지정

Amazon EC2 콘솔이나 AWS SDK for Java를 사용하여 IAM 역할로 Amazon EC2 인스턴스를 시작할 수 있습니다.

  • 콘솔을 사용하여 Amazon EC2 인스턴스를 시작하려면 Amazon EC2 User Guide for Linux Instances의 Amazon EC2 Linux 인스턴스 시작하기에 나오는 지침을 따르십시오.

    Review Instance Launch(인스턴스 시작 검토) 페이지가 표시되면 Edit instance details(인스턴스 세부 정보 편집)를 선택합니다. IAM 역할에서 이전에 생성한 IAM 역할을 선택합니다. 안내에 따라 절차를 완료합니다.

    참고

    보안 그룹을 생성하거나 기존 보안 그룹 및 키 페어를 사용하여 인스턴스에 연결해야 합니다.

  • AWS SDK for Java를 사용하여 IAM 역할로 Amazon EC2 인스턴스를 시작하려면 Amazon EC2 인스턴스 실행 단원을 참조하십시오.

애플리케이션 생성

EC2 인스턴스에서 실행할 샘플 애플리케이션을 빌드해 보겠습니다. 먼저 자습서 파일(예: GetS3ObjectApp)을 저장하는 데 사용할 수 있는 디렉터리를 생성합니다.

다음에는 AWS SDK for Java 라이브러리를 새로 생성한 디렉터리로 복사합니다. AWS SDK for Java를 ~/Downloads 디렉터리로 다운로드한 경우 다음 명령을 사용하여 복사할 수 있습니다.

cp -r ~/Downloads/aws-java-sdk-{1.7.5}/lib . cp -r ~/Downloads/aws-java-sdk-{1.7.5}/third-party .

새 파일을 열어서 이름을 GetS3Object.java로 지정한 후 다음 코드를 추가합니다.

import java.io.*; import com.amazonaws.auth.*; import com.amazonaws.services.s3.*; import com.amazonaws.services.s3.model.*; import com.amazonaws.AmazonClientException; import com.amazonaws.AmazonServiceException; public class GetS3Object { private static String bucketName = "text-content"; private static String key = "text-object.txt"; public static void main(String[] args) throws IOException { AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient(); try { System.out.println("Downloading an object"); S3Object s3object = s3Client.getObject( new GetObjectRequest(bucketName, key)); displayTextInputStream(s3object.getObjectContent()); } catch(AmazonServiceException ase) { System.err.println("Exception was thrown by the service"); } catch(AmazonClientException ace) { System.err.println("Exception was thrown by the client"); } } private static void displayTextInputStream(InputStream input) throws IOException { // Read one text line at a time and display. BufferedReader reader = new BufferedReader(new InputStreamReader(input)); while(true) { String line = reader.readLine(); if(line == null) break; System.out.println( " " + line ); } System.out.println(); } }

새 파일을 열어서 이름을 build.xml로 지정한 후 다음 행을 추가합니다.

<project name="Get Amazon S3 Object" default="run" basedir="."> <path id="aws.java.sdk.classpath"> <fileset dir="./lib" includes="**/*.jar"/> <fileset dir="./third-party" includes="**/*.jar"/> <pathelement location="lib"/> <pathelement location="."/> </path> <target name="build"> <javac debug="true" includeantruntime="false" srcdir="." destdir="." classpathref="aws.java.sdk.classpath"/> </target> <target name="run" depends="build"> <java classname="GetS3Object" classpathref="aws.java.sdk.classpath" fork="true"/> </target> </project>

수정된 프로그램을 빌드하고 실행합니다. 이 프로그램에는 자격 증명이 저장되어 있지 않습니다. 그러므로 이미 AWS 자격 증명을 지정한 경우가 아니면 AmazonServiceException이 발생합니다. 다음 예를 참조하십시오.

$ ant Buildfile: /path/to/my/GetS3ObjectApp/build.xml build: [javac] Compiling 1 source file to /path/to/my/GetS3ObjectApp run: [java] Downloading an object [java] AmazonServiceException BUILD SUCCESSFUL

컴파일된 프로그램을 EC2 인스턴스로 전송

AWS SDK for Java 라이브러리와 함께 보안 복사( scp )를 사용하여 프로그램을 Amazon EC2 인스턴스로 전송합니다. 명령 순서는 다음과 유사합니다.

scp -p -i {my-key-pair}.pem GetS3Object.class ec2-user@{public_dns}:GetS3Object.class scp -p -i {my-key-pair}.pem build.xml ec2-user@{public_dns}:build.xml scp -r -p -i {my-key-pair}.pem lib ec2-user@{public_dns}:lib scp -r -p -i {my-key-pair}.pem third-party ec2-user@{public_dns}:third-party
참고

사용한 Linux 배포판에 따라 사용자 이름은 "ec2-user", "root" 또는 "ubuntu"일 수 있습니다. 인스턴스의 퍼블릭 DNS 이름을 가져오려면 EC2 콘솔을 열고 설명 탭에서 퍼블릭 DNS 값을 찾습니다(예: ec2-198-51-100-1.compute-1.amazonaws.com).

앞의 명령에서:

  • GetS3Object.class는 컴파일된 프로그램입니다.

  • build.xml는 프로그램을 빌드하고 실행하는 데 사용되는 ant 파일입니다.

  • libthird-party 디렉터리는 AWS SDK for Java의 해당 라이브러리 폴더입니다.

  • -r 스위치는 scp가 AWS SDK for Java 배포판의 librarythird-party 디렉터리에 들어 있는 모든 내용을 재귀적으로 복사하도록 지정합니다.

  • -p 스위치는 scp가 소스 파일을 대상으로 복사할 때 소스 파일의 권한을 유지하도록 지정합니다.

    참고

    -p 스위치는 Linux, macOS, or Unix에서만 작동합니다. Windows에서 파일을 복사하려는 경우에는 다음 명령을 사용하여 인스턴스에서 파일 권한을 수정해야 할 수도 있습니다.

    chmod -R u+rwx GetS3Object.class build.xml lib third-party

EC2 인스턴스에서 샘플 프로그램 실행

프로그램을 실행하려면 Amazon EC2 인스턴스에 연결합니다. 자세한 내용은 Amazon EC2 User Guide for Linux Instances의 Linux 인스턴스에 연결을 참조하십시오.

인스턴스에서 ant를 사용할 수 없는 경우 다음 명령을 사용하여 설치합니다.

sudo yum install ant

그러고 나서, 다음과 같이 ant를 사용하여 프로그램을 실행합니다.

ant run

프로그램이 Amazon S3 객체의 내용을 명령 창에 씁니다.