IAM 역할을 사용하여 Amazon EC2의 AWS 리소스에 대한 액세스 권한 부여 - AWS SDK for Java 1.x

AWS SDK for Java 1.x는 2024년 7월 31일부터 유지 관리 모드로 전환되었으며 2025년 12월 end-of-support31일에 출시될 예정입니다. 새 기능, 가용성 개선 사항 및 AWS SDK for Java 2.x보안 업데이트를 계속 받으려면 로 마이그레이션하는 것이 좋습니다.

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

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

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

이 주제에서는 Amazon EC2에서 실행 중인 Java SDK 애플리케이션과 함께 IAM 역할을 사용하는 방법에 대해 설명합니다. IAM 인스턴스에 대한 자세한 내용은 Linux 인스턴스용 Amazon EC2 사용 설명서에서 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 컨테이너 서비스를 통해 제공되는 자격 증명.

  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 역할을 생성합니다.

  1. IAM 콘솔(IAM console)을 엽니다.

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

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

  4. AWS 서비스 역할역할 유형 선택 페이지에서 Amazon EC2을 선택합니다.

  5. 정책 템플릿 선택권한 설정 페이지에서 Amazon S3 읽기 전용 액세스를 선택한 후 다음 단계를 선택합니다.

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

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

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

  • 콘솔을 사용하여 Amazon EC2 인스턴스를 시작하려면 Amazon EC2 Linux 인스턴스용 사용 설명서에서 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 final String bucketName = "text-content"; private static final 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 {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 라이브러리와 함께 보안 복사( )를 사용하여 프로그램을 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 또는 Unix에서만 작동합니다. Windows에서 파일을 복사하려는 경우에는 다음 명령을 사용하여 인스턴스에서 파일 권한을 수정해야 할 수도 있습니다.

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

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

프로그램을 실행하려면 Amazon EC2 인스턴스에 연결합니다. 자세한 정보는 Linux 인스턴스용 Amazon EC2 사용 설명서에서 Linux 인스턴스에 연결을 참조하세요.

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

sudo yum install ant

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

ant run

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