

 AWS SDK for Java 1.x는 2025년 12월 31일에 end-of-support되었습니다. 새로운 기능, 가용성 개선 및 보안 업데이트를 계속 받으려면 [AWS SDK for Java 2.x](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/home.html)로 마이그레이션하는 것이 좋습니다.

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

# IAM 역할을 사용하여 Amazon EC2의 AWS 리소스에 대한 액세스 권한 부여
<a name="java-dg-roles"></a>

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

이 주제에서는 Amazon EC2에서 실행 중인 Java SDK 애플리케이션과 함께 IAM 역할을 사용하는 방법에 대해 설명합니다. IAM 인스턴스에 대한 자세한 내용은 Linux 인스턴스용 Amazon EC2 사용 설명서에서 [Amazon EC2의 IAM 역할](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html)을 참조하세요.

## 기본 공급자 체인 및 EC2 인스턴스 프로파일
<a name="default-provider-chain"></a>

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

1. Java 시스템 속성 `aws.accessKeyId`와 `aws.secretKey`에서

1. 시스템 환경 변수 `AWS_ACCESS_KEY_ID` 및 `AWS_SECRET_ACCESS_KEY`에서

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

1. `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI` 환경 변수가 설정되어 있고 보안 관리자가 변수에 액세스할 수 있는 권한이 있는 경우 Amazon EC2 컨테이너 서비스를 통해 제공되는 자격 증명.

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

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

기본 공급자 체인의 *인스턴스 프로파일 자격 증명* 단계는 Amazon EC2 인스턴스에서 애플리케이션을 실행 중일 때만 사용할 수 있지만, Amazon EC2 인스턴스 작업 시 최상의 용이성과 최대 보안을 제공합니다. 또한 [InstanceProfileCredentialsProvider](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/auth/InstanceProfileCredentialsProvider.html) 인스턴스를 클라이언트 생성자로 직접 전달하여 전체 기본 공급자 체인을 따라 진행하지 않고도 인스턴스 프로파일 자격 증명을 가져올 수 있습니다.

예:

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

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

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

클라이언트 생성자가 자격 증명 공급자 체인을 사용하여 자격 증명을 찾을 수 없는 경우 [AmazonClientException](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/AmazonClientException.html)이 발생합니다.

## 연습: EC2 인스턴스에서 IAM 역할 사용
<a name="roles-walkthrough"></a>

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

### IAM 역할 생성
<a name="java-dg-create-the-role"></a>

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

1. [IAM 콘솔](https://console.aws.amazon.com/iam/home)을 엽니다.

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

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

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

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

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

### EC2 인스턴스 시작과 IAM 역할 지정
<a name="java-dg-launch-ec2-instance-with-instance-profile"></a>

Amazon EC2 콘솔이나 AWS SDK for Java를 사용하여 IAM 역할로 Amazon EC2 인스턴스를 시작할 수 있습니다.
+ 콘솔을 사용하여 Amazon EC2 인스턴스를 시작하려면 Amazon EC2 Linux 인스턴스용 사용 설명서에서 [Amazon EC2 Linux 인스턴스 시작하기](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EC2_GetStarted.html)에 나와 있는 지침을 따르세요.

  **Review Instance Launch(인스턴스 시작 검토)** 페이지가 표시되면 **Edit instance details(인스턴스 세부 정보 편집)**를 선택합니다. **IAM 역할**에서 이전에 생성한 IAM 역할을 선택합니다. 안내에 따라 절차를 완료합니다.
**참고**  
보안 그룹을 생성하거나 기존 보안 그룹 및 키 페어를 사용하여 인스턴스에 연결해야 합니다.
+ AWS SDK for Java를 사용하여 IAM 역할로 Amazon EC2 인스턴스를 시작하려면 [Amazon EC2 인스턴스 실행](run-instance.md) 단원을 참조하세요.

### 애플리케이션 생성
<a name="java-dg-remove-the-credentials"></a>

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 인스턴스로 전송
<a name="java-dg-transfer-compiled-program-to-ec2-instance"></a>

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 콘솔](https://console.aws.amazon.com/ec2/home)을 열고 **설명** 탭에서 **퍼블릭 DNS** 값(예:`ec2-198-51-100-1.compute-1.amazonaws.com`) 을 찾으세요.

앞의 명령에서:
+  `GetS3Object.class`는 컴파일된 프로그램입니다.
+  `build.xml`는 프로그램을 빌드하고 실행하는 데 사용되는 ant 파일입니다.
+ `lib` 및 `third-party` 디렉터리는 AWS SDK for Java의 해당 라이브러리 폴더입니다.
+ `-r` 스위치는 `scp`가 `library` 배포판의 `third-party` 및 AWS SDK for Java 디렉터리에 들어 있는 모든 내용을 재귀적으로 복사하도록 지정합니다.
+ `-p` 스위치는 `scp`가 소스 파일을 대상으로 복사할 때 소스 파일의 권한을 유지하도록 지정합니다.
**참고**  
`-p` 스위치는 Linux, macOS 또는 Unix에서만 작동합니다. Windows에서 파일을 복사하려는 경우에는 다음 명령을 사용하여 인스턴스에서 파일 권한을 수정해야 할 수도 있습니다.

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

### EC2 인스턴스에서 샘플 프로그램 실행
<a name="java-dg-run-the-program"></a>

프로그램을 실행하려면 Amazon EC2 인스턴스에 연결합니다. 자세한 정보는 Linux 인스턴스용 Amazon EC2 사용 설명서에서 [Linux 인스턴스에 연결](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AccessingInstances.html)을 참조하세요.

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

```
sudo yum install ant
```

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

```
ant run
```

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