122
Java용 AWS SDK 버전 2 개발자 안내서 Java용 AWS SDK 버전 2: 개발자 안내서 Copyright © 2020 Amazon Web Services, Inc. and/or its affiliates. All rights reserved.

Java용 AWS SDK 버전 2 - 개발자 안내서 · Java용 AWS SDK 버전 2 개발자 안내서 AWS에 가입 및 IAM 사용자 생성 AWS SDK for Java 2.0 시작하기 이 단원에서는

  • Upload
    others

  • View
    12

  • Download
    0

Embed Size (px)

Citation preview

Java용 AWS SDK 버전 2개발자 안내서

Java용 AWS SDK 버전 2: 개발자 안내서Copyright © 2020 Amazon Web Services, Inc. and/or its affiliates. All rights reserved.

Java용 AWS SDK 버전 2 개발자 안내서

Amazon's trademarks and trade dress may not be used in connection with any product or service that is not Amazon's,in any manner that is likely to cause confusion among customers, or in any manner that disparages or discreditsAmazon. All other trademarks not owned by Amazon are the property of their respective owners, who may or may notbe affiliated with, connected to, or sponsored by Amazon.

Java용 AWS SDK 버전 2 개발자 안내서

Table of ContentsAWS SDK for Java 2.0 개발자 안내서 .................................................................................................. 1

버전 2.x의 새 기능 ...................................................................................................................... 11.x 지원 .................................................................................................................................... 1추가 리소스 ............................................................................................................................... 1SDK에 기여 ............................................................................................................................... 2Eclipse IDE 지원 ........................................................................................................................ 2Android용 AWS 애플리케이션 개발 ............................................................................................... 2

시작하기 ............................................................................................................................................ 3AWS에 가입 및 IAM 사용자 생성 ................................................................................................. 3SDK 다운로드 ............................................................................................................................ 4

사전 조건 .......................................................................................................................... 4SDK를 프로젝트에 다운로드 ................................................................................................. 4SDK 컴파일 ....................................................................................................................... 4Java 개발 환경 설치 ........................................................................................................... 5JVM 선택 .......................................................................................................................... 5

AWS 자격 증명 및 리전 설정 ....................................................................................................... 5AWS 자격 증명 설정 ........................................................................................................... 5IMDS 자격 증명 갱신 .......................................................................................................... 6AWS 리전 설정 .................................................................................................................. 6

Apache Maven으로 SDK 사용하기 ............................................................................................... 7새 Maven 패키지 생성 ......................................................................................................... 7SDK를 Maven 종속성으로 구성 ............................................................................................ 8AWS 종속성이 포함된 JAR 파일 생성 .................................................................................... 9프로젝트 빌드 .................................................................................................................. 11

Gradle에서 SDK 사용 ............................................................................................................... 11SDK 사용 ........................................................................................................................................ 13

서비스 클라이언트 생성 ............................................................................................................ 13클라이언트 빌더 가져오기 .................................................................................................. 13DefaultClient 사용 ............................................................................................................. 13클라이언트 수명 주기 ........................................................................................................ 14

AWS 자격 증명 제공 및 가져오기 ............................................................................................... 14기본 자격 증명 공급자 체인 사용 ......................................................................................... 14특정 자격 증명 공급자 또는 공급자 체인 사용 ....................................................................... 16명시적으로 자격 증명을 제공합니다. .................................................................................... 16

AWS 리전 선택 ....................................................................................................................... 17리전 선택 ......................................................................................................................... 17특정 엔드포인트 선택 ........................................................................................................ 18환경에서 AWS 리전을 자동으로 결정 ................................................................................... 18AWS 리전에서 서비스 가용성 확인 ...................................................................................... 19

클라이언트 구성 ....................................................................................................................... 19HTTP 전송 구성 .............................................................................................................. 19SDK 시작 시간 성능 개선 구성 .......................................................................................... 20

비동기 프로그래밍 ................................................................................................................... 21비 스트리밍 작업 .............................................................................................................. 21스트리밍 작업 .................................................................................................................. 23고급 작업 ......................................................................................................................... 25

HTTP/2 프로그래밍 .................................................................................................................. 26예외 처리 ............................................................................................................................... 26

확인되지 않은 예외가 발생하는 이유 .................................................................................... 26SdkServiceException (및 관련 하위 클래스) .......................................................................... 26SdkClientException ............................................................................................................ 27

AWS SDK for Java 호출 로깅 .................................................................................................... 27Log4J JAR 추가 ............................................................................................................... 27Log4j 구성 파일 ................................................................................................................ 27

iii

Java용 AWS SDK 버전 2 개발자 안내서

Classpath 설정 ................................................................................................................. 27서비스 관련 오류 및 경고 ................................................................................................... 28요청/응답 요약 로깅 .......................................................................................................... 28상세 표시 유선 로깅 .......................................................................................................... 29

Amazon EC2의 IAM 역할 구성(고급) .......................................................................................... 29기본 공급자 체인 및 Amazon EC2 인스턴스 프로필 ............................................................... 30연습: Amazon EC2 인스턴스에서 IAM 역할 사용 ................................................................... 30

코드 예제 ......................................................................................................................................... 32Amazon CloudWatch 예제 .......................................................................................................... 32

CloudWatch에서 지표 가져오기 ......................................................................................... 33사용자 지정 지표 데이터 게시 ............................................................................................ 34CloudWatch 경보 작업 ...................................................................................................... 35CloudWatch에서 경보 작업 사용 ........................................................................................ 37CloudWatch로 이벤트 전송 ................................................................................................ 38

Amazon DynamoDB 예제 ........................................................................................................... 40DynamoDB의 테이블 작업 ................................................................................................. 41DynamoDB의 항목 작업 .................................................................................................... 47

Amazon EC2 예제 .................................................................................................................... 51Amazon EC2 인스턴스 관리 .............................................................................................. 52Amazon EC2에서 탄력적 IP 주소 사용 ................................................................................ 56리전 및 가용 영역 사용 ..................................................................................................... 58Amazon EC2 키 페어 작업 ................................................................................................ 60Amazon EC2의 보안 그룹 작업 .......................................................................................... 62

AWS Identity and Access Management(IAM) 예제 ......................................................................... 64IAM 액세스 키 관리 ......................................................................................................... 65IAM 사용자 관리 .............................................................................................................. 68IAM 계정 별칭 사용 ......................................................................................................... 71IAM 정책 작업 ................................................................................................................. 72IAM 서버 인증서 작업 ...................................................................................................... 76

Amazon Kinesis 예제 ................................................................................................................ 79Amazon Kinesis Data Streams 구독 ................................................................................... 79

Amazon Lambda 예제 ............................................................................................................... 84서비스 작업 ...................................................................................................................... 84

Amazon S3 예제 ....................................................................................................................... 87버킷 작업 ......................................................................................................................... 87객체 작업 ......................................................................................................................... 91

Amazon S3 미리 서명된 예제 ..................................................................................................... 97미리 서명된 URL 생성 및 객체 업로드 ................................................................................. 97미리 서명된 객체 가져오기 ................................................................................................. 98

Amazon SQS 예제 .................................................................................................................. 100대기열 작업 .................................................................................................................... 100메시지 작업 .................................................................................................................... 102

Amazon Transcribe 예제 .......................................................................................................... 105Amazon Transcribe 작업 ................................................................................................. 105

페이지 매김 예제 ..................................................................................................................... 109동기식 페이지 매김 ......................................................................................................... 109비동기 페이지 매김 ......................................................................................................... 111

보안 .............................................................................................................................................. 115데이터 보호 ............................................................................................................................ 115ID 및 액세스 관리 ................................................................................................................... 116규정 준수 확인 ........................................................................................................................ 116복원성 ................................................................................................................................... 117인프라 보안 ............................................................................................................................ 117

문서 기록 ....................................................................................................................................... 118

iv

Java용 AWS SDK 버전 2 개발자 안내서버전 2.x의 새 기능

AWS SDK for Java 2.0 개발자 안내서AWS SDK for Java는 Amazon Web Services용 Java API를 지원합니다. SDK를 사용하면 Amazon S3,Amazon EC2, DynamoDB 등에서 작동하는 Java 애플리케이션을 쉽게 빌드할 수 있습니다. Amazon에서는새 서비스에 대한 지원을 AWS SDK for Java에 정기적으로 추가하고 있습니다. 특정 버전의 변경 사항 및 기능 목록은 변경 로그를 참조하십시오.

버전 2.x의 새 기능AWS SDK for Java 2.0에서 버전 1.0 코드 베이스 상당수를 다시 작성했습니다. Java 8+에 토대를 두고 있으며, 요청이 많았던 기능들을 몇 가지 추가했습니다. 비차단형 I/O 지원과 런타임에서 여러 HTTP 구현을 연결할 수 있는 기능 등을 예로 들 수 있습니다. 자세한 내용은 AWS 블로그를 참조하십시오. 애플리케이션을1.11.x에서 2.x로 마이그레이션하는 지침은 마이그레이션 안내서를 참조하십시오.

2.x에 아직 포함되지 않은 추가 기능에 대한 자세한 내용은 Github 문제를 참조하십시오. 의견 및 피드백은언제든지 환영입니다.

• 상위 수준 라이브러리• S3 전송 관리자• S3 암호화 클라이언트• DynamoDB 객체 매퍼• DynamoDB 문서 API• DynamoDB 암호화 클라이언트• SQS 클라이언트 측 버퍼링

• Waiters• SDK 측정치• 진행 상황 리스너

1.x 지원현재 사용되고 있는 Java용 AWS SDK 1.x 버전에 대한 지원을 중단하지 않았습니다. 최종 프로덕션 릴리스가 가까워졌을 때 다른 AWS SDK 주요 버전 배포 방식과 유사하게 1.x 지원에 대한 상세한 계획을 공유할 예정입니다.

추가 리소스이 설명서 외에도, 다음은 AWS SDK for Java 개발자를 위한 귀중한 온라인 리소스입니다.

• Java 2.x용 AWS SDK 참조• Java 개발자 블로그• Java 개발자 포럼• GitHub:

• 설명서 소스• SDK 소스

1

Java용 AWS SDK 버전 2 개발자 안내서SDK에 기여

• AWS Code Sample Catalog• @awsforjava(Twitter)

SDK에 기여개발자는 다음 채널을 통해 피드백을 제공할 수 있습니다.

• GitHub에 문제 제시:• 설명서 문제 제시• SDK 문제 제시

• Java 2.x용 AWS SDK Gitter 채널의 SDK 정보 채팅에 참여• [email protected]에 익명 피드백을 제공합니다. Java용 AWS SDK 팀이 이메일을

모니터링합니다.• SDK 개발에 기여하려면 설명서나 SDK 소스 GitHub 리포지토리에 풀 요청을 제출합니다.

Eclipse IDE 지원현재 AWS Toolkit for Eclipse는 AWS SDK for Java 2.0를 지원하지 않습니다. AWS Toolkit for Eclipse에서AWS SDK for Java 2.0를 사용하려면 Eclipse의 Maven 도구를 사용해 2.x SDK에 종속성을 추가해야 합니다.

Android용 AWS 애플리케이션 개발Android 개발자인 경우 Amazon Web Services에서는 Android 개발용으로 특화된 AWS Mobile SDK forAndroid라는 SDK를 발표했습니다. 전체 설명서는 Android용 AWS Mobile SDK 개발자 안내서를 참조하십시오.

2

Java용 AWS SDK 버전 2 개발자 안내서AWS에 가입 및 IAM 사용자 생성

AWS SDK for Java 2.0 시작하기이 단원에서는 AWS SDK for Java를 설치, 설정 및 사용하는 방법에 대한 정보를 제공합니다.

주제• AWS에 가입 및 IAM 사용자 생성 (p. 3)• AWS SDK for Java 2.0 다운로드 (p. 4)• 개발을 위한 AWS 자격 증명 및 리전 설정 (p. 5)• Apache Maven으로 SDK 사용하기 (p. 7)• Gradle에서 SDK 사용 (p. 11)

AWS에 가입 및 IAM 사용자 생성AWS SDK for Java를 사용하여 Amazon Web Services(AWS)에 액세스하려면 AWS 계정과 AWS 자격 증명이 필요합니다. AWS 계정의 보안을 강화하려면 AWS 계정 자격 증명 대신 IAM 사용자를 사용해 액세스 자격 증명을 제공하는 것이 좋습니다.

Note

IAM 사용자 개요와 그들이 계정 보안에 중요한 이유에 대해서는 Amazon Web Services GeneralReference의 AWS 보안 자격 증명을 참조하십시오.

AWS에 가입하려면

1. https://aws.amazon.com/을 열어 가입을 클릭합니다.2. 화면에 표시되는 지시 사항을 따릅니다. 등록 절차 중 전화를 받고 전화 키패드를 사용하여 PIN을 입력

하는 과정이 있습니다.

그 다음에는 IAM 사용자를 생성한 후 보안 액세스 키를 다운로드(또는 복사)합니다.

IAM 사용자를 생성하려면

1. IAM 콘솔로 이동합니다(먼저 AWS에 로그인해야 할 수도 있음).2. 사이드바에 있는 Users(사용자)를 클릭하여 IAM 사용자를 봅니다.3. IAM 사용자가 설정되지 않은 경우 Create New Users(새 사용자 만들기)를 클릭하여 사용자를 하나 생

성합니다.4. AWS에 액세스하는 데 사용할 목록에서 IAM 사용자를 선택합니다.5. Security Credentials(보안 자격 증명) 탭을 열고 Create Access Key(액세스 키 만들기)를 클릭합니다.

Note

특정 IAM 사용자 하나당 활성 액세스 키를 최대 두 개 보유할 수 있습니다. IAM 사용자에게 이미 액세스 키가 두 개인 경우에는 새 키를 생성하기 전에 둘 중 하나를 삭제해야 합니다.

6. 표시되는 대화 상자에서 Download Credentials(자격 증명 다운로드) 버튼을 클릭하여 컴퓨터에 자격 증명 파일을 다운로드하거나 Show User Security Credentials(보안 자격 증명 표시)를 클릭하여 IAM 사용자의 액세스 키 ID 및 보안 액세스 키(복사하여 붙여 넣을 수 있음)를 확인합니다.

Important

대화 상자를 닫으면 이 보안 액세스 키를 얻을 수 없습니다. 하지만 그 키에 연결된 액세스 키ID를 삭제하고 새로운 액세스 키를 생성할 수 있습니다.

3

Java용 AWS SDK 버전 2 개발자 안내서SDK 다운로드

그리고 AWS 공유 자격 증명 파일이나 환경에 자격 증명을 설정 (p. 5)합니다.

AWS SDK for Java 2.0 다운로드이 주제에서는 AWS SDK for Java를 프로젝트에 다운로드하는 방법을 설명합니다.

사전 조건AWS SDK for Java를 사용하려면 다음 조건이 충족되어야 합니다.

• 적합한 Java 개발 환경 (p. 5).• AWS 계정 및 액세스 키. 자세한 내용은 AWS에 가입 및 IAM 사용자 생성 (p. 3)을 참조하십시오.• 환경에 AWS 자격 증명(액세스 키)을 설정하거나, AWS CLI와 다른 SDK가 사용하는 공유 자격 증명 파일

을 사용합니다. 자세한 내용은 개발을 위한 AWS 자격 증명 및 리전 설정 (p. 5)을 참조하십시오.

SDK를 프로젝트에 다운로드빌드 시스템 또는 IDE에 따라 다음 방법 중 하나를 사용하여 Apache Maven 또는 Gradle을 통해 프로젝트에SDK를 다운로드할 수 있습니다.

• Apache Maven– Apache Maven을 사용하는 경우 필요한 SDK 구성 요소나 전체 SDK(권장하지 않음)를프로젝트에서 종속성으로 지정할 수 있습니다. Apache Maven에서 SDK 사용 (p. 7)을 참조하십시오.

• Gradle– Gradle을 사용하는 경우 Gradle 프로젝트에 Maven BOM을 가져와서 SDK 종속성을 자동으로 관리할 수 있습니다. Gradle에서 SDK 사용 (p. 11)을 참조하십시오.

Note

MavenCentral을 아티팩트 소스로 지원하는 모든 빌드 시스템을 사용할 수 있습니다. 그러나 개발자미리보기에서 다운로드 가능한 zip 파일을 제공하지 않습니다.

위의 방법 중 하나를 사용하는 경우(예: Maven 사용) AWS JAR 파일을 다운로드하여 설치할 필요가 없습니다(다음 단원을 건너뛸 수 있음). 다른 IDE, Apache Ant 또는 다른 수단을 사용하여 프로젝트를 빌드하려는경우 다음 단원에서처럼 SDK를 다운로드하여 압축을 풉니다.

SDK 컴파일Maven을 사용해 AWS SDK for Java를 빌드할 수 있습니다. Maven은 한 번에 모든 필수 종속성을 다운로드하고, SDK를 빌드 및 설치합니다. 설치 지침을 비롯한 자세한 내용은 http://maven.apache.org/를 참조하십시오.

SDK를 컴파일하려면

1. JAVA 2.x용 AWS SDK(GitHub)를 엽니다.Note

GitHub에서 SDK 버전 1.0을 입수해 사용할 수도 있습니다(Java 1.x용 AWS SDK(GitHub)).2. Clone or download(복제 또는 다운로드) 버튼을 클릭해 다운로드 옵션을 선택합니다.3. 터미널 창에서 SDK 소스를 다운로드 한 디렉터리로 이동합니다.4. 다음 명령을 사용하여 SDK를 빌드하고 설치합니다(Maven 필요).

mvn clean install

4

Java용 AWS SDK 버전 2 개발자 안내서Java 개발 환경 설치

그러면 .jar 파일이 target 디렉터리로 빌드됩니다.5. (선택 사항) 다음 명령을 사용하여 API 참조 설명서를 빌드합니다.

mvn javadoc:javadoc

각 서비스의 target/site/apidocs/ 디렉터리에 설명서가 빌드되어 있습니다.

Java 개발 환경 설치AWS SDK for Java에는 Java 8.0 이상이 필요합니다. http://www.oracle.com/technetwork/java/javase/downloads/에서 최신 Java SE Development Kit 소프트웨어를 다운로드할 수 있습니다.

AWS SDK for Java는 OpenJDK 및 OpenJDK(Open Java Development Kit) 배포인 Amazon Corretto와도함께 작동합니다. https://openjdk.java.net/install/index.html에서 최신 OpenJDK 버전을 다운로드하십시오.https://aws.amazon.com/corretto/에서 Amazon Corretto 8 또는 Amazon Corretto 11 버전을 다운로드하십시오.

JVM 선택AWS SDK for Java를 사용해 서버 기반 애플리케이션의 성능을 최적화하려면 64비트 버전의 JVM(JavaVirtual Machine)을 사용하는 것이 좋습니다. 이 JVM은 실행 시간에 -Client 옵션을 지정하더라도 서버 모드로만 실행됩니다.

개발을 위한 AWS 자격 증명 및 리전 설정지원되는 서비스를 AWS SDK for Java와 연결하려면 AWS 자격 증명을 제공해야 합니다. AWS SDK 및 CLI는 공급자 체인을 사용하여 시스템/사용자 환경 변수 및 로컬 AWS 구성 파일 등 다양한 위치에서 AWS 자격증명을 찾습니다.

이 주제에서는 AWS SDK for Java를 사용한 로컬 애플리케이션 개발을 위한 AWS 자격 증명 설정에 대한 기본 정보를 제공합니다. Amazon EC2 인스턴스 내에서 사용할 자격 증명을 설정하거나 개발용으로 EclipseIDE를 사용하려는 경우에는 다음 주제를 참조하십시오.

• EC2 인스턴스를 사용할 때 IAM 역할을 생성한 후 Amazon EC2의 IAM 역할 구성(고급) (p. 29)에서처럼 해당 역할에 EC2 인스턴스 액세스 권한을 부여합니다.

• AWS Toolkit for Eclipse를 사용하여 Eclipse 내에서 AWS 자격 증명을 설정합니다. AWS Toolkit forEclipse 사용 설명서의 AWS 자격 증명 설정을 참조하십시오.

AWS 자격 증명 설정여러 가지 방법으로 AWS SDK for Java에서 사용할 자격 증명을 구성할 수 있습니다. 그러나 다음 방법들을사용하는 것이 좋습니다.

• 로컬 시스템의 다음 위치에 있는 AWS 자격 증명 프로필 파일에서 자격 증명을 설정합니다.• Linux, macOS, or Unix의 ~/.aws/credentials• Windows의 경우 C:\Users\USERNAME\.aws\credentials

이 파일에는 다음 형식의 행이 포함되어야 합니다.

[default]

5

Java용 AWS SDK 버전 2 개발자 안내서IMDS 자격 증명 갱신

aws_access_key_id = your_access_key_idaws_secret_access_key = your_secret_access_key

your_access_key_id 및 your_secret_access_key 값을 자신의 고유 AWS 자격 증명 값으로 대체합니다.• AWS_ACCESS_KEY_ID 및 AWS_SECRET_ACCESS_KEY 환경 변수를 설정합니다.

Linux, macOS, or Unix에서 이러한 변수를 설정하려면 export를 사용합니다.

export AWS_ACCESS_KEY_ID=your_access_key_idexport AWS_SECRET_ACCESS_KEY=your_secret_access_key

Windows에서 이러한 변수를 설정하려면 set을 사용합니다.

set AWS_ACCESS_KEY_ID=your_access_key_idset AWS_SECRET_ACCESS_KEY=your_secret_access_key

• EC2 인스턴스의 경우 IAM 역할을 지정하고 나서 해당 역할에 EC2 인스턴스 액세스 권한을 부여합니다. 이 작업이 이루어지는 과정에 대한 자세한 내용은 Amazon EC2 User Guide for Linux Instances의Amazon EC2의 IAM 역할 을 참조하십시오.

이러한 방법 중 하나를 사용하여 AWS 자격 증명을 설정하고 나면 기본 자격 증명 공급자 체인을 사용하여이러한 자격 증명이 AWS SDK for Java에서 자동으로 로드됩니다. Java 애플리케이션에서 AWS 자격 증명으로 작업하는 방법에 대한 자세한 내용은 AWS 자격 증명 제공 및 가져오기 (p. 14)를 참조하십시오.

IMDS 자격 증명 갱신AWS SDK for Java는 자격 증명 만료 시간에 관계없이 백그라운드에서 1분마다 IMDS 자격 증명을 옵트인갱신합니다. 이렇게 하면 자격 증명을 더 자주 갱신할 수 있으며 그렇지 않은 IMDS가 인식된 AWS 가용성에영향을 미칠 가능성을 줄일 수 있습니다.

1. // Refresh credentials using a background thread, automatically every minute. This will log an error if IMDS is down during 2. // a refresh, but your service calls will continue using the cached credentials until the credentials are refreshed 3. // again one minute later. 4. 5. InstanceProfileCredentialsProvider credentials = 6. InstanceProfileCredentialsProvider.builder() 7. .asyncCredentialUpdateEnabled(true) 8. .build(); 9. 10. S3Client client = S3Client.builder() 11. .credentialsProvider(credentials) 12. .build(); 13. 14. // This is new: When you are done with the credentials provider, you must close it to release the background thread. 15. credentials.close();

AWS 리전 설정AWS SDK for Java에서 AWS 서비스에 액세스 하기 위해 사용할 기본 AWS 리전을 설정해야 합니다. 네트워크 성능을 최대화하려면 본인(또는 본인의 고객)과 지리적으로 가까운 리전을 선택해야 합니다.

Note

리전을 선택하지 않으면 리전이 필요한 서비스 호출에 실패합니다.

6

Java용 AWS SDK 버전 2 개발자 안내서Apache Maven으로 SDK 사용하기

자격 증명 설정과 비슷한 기술을 사용하여 기본 AWS 리전을 설정할 수 있습니다.

• 로컬 시스템의 다음 위치에 있는 AWS 구성 파일에서 AWS 리전을 설정합니다.• Linux, macOS, or Unix의 ~/.aws/config• Windows의 경우 C:\Users\USERNAME\.aws\config

이 파일에는 다음 형식의 행이 포함되어야 합니다.

[default]region = your_aws_region

your_aws_region을 원하는 AWS 리전(예를 들면 "us-west-2")으로 대체합니다.• AWS_REGION 환경 변수를 설정합니다.

Linux, macOS, or Unix에서는 export를 사용합니다.

export AWS_REGION=your_aws_region

Windows에서는 set을 사용합니다.

set AWS_REGION=your_aws_region

여기서 your_aws_region은 원하는 AWS 리전 이름입니다.

리전 선택에 대한 자세한 내용은 AWS 리전 선택 (p. 17)을 참조하십시오.

Apache Maven으로 SDK 사용하기Apache Maven을 사용하여 AWS SDK for Java 프로젝트를 구성 및 빌드하거나 SDK 자체를 빌드할 수 있습니다.

Note

이 주제의 지침을 사용하려면 Maven이 설치되어 있어야 합니다. 아직 설치하지 않은 경우 http://maven.apache.org/에서 다운로드하여 설치하십시오.

새 Maven 패키지 생성기본 Maven 패키지를 생성하려면 터미널(명령줄) 창을 열어서 다음 명령을 실행합니다.

mvn -B archetype:generate \ -DarchetypeGroupId=org.apache.maven.archetypes \ -DgroupId=org.example.basicapp \ -DartifactId=myapp

org.example.basicapp를 애플리케이션의 전체 패키지 네임스페이스로 대체합니다. myapp을 프로젝트 이름으로 바꿉니다(프로젝트의 디렉터리 이름이 됨).

이 quickstart 아키타이프를 사용하여 프로젝트 템플릿을 생성하도록 기본 설정되어 있습니다. 이렇게 하면Java 1.5 프로젝트가 생성됩니다. AWS Java SDK 버전 2와 호환되려면 사용자 애플리케이션을 Java 1.8로업데이트해야 합니다. Java 1.8로 업데이트하려면 pom.xml 파일에 다음을 추가합니다.

<build>

7

Java용 AWS SDK 버전 2 개발자 안내서SDK를 Maven 종속성으로 구성

<plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins></build>

-DarchetypeArtifactId 인수를 archetype:generate 명령에 추가하여 사용할 특정 아키타이프를 선택할 수 있습니다. pom.xml 파일 업데이트 단계를 생략하기 위해 시작부터 Java 1.8 프로젝트를 생성하는다음 아키타이프를 사용할 수 있습니다.

mvn archetype:generate -B \ -DarchetypeGroupId=pl.org.miki \ -DarchetypeArtifactId=java8-quickstart-archetype \ -DarchetypeVersion=1.0.0 \ -DgroupId=com.example \ -DartifactId=sdk-sandbox \ -Dversion=1.0 \ -Dpackage=com.example

이 밖에도 더 많은 아키타이프를 사용할 수 있습니다. 과 함께 패키지로 포함된 아키타이프의 목록은 {Maven아키타이프 페이지를 참조하십시오.

Note

프로젝트 생성 및 구성에 대한 자세한 내용은 Maven 시작 안내서를 참조하십시오.

SDK를 Maven 종속성으로 구성AWS SDK for Java를 프로젝트에서 사용하려면 pom.xml 파일에서 종속성으로 선언해야 합니다. 개별 구성요소 (p. 8) 또는 전체 SDK (p. 9)를 가져올 수 있습니다. 전체 SDK 대신 필요한 구성 요소만 가져오는 것이 좋습니다.

개별 SDK 모듈 지정(권장)개별 SDK 모듈을 선택하려면 Maven용 AWS SDK for Java BOM(Bill of Materials)를 사용합니다. 이렇게 하면 지정한 모듈이 SDK와 동일한 버전을 사용해 서로 호환됩니다.

BOM을 사용하려면 애플리케이션의 <dependencyManagement> 파일에 pom.xml 섹션을 추가합니다.bom을 종속성으로 추가하고, 사용할 SDK 버전을 지정합니다. AWS SDK for Java 2.x Reference에서 최신버전을 찾아보십시오.

<dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>2.X.X</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies></dependencyManagement>

8

Java용 AWS SDK 버전 2 개발자 안내서AWS 종속성이 포함된 JAR 파일 생성

Maven Central에서 사용할 수 있는 AWS SDK for Java BOM의 최신 버전을 보려면 https://mvnrepository.com/artifact/software.amazon.awssdk/bom을 참조하십시오. 또한 이 페이지를 사용하여BOM에 의해 관리되며 프로젝트의 <dependencies> 파일의 pom.xml 섹션에 포함할 수 있는 모듈을 확인할 수도 있습니다.

이제 애플리케이션에서 사용하는 SDK에서 개별 모듈을 선택할 수 있습니다. 이미 BOM에 SDK 버전을 선언했으므로 각 구성 요소마다 버전 번호를 지정할 필요가 없습니다.

<dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>kinesis</artifactId> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>dynamodb</artifactId> </dependency></dependencies>

또한 AWS Code Catalog를 참조하여 특정 AWS 서비스에 어떤 종속성을 사용해야 하는지 알아볼 수 있습니다. 특정 서비스 예제의 POM 파일을 참조하십시오. 예를 들어, AWS S3 서비스의 종속성에 관심이 있는 경우 GitHub의 전체 예제를 참조하십시오. (/java2/example_code/s3 아래의 POM을 확인하십시오).

전체 SDK 모듈 가져오기(권장하지 않음)전체 SDK를 종속성으로 가져오려는 경우에는 BOM 방법을 사용하지 않습니다. 대신 pom.xml에서 다음과같이 선언합니다. AWS SDK for Java 2.x Reference에서 최신 버전을 찾아보십시오.

<dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>aws-sdk-java</artifactId> <version>2.X.X</version> </dependency></dependencies>

AWS 종속성이 포함된 JAR 파일 생성Maven을 사용하여 개별 SDK 모듈이 포함된 단일 JAR 파일을 생성할 수 있습니다. JAR 파일을 생성하려면POM 파일을 올바르게 설정해야 합니다. 먼저 포함하려는 각 AWS 모듈에 대해 종속성 요소를 사용하여 해당 모듈을 참조해야 합니다(다음 예제 참조). 다음으로, POM 파일 내에 org.apache.maven.plugins 플러그인을 포함해야 합니다. POM 파일을 설정했으면 다음 명령을 사용할 수 있습니다:

mvn package

다음 POM 파일은 AWS 종속성이 포함된 단일 JAR 파일을 빌드합니다. 빌드가 완료된 후 target 폴더에서JAR 파일을 찾을 수 있습니다.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>localdomain.localhost.tutorial</groupId><artifactId>java-archive</artifactId><version>1.0-SNAPSHOT</version><name>AWS JAR</name><properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version>

9

Java용 AWS SDK 버전 2 개발자 안내서AWS 종속성이 포함된 JAR 파일 생성

</properties><build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <executions> <execution> <id>create-my-bundle</id> <phase>package</phase> <goals> <goal>single</goal> </goals> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </execution> </executions> </plugin> </plugins></build><dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>2.5.10</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies></dependencyManagement><dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>ec2</artifactId> <version>2.5.10</version> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>pinpoint</artifactId> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>dynamodb</artifactId>

10

Java용 AWS SDK 버전 2 개발자 안내서프로젝트 빌드

<version>2.5.10</version> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>sqs</artifactId> </dependency> </dependencies></project>

프로젝트 빌드프로젝트를 설정했으면 Maven의 package 명령을 사용하여 빌드할 수 있습니다.

mvn package

이렇게 하면 .jar 디렉터리에 target 파일이 생성됩니다.

Gradle에서 SDK 사용Gradle 프로젝트에서 AWS SDK for Java를 사용하려면 SDK의 Maven BOM(Bill of Materials)을 빌드 파일로가져와서 프로젝트의 SDK 종속성을 관리합니다.

Gradle 5.0 이상으로 SDK를 구성하려면

1. BOM을 파일의 dependencyManagement 섹션에 추가합니다.

dependencies { implementation platform('software.amazon.awssdk:bom:2.5.29')

// Declare SDK dependencies without version ...}

2. dependencies 섹션에 사용할 SDK 모듈을 지정합니다.

dependencies { implementation 'software.amazon.awssdk:kinesis' testCompile group: 'junit', name: 'junit', version: '4.11'}

Gradle에서는 BOM의 정보를 사용하여 올바른 SDK 종속성 버전을 자동으로 확인합니다.

전체 build.gradle 파일은 다음과 같습니다.

group 'aws.test' version '1.0'

apply plugin: 'java'

sourceCompatibility = 1.8

repositories { mavenCentral() }

dependencies {

11

Java용 AWS SDK 버전 2 개발자 안내서Gradle에서 SDK 사용

implementation platform('software.amazon.awssdk:bom:2.5.29') implementation 'software.amazon.awssdk:kinesis' testImplementation group: 'junit', name: 'junit', version: '4.11'

}

Note

BOM을 사용한 SDK 종속성 지정에 대한 자세한 내용은 Apache Maven으로 SDK 사용하기 (p. 7)를 참조하십시오.

12

Java용 AWS SDK 버전 2 개발자 안내서서비스 클라이언트 생성

Java 2.0용 AWS SDK 2.0 사용이 단원에서는 AWS SDK for Java를 사용한 프로그래밍에 대한 중요 일반 정보를 제공합니다. 이 정보는SDK에서 사용할 수 있는 모든 서비스에 적용됩니다.

주제• 서비스 클라이언트 생성 (p. 13)• AWS 자격 증명 제공 및 가져오기 (p. 14)• AWS 리전 선택 (p. 17)• 클라이언트 구성 (p. 19)• 비동기 프로그래밍 (p. 21)• HTTP/2 프로그래밍 (p. 26)• 예외 처리 (p. 26)• AWS SDK for Java 호출 로깅 (p. 27)• Amazon EC2의 IAM 역할 구성(고급) (p. 29)

서비스 클라이언트 생성Amazon Web Services에 요청하려면 먼저 서비스 클라이언트 객체를 만듭니다. SDK 버전 2.x의 경우 서비스 클라이언트 빌더만 사용해 클라이언트를 생성할 수 있습니다.

각 AWS 서비스에는 서비스 API의 각 작업에 대한 메서드를 포함하는 서비스 인터페이스가 있습니다. 예를들어 Amazon DynamoDB의 서비스 인터페이스 이름은 DynamoDbClient입니다. 각 서비스 인터페이스마다서비스 인터페이스의 구현을 생성하는 데 사용할 수 있는 정적 팩토리 빌더 메서드가 있습니다.

클라이언트 빌더 가져오기클라이언트 인스턴스를 가져오려면 정적 팩토리 메서드인 builder를 사용합니다. 그런 후 다음 예에서와같이 빌더의 Setter를 사용하여 사용자 지정합니다.

AWS SDK for Java 2.0에서 setter 이름에 with 접두사를 사용하지 않습니다.

DynamoDbClient client = DynamoDbClient.builder() .region(Region.US_WEST_2) .credentialsProvider(ProfileCredentialsProvider.builder() .profileName("myProfile") .build()) .build();

Note

유용한 setter 메서드는 builder 객체를 반환해 읽기 쉽고 편리하도록 메서드 호출을 묶을 수 있게도와줍니다. 원하는 속성을 구성한 후에는 build 메서드를 호출하여 클라이언트를 생성할 수 있습니다. 클라이언트를 생성한 후에는 변경할 수 없습니다. 다른 설정의 클라이언트를 생성하는 유일한방법은 새 클라이언트를 빌드하는 것입니다.

DefaultClient 사용클라이언트 빌더에는 create라는 또 다른 팩토리 메서드가 있습니다. 기본 구성을 사용해 서비스 클라이언트를 생성하는 메서드입니다. 기본 공급자 체인을 사용하여 자격 증명과 AWS 리전을 로드합니다. 자격 증명

13

Java용 AWS SDK 버전 2 개발자 안내서클라이언트 수명 주기

또는 리전을 애플리케이션이 실행 중인 환경에서 확인할 수 없으면 create 호출이 실패합니다. 자격 증명및 리전을 확인하는 방법에 대한 자세한 내용은 AWS 자격 증명 제공 및 가져오기 (p. 14) 및 AWS 리전 선택 (p. 17)을 참조하십시오.

기본 클라이언트 생성DynamoDbClient client = DynamoDbClient.create();

클라이언트 수명 주기SDK의 서비스 클라이언트는 스레드 세이프입니다. 최상의 성능을 위해 수명이 긴 객체로 처리합니다. 각클라이언트마다 클라이언트에서 가비지가 수집될 때 릴리스되는 고유한 연결 풀 리소스가 있습니다. AWSSDK for Java 2.0의 클라이언트는 AutoClosable 인터페이스로 확장이 되었습니다. close 메서드를 호출해명시적으로 클라이언트를 종료하는 것이 모범 사례입니다.

클라이언트 종료DynamoDbClient client = DynamoDbClient.create();client.close();

AWS 자격 증명 제공 및 가져오기Amazon Web Services(AWS)에 요청하려면 AWS 자격 증명을 AWS SDK for Java에 제공해야 합니다. 이를위해 다음 메서드를 사용할 수 있습니다.

• 기본 자격 증명 공급자 체인(권장)을 사용합니다.• 특정 자격 증명 공급자 또는 공급자 체인 사용• 명시적으로 자격 증명을 제공합니다.

다음 단원에서는 이들 각 메서드에 대해 설명합니다.

기본 자격 증명 공급자 체인 사용인수를 제공하지 않고 새로운 서비스 클라이언트를 초기화하는 경우 AWS SDK for Java는 AWS 자격 증명을 찾으려고 시도합니다. 이 경우 DefaultCredentialsProvider 클래스에 의해 구현된 기본 자격 증명 공급자체인을 사용합니다.

다음 예제는 기본 자격 증명 공급자 체인을 사용하는 새로운 서비스 클라이언트를 생성합니다.

S3Client s3 = S3Client.builder() .region(Region.US_WEST_2) .build();

자격 증명 가져오기 순서기본 자격 증명 공급자 체인이 자격 증명을 가져오려고 시도할 때 다음에 표시된 순서를 사용합니다.

1. Java 시스템 속성–aws.accessKeyId 및 aws.secretAccessKey. AWS SDK for Java에서는SystemPropertyCredentialsProvider를 사용하여 이 자격 증명을 로드합니다.

2. 환경 변수–AWS_ACCESS_KEY_ID 및 AWS_SECRET_ACCESS_KEY. AWS SDK for Java에서는EnvironmentVariableCredentialsProvider 클래스를 사용하여 이 자격 증명을 로드합니다.

14

Java용 AWS SDK 버전 2 개발자 안내서기본 자격 증명 공급자 체인 사용

3. 기본 자격 증명 프로필 파일– 이 파일의 특정 위치는 플랫폼에 따라 다를 수 있지만 일반적으로 ~/.aws/credentials에 있습니다. 이 파일은 많은 AWS SDK 및 AWS CLI에서 공유됩니다. AWS SDK for Java에서는 ProfileCredentialsProvider를 사용하여 이 자격 증명을 로드합니다.

AWS CLI에서 제공하는 aws configure 명령을 사용하여 자격 증명을 생성할 수 있습니다. 또한 텍스트편집기로 파일을 편집하여 생성할 수도 있습니다. 자격 증명 파일 형식에 대한 자세한 내용은 AWS 자격증명 파일 형식 (p. 16)을 참조하십시오.

4. Amazon ECS 컨테이너 자격 증명– 환경 변수 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI가 설정되면 Amazon ECS에서 로드됩니다. AWS SDK for Java에서는 ContainerCredentialsProvider를 사용하여이 자격 증명을 로드합니다.

5. 인스턴스 프로필 자격 증명– Amazon EC2 인스턴스에 사용되며 Amazon EC2 메타데이터 서비스를 통해전달됩니다. AWS SDK for Java에서는 InstanceProfileCredentialsProvider를 사용하여 이 자격 증명을 로드합니다.

자격 증명 설정AWS 자격 증명을 사용하려면 앞에 나온 위치 중 하나 이상에서 AWS 자격 증명을 제공해야 합니다. 자격 증명 설정에 대한 자세한 내용은 다음 주제를 참조하십시오.

• 환경이나 기본 자격 증명 프로필 파일에서 자격 증명을 제공하려면 개발을 위한 AWS 자격 증명 및 리전설정 (p. 5)을 참조하십시오.

• Java 시스템 속성을 설정하려면 공식 Java Tutorials 웹 사이트의 System Properties 자습서를 참조하십시오.

• EC2 인스턴스에서 인스턴스 프로필 자격 증명을 설정해 사용하는 방법은 Amazon EC2의 IAM 역할 구성(고급) (p. 29)을 참조하십시오.

대체 자격 증명 프로필 설정AWS SDK for Java에서는 기본 프로필을 사용하지만 자격 증명 파일에서 가져올 프로필을 사용자 지정하는방법도 있습니다.

AWS_PROFILE 환경 변수를 사용하여 SDK에서 로드되는 프로필을 변경할 수 있습니다.

예를 들어 Linux, macOS, or Unix에서는 다음 명령을 실행하여 프로필을 myProfile로 변경합니다.

export AWS_PROFILE="myProfile"

Windows에서 다음 명령을 실행합니다.

set AWS_PROFILE="myProfile"

AWS_PROFILE 환경 변수 설정은 공식적으로 지원되는 모든 AWS SDK 및 도구(예: AWS CLI 및 PowerShell용 AWS 도구)에 대한 자격 증명 로딩에 영향을 줍니다. Java 애플리케이션용 프로필만 변경하려면 대신에시스템 속성인 aws.profile을 사용합니다.

대체 자격 증명 파일 위치 설정AWS SDK for Java에서는 기본 자격 증명 파일 위치에서 AWS 자격 증명을 자동으로 로드합니다. 하지만 자격 증명 파일의 전체 경로를 사용하여 AWS_CREDENTIAL_PROFILES_FILE 환경 변수를 설정함으로써 이위치를 지정할 수도 있습니다.

이 기능을 사용하여 AWS SDK for Java에서 자격 증명 파일을 찾는 위치를 일시적으로 변경할 수 있습니다.예를 들면 명령줄에서 이 변수를 설정합니다. 또한 사용자 또는 시스템 환경에서 환경 변수를 설정하여 특정사용자 또는 시스템 수준에서 변경할 수도 있습니다.

15

Java용 AWS SDK 버전 2 개발자 안내서특정 자격 증명 공급자 또는 공급자 체인 사용

기본 자격 증명 파일 위치를 재정의하려면

• AWS_CREDENTIAL_PROFILES_FILE 환경 변수를 AWS 자격 증명 파일의 위치로 설정합니다.• Linux, macOS, or Unix에서는 export를 사용합니다.

export AWS_CREDENTIAL_PROFILES_FILE=path/to/credentials_file

• Windows에서는 set을 사용합니다.

set AWS_CREDENTIAL_PROFILES_FILE=path/to/credentials_file

AWS 자격 증명 파일 형식aws configure 명령을 사용하여 AWS 자격 증명 파일을 생성하는 경우 이 명령은 다음 형식으로 파일을생성합니다.

[default]aws_access_key_id={YOUR_ACCESS_KEY_ID}aws_secret_access_key={YOUR_SECRET_ACCESS_KEY}

[profile2]aws_access_key_id={YOUR_ACCESS_KEY_ID}aws_secret_access_key={YOUR_SECRET_ACCESS_KEY}

프로필 이름은 대괄호에 지정되며(예: [default]), 그 뒤에는 해당 프로필의 구성 가능한 필드가 키-값 페어로 이어집니다. 자격 증명 파일에 여러 개의 프로파일을 정의할 수 있습니다. aws configure --profilePROFILE_NAME 을 사용하여 구성할 프로필을 선택하여 추가하거나 편집할 수 있습니다. 액세스 키와 보안액세스 키에 추가해 aws_session_token 세션을 사용하여 세션 토큰을 지정할 수 있습니다.

특정 자격 증명 공급자 또는 공급자 체인 사용클라이언트 빌더를 사용하여 기본 자격 증명 공급자 체인과 다른 자격 증명 공급자를 사용할 수 있습니다.

AWSCredentialsProvider 인터페이스를 입력으로 사용하는 클라이언트 빌더에 자격 증명 공급자나 공급자체인의 인스턴스를 제공합니다.

다음 예제는 EnvironmentVariableCredentialsProvider라는 제공된 환경 자격 증명을 사용하는 새로운 서비스클라이언트를 생성합니다.

S3Client s3 = S3Client.builder() .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) .build();

AWS SDK for Java에서 제공하는 자격 증명 공급자 및 공급자 체인의 전체 목록은AWSCredentialsProvider의 알려진 모든 구현 클래스를 참조하십시오.

Note

자격 증명 공급자 또는 AwsCredentialsProvider 인터페이스를 구현하는 자신의 자격 증명 공급자를 사용하여 생성한 공급자 체인을 제공합니다.

명시적으로 자격 증명을 제공합니다.기본 자격 증명 체인이나 특정/사용자 지정 공급자 또는 공급자 체인이 코드에서 작동하지 않는 경우 원하는 자격 증명을 제공할 수 있습니다. 이러한 자격 증명은 AWS 계정 자격 증명, IAM 자격 증명 또는 AWS

16

Java용 AWS SDK 버전 2 개발자 안내서AWS 리전 선택

Security Token Service(AWS STS)에서 가져온 임시 자격 증명일 수 있습니다. AWS STS를 사용하여 임시자격 증명을 가져온 경우 다음과 같은 방법을 사용하여 AWS 액세스용 자격 증명을 지정합니다.

Important

보안상 가급적이면 AWS 액세스용으로 AWS 계정 자격 증명 대신에 IAM 계정 자격 증명을 사용하는 것이 좋습니다. 자세한 내용은 Amazon Web Services General Reference의 AWS 보안 자격 증명을 참조하십시오.

자격 증명을 AWS 클라이언트에 명시적으로 제공하려면

1. AwsSessionCredentials와 같은 AwsCredentials 인터페이스를 제공하는 클래스를 인스턴스화합니다.연결에 사용할 AWS 액세스 키와 보안 키를 사용해 제공합니다.

2. AwsCredentials 객체를 사용하여 StaticCredentialsProvider를 생성합니다.3. StaticCredentialsProvider를 사용하여 클라이언트 빌더를 구성하고 클라이언트를 빌드합니다.

다음 예제는 사용자가 제공한 자격 증명을 사용하는 새로운 서비스 클라이언트를 생성합니다.

AwsSessionCredentials awsCreds = AwsSessionCredentials.create( "your_access_key_id_here", "your_secret_key_id_here", "your_session_token_here");

S3Client s32 = S3Client.builder() .credentialsProvider(StaticCredentialsProvider.create(awsCreds)) .build();

AWS 리전 선택리전을 통해 특정 지리적 영역에 물리적으로 상주하는 AWS 서비스에 액세스할 수 있습니다. 이는 중복성은물론, 데이터와 애플리케이션을 고객과 고객의 사용자가 액세스할 위치에 가까운 곳에서 실행 상태로 유지하는 데도 유용할 수 있습니다.

AWS SDK for Java 2.0에서는 버전 1.의 여러 리전과 관련된 클래스가 전부 하나의 리전 클래스로 축소되어있습니다. 리전에 대한 메타데이터 검색이나 특정 리전에서 서비스 사용 여부 확인 등 모든 리전 관련 작업에이 클래스를 사용할 수 있습니다.

리전 선택리전 이름을 지정할 수 있습니다. 그러면 SDK에서 적당한 엔드포인트가 자동으로 선택됩니다.

리전을 명시적으로 설정하려면 Regions 클래스에서 정의한 상수를 사용하는 것이 좋습니다. 이 열거형은 공개적으로 사용 가능한 모든 리전의 열거 값입니다. 클래스의 리전을 사용하여 클라이언트를 생성하려면 다음코드를 사용합니다.

Ec2Client ec2 = Ec2Client.builder() .region(Region.US_WEST_2) .build();

사용할 리전이 Region 클래스의 상수 중 하나가 아니라면 of 메서드를 사용해 새 리전을 생성할 수 있습니다. SDK를 업그레이드하지 않고 새 리전에 액세스 할 수 있는 기능입니다.

Region newRegion = Region.of("us-east-42");Ec2Client ec2 = Ec2Client.builder() .region(newRegion)

17

Java용 AWS SDK 버전 2 개발자 안내서특정 엔드포인트 선택

.build();

Note

빌더를 사용하여 클라이언트를 빌드한 후에는 클라이언트가 변경 불가능하며 리전을 변경할 수 없습니다. 동일 서비스에 대해 여러 AWS 리전으로 작업 중인 경우 리전당 하나씩 여러 클라이언트를생성해야 합니다.

특정 엔드포인트 선택endpointOverride 메서드를 호출하여 리전 내에서 특정 엔드포인트를 사용하도록 각 AWS 클라이언트를 구성할 수 있습니다.

예를 들어 유럽(아일랜드) 리전을 사용하도록 Amazon EC2 클라이언트를 구성하려면 다음 코드를 사용합니다.

Ec2Client ec2 = Ec2Client.builder() .region(Region.EU_WEST_1) .endpointOverride(URI.create("https://ec2.eu-west-1.amazonaws.com")) .build();

모든 AWS 서비스에 대한 최신 리전 및 해당 엔드포인트 목록은 리전 및 엔드포인트를 참조하십시오.

환경에서 AWS 리전을 자동으로 결정Amazon EC2 또는 AWS Lambda에서 실행 중인 경우 코드를 실행 중인 동일 리전을 사용하도록 클라이언트를 구성할 수 있습니다. 이렇게 하면 실행 중인 환경에서 코드가 분리되므로 애플리케이션을 여러 리전에 배포하여 지연 시간을 낮추거나 이중화를 구현할 수 있습니다.

기본 자격 증명/리전 공급자 체인을 사용하여 환경에서 리전을 결정하려면 클라이언트 빌더의 create 메서드를 사용합니다.

Ec2Client ec2 = Ec2Client.create();

region 메서드를 사용하여 리전을 명시적으로 설정하지 않는 경우 SDK에서는 기본 리전 공급자 체인을 조회하여 사용할 리전을 시도 및 결정합니다.

기본 리전 공급자 체인다음은 리전 조회 프로세스입니다.

1. 빌더 자체에 대해 region을 사용하여 설정한 명시적 리전을 다른 어떤 것보다 우선합니다.2. AWS_REGION 환경 변수를 확인합니다. 설정한 경우 클라이언트를 구성하는 데 해당 리전이 사용됩니다.

Note

이 환경 변수는 Lambda 컨테이너에 의해 설정됩니다.3. SDK는 AWS 공유 구성 파일(일반적으로 ~/.aws/config에 있음)을 확인합니다. region 속성이 있으면

SDK가 이 속성을 사용합니다.• AWS_CONFIG_FILE 환경 변수는 공유 구성 파일의 위치를 사용자 지정하는 데 사용할 수 있습니다.• AWS_PROFILE 환경 변수 또는 aws.profile 시스템 속성을 사용하여 SDK가 로드하는 프로필을 사용자

지정할 수 있습니다.4. SDK는 Amazon EC2 인스턴스 메타데이터 서비스를 사용하여 현재 실행 중인 Amazon EC2 인스턴스의

리전을 결정합니다.

18

Java용 AWS SDK 버전 2 개발자 안내서AWS 리전에서 서비스 가용성 확인

5. 이때까지도 SDK에서 여전히 리전을 찾지 못한 경우 클라이언트 생성이 실패하고 예외가 발생합니다.

AWS 애플리케이션을 개발할 때 가장 일반적인 접근 방법은 공유 구성 파일(기본 자격 증명 공급자 체인 사용 (p. 14)에 설명됨)을 사용하여 리전을 로컬 개발용으로 설정하고, 기본 리전 공급자 체인에 의존하여AWS 인프라에서 실행 중인 리전을 결정하는 것입니다. 이렇게 하면 클라이언트 생성 작업이 크게 간소화되며 애플리케이션을 이식 가능한 형태로 유지됩니다.

AWS 리전에서 서비스 가용성 확인특정 리전에서 특정 AWS 서비스를 사용할 수 있는지 알아보려면, 확인하고 싶은 서비스에서serviceMetadata 및 region 메서드를 사용합니다.

DynamoDbClient.serviceMetadata().regions().forEach(System.out::println);

지정할 수 있는 리전에 대한 Region 클래스 설명서를 참조하고, 쿼리할 서비스의 엔드포인트 접두사를 사용합니다.

클라이언트 구성AWS SDK for Java를 사용하여 기본 클라이언트 구성을 변경할 수 있습니다. 이는 HTTP 전송과 같은 설정을 지정하려는 경우에 유용할 수 있습니다. 이 단원에서는 해당 설정을 구성하는 방법에 대한 정보를 제공합니다.

주제• HTTP 전송 구성 (p. 19)• SDK 시작 시간 성능 개선 구성 (p. 20)

HTTP 전송 구성비동기 클라이언트에 대해 NettyNioAsyncHttpClient를 사용하거나 동기 클라이언트에 대해ApacheHttpClient를 사용하여 HTTP 전송 설정을 지정할 수 있습니다. 이러한 클라이언트로 설정할 수 있는전체 옵션 목록은 AWS SDK for Java 2.x Reference를 참조하십시오.

Note

Apache HTTPClient에 대한 자세한 내용은 HTTPClient 개요를 참조하십시오.

POM에서 netty-nio-client에 종속성을 추가하여 NettyNioAsyncHttpClient를 사용합니다.

POM 항목

<dependency> <artifactId>netty-nio-client</artifactId> <groupId>software.amazon.awssdk</groupId> <version>2.0.0</version> </dependency>

최대 연결 수maxConcurrency 메서드를 사용하여 허용되는 최대 열린 HTTP 연결 수를 설정할 수 있습니다.maxPendingConnectionAcquires 메서드를 통해 최대 동시성에 도달한 후 대기열에 허용되는 최대 요청을 설정할 수 있습니다.

19

Java용 AWS SDK 버전 2 개발자 안내서SDK 시작 시간 성능 개선 구성

• maxConcurrency의 기본값: 50• maxPendingConnectionAcquires의 기본값: 10_000

Important

연결 충돌과 성능 저하를 방지하기 위해 최대 연결 수를 동시 트랜잭션 수에 맞게 설정합니다.

HTTP 클라이언트 빌더를 사용하면 SDK의 수명 주기를 관리할 수 있습니다. 서비스 클라이언트가 종료되면HTTP 클라이언트가 닫힙니다.

가져오기

import software.amazon.awssdk.http.async.SdkAsyncHttpClient;import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient;import software.amazon.awssdk.services.kinesis.KinesisAsyncClient;

코드

KinesisAsyncClient client = KinesisAsyncClient.builder() .httpClientBuilder(NettyNioAsyncHttpClient.builder() .maxConcurrency(100) .maxPendingConnectionAcquires(10_000)) .build();

수명 주기를 직접 관리하려는 경우 HTTP 클라이언트를 서비스 클라이언트에 직접 전달할 수도 있습니다.

코드

SdkAsyncHttpClient httpClient = NettyNioAsyncHttpClient.builder() .maxConcurrency(100) .maxPendingConnectionAcquires(10_000) .build();

KinesisAsyncClient kinesisClient = KinesisAsyncClient.builder() .httpClient(httpClient) .build();

httpClient.close();

SDK 시작 시간 성능 개선 구성AWS SDK for Java 2.0의 개선 사항에는 Lambda의 Java 기능에 대한 SDK 시작 시간이 포함됩니다. JavaLambda 함수가 시작되어 첫 번째 요청에 응답하는 데 걸리는 시간입니다.

버전 2.x에는 이 개선 사항에 적용되는 세 가지 변경 사항이 포함되어 있습니다.

• 초기화 시간을 개선하는 직렬화 라이브러리인 jackson-jr을 사용합니다.• 날짜 및 시간 객체에 대한 java.time.libraries를 사용합니다.• 로깅 Facade에 대해 Slf4j로 전환합니다.

클라이언트 빌더에서 특정 구성 값을 설정하여 SDK 시작 시간을 추가로 늘릴 수 있습니다. 애플리케이션이초기화를 위해 찾는 정보의 양을 줄여 시작할 때 시간을 단축할 수 있습니다.

20

Java용 AWS SDK 버전 2 개발자 안내서비동기 프로그래밍

Note

이 값을 지정하면 코드의 이동성을 잃게 됩니다. 예를 들어 AWS 리전을 지정하면 코드가 수정 없이다른 리전에서 실행되지 않습니다.

예: 최소 SDK 시작 시간 클라이언트 구성

Region region = Region.US_WEST_2;3Client S3 = S3Client.builder() .region(region) .build();

비동기 프로그래밍AWS SDK for Java 2.0는 몇몇 스레드에 높은 동시성을 구현하는 비차단형 비동기식 클라이언트가 특징입니다. AWS SDK for Java 1.11.x에는 비차단형 I/O의 이점을 제공하지 않는 동기식 클라이언트를 차단하고, 스레드 풀 주변의 래퍼 역할을 하는 비동기식 클라이언트가 있습니다.

비동기 메서드는 클라이언트가 서비스로부터 응답을 받을 때까지 스레드의 실행을 차단합니다. 비동기 메서드는 (값을) 즉시 반환하며, 응답을 기다리지 않고 제어 권한을 호출 스레드에 넘겨줍니다.

비동기 메서드는 응답이 제공되기 전에 (값을) 반환하므로 준비되었을 때 응답을 가져올 방법이 필요합니다. AWS SDK for Java 2.0 비동기식 클라이언트 메서드는 준비가 되었을 때 응답에 액세스하도록 허용하는CompletableFuture 객체를 반환합니다.

비 스트리밍 작업비 스트리밍 작업에서 비동기 메서드 호출은 동기 메서드와 유사합니다. 하지만 AWS SDK for Java의 비동기 메서드는 향후 비동기 작업의 결과를 포함하는 CompletableFuture 객체를 반환합니다.

결과를 사용할 수 있을 때 완료하는 작업을 사용하여 CompletableFuture whenComplete() 메서드를호출합니다. CompletableFuture는 get() 메서드를 호출하여 응답 객체를 가져올 수 있도록 Future 인터페이스를 구현합니다.

다음은 테이블 목록을 가져오는 Amazon DynamoDB 함수를 호출하고 ListTablesResponse 객체를 포함할수 있는 CompletableFuture를 수신하는 비동기 작업의 예제입니다. 비동기식 호출이 완료된 경우에만whenComplete()에 대한 호출에서 정의한 작업을 수행할 수 있습니다.

가져오기

import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient;import software.amazon.awssdk.services.dynamodb.model.ListTablesRequest;import software.amazon.awssdk.services.dynamodb.model.ListTablesResponse;import software.amazon.awssdk.utils.FunctionalUtils;

import java.util.List;import java.util.concurrent.CompletableFuture;

코드

public class DynamoDBAsync {

public static void main(String[] args) throws InterruptedException {

21

Java용 AWS SDK 버전 2 개발자 안내서비 스트리밍 작업

// Creates a default async client with credentials and regions loaded from the environment DynamoDbAsyncClient client = DynamoDbAsyncClient.create(); CompletableFuture<ListTablesResponse> response = client.listTables(ListTablesRequest.builder() .build());

// Map the response to another CompletableFuture containing just the table names CompletableFuture<List<String>> tableNames = response.thenApply(ListTablesResponse::tableNames); // When future is complete (either successfully or in error) handle the response tableNames.whenComplete((tables, err) -> { try { if (tables != null) { tables.forEach(System.out::println); } else { // Handle error err.printStackTrace(); } } finally { // Lets the application shut down. Only close the client when you are completely done with it. client.close(); } });

tableNames.join(); }}

다음 코드 예제에서는 비동기식 클라이언트를 사용하여 테이블에서 항목을 검색하는 방법을 보여 줍니다.DynamoDbAsyncClient의 getItem 메서드를 호출하여 테이블 이름과 원하는 항목의 기본 키 값이 포함된GetItemRequest 객체를 이 메서드에 전달합니다. 일반적으로 이 방식으로 작업에 필요한 데이터를 전달합니다. 이 예에서는 문자열 값이 전달되는 것을 알 수 있습니다.

가져오기

import software.amazon.awssdk.services.dynamodb.model.GetItemRequest;import software.amazon.awssdk.services.dynamodb.model.AttributeValue;import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient;import java.util.HashMap;import java.util.Map;import java.util.Set;import java.util.stream.Collectors;import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;

코드

//Get both input argumentsString tableName = args[0];String name = args[1];System.out.format("Retrieving item \"%s\" from \"%s\"\n", name, tableName );

HashMap<String, AttributeValue> keyToGet = new HashMap<String, AttributeValue>();

keyToGet.put("Name", AttributeValue.builder().s(name).build());

try {

DynamoDbAsyncClient client = DynamoDbAsyncClient.create();

22

Java용 AWS SDK 버전 2 개발자 안내서스트리밍 작업

//Create a GetItemRequest instance GetItemRequest request = GetItemRequest.builder() .key(keyToGet) .tableName(tableName) .build();

//Invoke the DynamoDbAsyncClient object's getItem java.util.Collection<software.amazon.awssdk.services.dynamodb.model.AttributeValue> returnedItem = client.getItem(request).join().item().values();

//Convert Set to Map Map<String, AttributeValue> map = returnedItem.stream().collect(Collectors.toMap(AttributeValue::s, s->s)); Set<String> keys = map.keySet(); for (String key : keys) { System.out.format("%s: %s\n", key, map.get(key).toString()); }

} catch (DynamoDbException e) { System.err.println(e.getMessage()); System.exit(1);}

GitHub의 전체 예제를 참조하십시오.

스트리밍 작업스트리밍 작업의 경우 증분 방식으로 콘텐츠를 제공하기 위해 AsyncRequestBody를 제공하거나, 응답을 수신해 처리할 수 있도록 AsyncResponseTransformer를 제공해야 합니다.

다음 예제는 PutObject 작업을 사용하여 파일을 Amazon S3에 비동기적으로 업로드합니다.

가져오기

import software.amazon.awssdk.core.async.AsyncRequestBody;import software.amazon.awssdk.services.s3.S3AsyncClient;import software.amazon.awssdk.services.s3.model.PutObjectRequest;import software.amazon.awssdk.services.s3.model.PutObjectResponse;import software.amazon.awssdk.utils.FunctionalUtils;

import java.nio.file.Paths;import java.util.concurrent.CompletableFuture;

코드

public class S3AsyncOps {

private static final String BUCKET = "sample-bucket"; private static final String KEY = "testfile.in";

public static void main(String[] args) { S3AsyncClient client = S3AsyncClient.create(); CompletableFuture<PutObjectResponse> future = client.putObject( PutObjectRequest.builder() .bucket(BUCKET) .key(KEY) .build(), AsyncRequestBody.fromFile(Paths.get("myfile.in")) );

23

Java용 AWS SDK 버전 2 개발자 안내서스트리밍 작업

future.whenComplete((resp, err) -> { try { if (resp != null) { System.out.println("my response: " + resp); } else { // Handle error err.printStackTrace(); } } finally { // Lets the application shut down. Only close the client when you are completely done with it. client.close(); } });

future.join(); }}

다음 예제는 GetObject 작업을 사용하여 Amazon S3에서 비동기적으로 파일을 가져옵니다.

가져오기

import software.amazon.awssdk.core.async.AsyncResponseTransformer;import software.amazon.awssdk.services.s3.S3AsyncClient;import software.amazon.awssdk.services.s3.model.GetObjectRequest;import software.amazon.awssdk.services.s3.model.GetObjectResponse;import software.amazon.awssdk.utils.FunctionalUtils;

import java.nio.file.Paths;import java.util.concurrent.CompletableFuture;

코드

public class S3AsyncStreamOps {

private static final String BUCKET = "sample-bucket"; private static final String KEY = "testfile.out";

public static void main(String[] args) { S3AsyncClient client = S3AsyncClient.create(); final CompletableFuture<GetObjectResponse> futureGet = client.getObject( GetObjectRequest.builder() .bucket(BUCKET) .key(KEY) .build(), AsyncResponseTransformer.toFile(Paths.get("myfile.out"))); futureGet.whenComplete((resp, err) -> { try { if (resp != null) { System.out.println(resp); } else { // Handle error err.printStackTrace(); } } finally { // Lets the application shut down. Only close the client when you are completely done with it client.close(); } });

24

Java용 AWS SDK 버전 2 개발자 안내서고급 작업

futureGet.join(); }}

고급 작업AWS SDK for Java 2.0는 비동기식 이벤트 중심 네트워크 애플리케이션 프레임워크인 Netty를 사용하여 I/O스레드를 처리합니다. AWS SDK for Java 2.0는 Netty 뒤에 ExecutorService를 생성하여 HTTP 클라이언트 요청에서 Netty 클라이언트로 반환된 선물을 완료합니다. 이러한 추상화는 개발자가 스레드 중지 또는 대기를 선택하는 경우 애플리케이션이 비동기 프로세스를 차단하는 위험을 줄여줍니다. 기본적으로 50개 스레드가 각 비동기 클라이언트에 생성되며 ExecutorService 내의 대기열에서 관리됩니다.

고급 사용자는 빌드 시 다음 옵션을 사용하여 비동기 클라이언트를 만들 때 스레드 풀 크기를 지정할 수 있습니다.

코드

S3AsyncClient clientThread = S3AsyncClient.builder() .asyncConfiguration( b -> b.advancedOption(SdkAdvancedAsyncClientOption .FUTURE_COMPLETION_EXECUTOR, Executors.newFixedThreadPool(10) ) ) .build();

성능을 최적화하려면 자체의 스레드 풀 실행기를 관리하고 클라이언트를 구성할 때 이를 포함시킬 수 있습니다.

ThreadPoolExecutor executor = new ThreadPoolExecutor(50, 50, 10, TimeUnit.SECONDS, new LinkedBlockingQueue<>(10_000), new ThreadFactoryBuilder() .threadNamePrefix("sdk-async-response").build());

// Allow idle core threads to time outexecutor.allowCoreThreadTimeOut(true);

S3AsyncClient clientThread = S3AsyncClient.builder() .asyncConfiguration( b -> b.advancedOption(SdkAdvancedAsyncClientOption .FUTURE_COMPLETION_EXECUTOR, executor ) ) .build();

스레드 풀을 사용하고 싶지 않다면 스레드 풀 실행기 대신에 Runnable::run을 사용합니다.

S3AsyncClient clientThread = S3AsyncClient.builder() .asyncConfiguration( b -> b.advancedOption(SdkAdvancedAsyncClientOption .FUTURE_COMPLETION_EXECUTOR, Runnable::run ) ) .build();

25

Java용 AWS SDK 버전 2 개발자 안내서HTTP/2 프로그래밍

HTTP/2 프로그래밍HTTP/2는 HTTP 프로토콜의 주요 내용 개정입니다. 이 새 버전에는 성능 개선을 위한 여러 기능 향상이 있습니다.

• 이진 데이터 인코딩으로 더욱 효율적인 데이터 전송을 제공합니다.• 헤더 압축으로 클라이언트가 다운로드하는 오버헤드 바이트를 줄여 클라이언트로 더욱 빠르게 콘텐츠를

가져오는 데 도움이 됩니다. 이는 특히 이미 대역폭 제약이 있는 모바일 클라이언트에 유용합니다.• 양방향 비동기 통신(멀티플렉싱)을 통해 클라이언트와 AWS 간 여러 요청 및 응답 메시지가 여러 개의 연

결 대신 단일 연결로 동시에 전송되어 성능을 개선시킵니다.

최신 SDK로 업그레이드한 개발자는 사용하는 서비스에서 지원할 때 HTTP/2를 자동으로 사용합니다. 새로운 프로그래밍 인터페이스는 HTTP/2 기능을 원활하게 활용하게 애플리케이션을 빌드하는 새로운 방법을 제공합니다.

AWS SDK for Java 2.0에는 HTTP/2 프로토콜을 구현하는 이벤트 스트리밍에 대한 새 API가 있습니다. 이러한 새 API를 사용하는 방법에 대한 예제는 Java용 AWS SDK를 사용한 Kinesis 예제 (p. 79) 단원을 참조하십시오.

예외 처리AWS SDK for Java에서 예외가 언제 어떻게 발생하는지를 이해하는 것은 SDK를 사용하여 고품질의 애플리케이션을 빌드하는 데 있어서 중요합니다. 다음 단원에서는 SDK에서 발생하는 다양한 예외의 경우와 이러한 예외를 적절히 처리하는 방법에 대해 설명합니다.

확인되지 않은 예외가 발생하는 이유AWS SDK for Java에서는 다음과 같은 이유로 확인된 예외 대신에 실행시간 (또는 확인되지 않은) 예외를 사용합니다.

• 개발자가 중요하지 않은 예외 경우를 강제로 처리하지 않고 (또한 해당 코드를 상세 표시 모드로 설정하지않고) 처리하고자 하는 오류에 대해서만 세부적으로 제어할 수 있도록 하기 위해

• 대규모 애플리케이션에서 확인된 예외 고유의 확장성 문제를 방지하기 위해

일반적으로 확인된 예외는 소규모 애플리케이션에서 잘 작동하는 편이지만, 애플리케이션이 확장되고 복잡해짐에 따라 문제가 될 수도 있습니다.

SdkServiceException (및 관련 하위 클래스)SdkServiceException은 AWS SDK for Java 사용 시 일반적으로 발생하는 예외입니다. 이 예외는 AWS 서비스의 오류 응답을 나타냅니다. 예를 들어 존재하지 않는 Amazon EC2 인스턴스를 종료하려 할 경우 EC2는오류 응답을 반환하며 해당 오류 응답에 대한 모든 세부 정보가 발생된 SdkServiceException에 포함됩니다. 경우에 따라서는 개발자가 catch 블록을 통해 오류 경우 처리를 세부적으로 제어할 수 있도록 하기 위해 SdkServiceException의 하위 클래스가 발생하기도 합니다.

SdkServiceException이 발생하면 요청이 AWS 서비스로 전송되었지만 처리되지 못했음을 의미합니다.이는 요청의 파라미터 오류 또는 서비스 측의 문제로 인해 발생할 수 있습니다.

SdkServiceException은 다음과 같은 정보를 제공합니다.

• 반환된 HTTP 상태 코드• 반환된 AWS 오류 코드

26

Java용 AWS SDK 버전 2 개발자 안내서SdkClientException

• 서비스의 상세 오류 메시지• 실패한 요청의 AWS 요청 ID

SdkClientExceptionSdkClientException은 AWS로 요청을 전송하려 하거나 AWS의 응답을 구분 분석하려 하는 동안 Java클라이언트 코드 내부에서 문제가 발생했음을 나타냅니다. SdkClientException은 일반적으로SdkServiceException보다 더 심각하며, 클라이언트에서 AWS 서비스를 호출할 수 없게 하는 중요한 문제를 나타냅니다. 예를 들어 클라이언트 중 하나에서 작업을 호출하려 할 때 네트워크 연결을 사용할 수 없는경우AWS SDK for Java는 SdkClientException을 발생합니다.

AWS SDK for Java 호출 로깅AWS SDK for Java는Slf4j(실행 시간에 여러 로깅 시스템 중 하나를 활성화하는 추상 계층)을 사용하여 계측됩니다.

지원되는 로깅 시스템에는 Java Logging Framework와 Apache Log4j 등이 있습니다. 이 주제에서는 Log4j사용법을 보여줍니다. 애플리케이션 코드를 변경하지 않고 SDK의 로깅 기능을 사용할 수 있습니다.

Log4j에 대해 자세히 알아보려면 Apache 웹 사이트를 참조하십시오.

Log4J JAR 추가SDK에서 Log4j를 사용하려면 Log4j 웹사이트에서 Log4j JAR를 다운로드하거나, pom.xml 파일의 Log4j에종속성을 추가해 Maven을 사용합니다. SDK에는 이 JAR가 포함되지 않습니다.

Log4j 구성 파일Log4j는 log4j2.xml이라는 구성 파일을 사용합니다. 아래에는 예제 구성 파일이 나와 있습니다. 구성 파일에사용된 값에 대한 자세한 내용은 Log4j 구성에 대한 설명서를 참조하십시오.

구성 파일을 classpath의 디렉터리 중 하나에 위치시킵니다. Log4j JAR 및 log4j2.xml 파일은 동일한 디렉터리에 위치하지 않아도 됩니다.

log4j2.xml 구성 파일은 로깅 수준, 로깅 출력이 전송될 대상(예를 들면, 파일 또는 콘솔), 출력 형식 같은 속성을 지정합니다. 로깅 수준은 로거가 생성되는 출력의 세부 수준입니다. Log4j는 여러 로깅 계층의 개념을 지원합니다. 로깅 수준은 각 계층마다 독립적으로 설정됩니다. AWS SDK for Java에서는 다음과 같은 두 가지로깅 계층을 사용할 수 있습니다.

• software.amazon.awssdk• org.apache.http.wire

Classpath 설정Log4j JAR 및 log4j2.xml 파일 둘 다 classpath에 있어야 합니다. Maven의 Sl4j에 바인딩 된 log4j를 구성하려면 pom.xml에 다음을 추가하십시오.

<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId></dependency>

27

Java용 AWS SDK 버전 2 개발자 안내서서비스 관련 오류 및 경고

<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId></dependency><dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId></dependency>

Eclipse IDE를 사용 중인 경우 메뉴를 열고 Project(프로젝트) | Properties(속성) | Java Build Path(Java Build경로)로 이동하여 classpath를 설정할 수 있습니다.

서비스 관련 오류 및 경고클라이언트 라이브러리의 중요 메시지를 수집할 수 있도록 항상 "software.amazon.awssdk" 로거 계층을"WARN"으로 설정된 상태로 유지하는 것이 좋습니다. 예를 들어 Amazon S3 클라이언트가 애플리케이션이InputStream을 올바르게 닫지 않아서 리소스가 누출 중일 수 있음을 감지하는 경우 S3 클라이언트는 경고메시지를 통해 로그에 보고합니다. 또한 클라이언트에 요청 또는 응답 처리 문제가 발생하는 경우에도 메시지가 기록됩니다.

다음 log4j2.xml 파일에서는 rootLogger를 WARN으로 설정하므로 "software.amazon.awssdk"에 있는 모든 로거의 경고 및 오류가 포함됩니다. 또는 software.amazon.awssdk 로거를 WARN으로 명시적으로 설정할수도 있습니다.

<Configuration status="WARN"> <Appenders> <Console name="ConsoleAppender" target="SYSTEM_OUT"> <PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss} [%t] %-5p %c:%L - %m%n" /> </Console> </Appenders>

<Loggers> <Root level="WARN"> <AppenderRef ref="ConsoleAppender"/> </Root> <Logger name="software.amazon.awssdk" level="WARN" /> </Loggers></Configuration>

요청/응답 요약 로깅AWS 서비스에 대한 모든 요청은 AWS 서비스에서 요청을 처리하는 방식과 관련하여 문제가 발생하는 경우에 유용한 고유 AWS 요청 ID를 생성합니다. AWS 요청 ID는 실패한 서비스 호출에 대해 SDK의 Exception객체를 통해 프로그래밍 방식으로 액세스할 수 있으며, "software.amazon.awssdk.request" 로거에서DEBUG 로그 수준을 통해 보고할 수도 있습니다.

다음 log4j2.xml 파일에서는 AWS 요청 ID를 포함하여 요청 및 응답 요약을 활성화합니다.

<Configuration status="WARN"> <Appenders> <Console name="ConsoleAppender" target="SYSTEM_OUT"> <PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss} [%t] %-5p %c:%L - %m%n" /> </Console> </Appenders>

<Loggers> <Root level="WARN"> <AppenderRef ref="ConsoleAppender"/> </Root>

28

Java용 AWS SDK 버전 2 개발자 안내서상세 표시 유선 로깅

<Logger name="software.amazon.awssdk" level="WARN" /> <Logger name="software.amazon.awssdk.request" level="DEBUG" /> </Loggers></Configuration>

다음은 로그 출력의 예입니다:

2018-01-28 19:31:56 [main] DEBUG software.amazon.awssdk.request:Logger.java:78 - Sending Request: software.amazon.awssdk.http.DefaultSdkHttpFullRequest@3a80515c

상세 표시 유선 로깅경우에 따라 AWS SDK for Java에서 송/수신하는 정확한 요청 및 응답을 확인하는 것이 유용할 수 있습니다.실이 정보에 반드시 액세스해야 하는 경우에는 Apache HttpClient 로거를 통해 일시적으로 활성화할 수 있습니다. apache.http.wire 로거에서 DEBUG 수준을 활성화하면 모든 요청 및 응답 데이터에 대한 로깅이활성화됩니다.

Warning

유선 로깅은 디버깅 목적에만 사용하는 것이 좋습니다. 로그에 민감한 데이터가 될 수 있기 때문에프로덕션 환경에서는 비활성화합니다. HTTPS 호출을 포함, 암호화 없는 전체 요청이나 응답을 로그로 기록합니다. 대량 요청(예: Amazon S3로 파일 업로드)이나 응답의 경우 verbose 유선 로깅이애플리케이션 성능에 큰 영향을 줄 수도 있습니다.

다음 log4j2.xml 파일은 Apache HttpClient에서 전체 유선 로깅을 활성화시킵니다.

<Configuration status="WARN"> <Appenders> <Console name="ConsoleAppender" target="SYSTEM_OUT"> <PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss} [%t] %-5p %c:%L - %m%n" /> </Console> </Appenders>

<Loggers> <Root level="WARN"> <AppenderRef ref="ConsoleAppender"/> </Root> <Logger name="software.amazon.awssdk" level="WARN" /> <Logger name="software.amazon.awssdk.request" level="DEBUG" /> <Logger name="org.apache.http.wire" level="DEBUG" /> </Loggers></Configuration>

기본적으로 1.2를 사용하기 때문에 Apache의 유선 로깅에는 log4j-1.2-api에 대한 추가적인 Maven 종속성이필요합니다. 유선 로깅을 활성화 한 경우 pom.xml 파일에 다음을 추가합니다.

<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-1.2-api</artifactId></dependency>

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

29

Java용 AWS SDK 버전 2 개발자 안내서기본 공급자 체인 및 Amazon EC2 인스턴스 프로필

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

기본 공급자 체인 및 Amazon EC2 인스턴스 프로필애플리케이션이 create 메서드를 사용하여 AWS 클라이언트를 생성하는 경우 클라이언트는 다음 순서로기본 자격 증명 공급자 체인을 사용하여 자격 증명을 검색합니다.

1. Java 시스템 속성 aws.accessKeyId와 aws.secretKey에서2. 시스템 환경 변수 AWS_ACCESS_KEY_ID 및 AWS_SECRET_ACCESS_KEY에서3. 기본 자격 증명 파일(이 파일의 위치는 플랫폼마다 다름)에서4. Amazon ECS 환경 변수: AWS_CONTAINER_CREDENTIALS_RELATIVE_URI.5. 인스턴스 프로파일 자격 증명(EC2 인스턴스의 IAM 역할과 연결된 인스턴스 메타데이터 안에 존재함)에

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

예:

S3Client s3 = S3Client.builder() .credentialsProvider(InstanceProfileCredentialsProvider.builder().build()) .build();

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

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

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

IAM 역할을 만들려면

1. IAM 콘솔을 엽니다.2. 탐색 창에서 역할을 선택한 후 새 역할 생성을 선택합니다.3. 역할 유형 선택 페이지의 AWS Service Roles(AWS 서비스 역할)에서 Amazon EC2를 선택합니다.4. 정책 연결 페이지의 정책 목록에서 Amazon S3 Read Only Access(Amazon S3 읽기 전용 액세스)를 선

택하고, 다음 단계를 선택합니다.5. 역할 이름을 입력한 후 다음 단계를 클릭합니다. 이 이름을 기억해 두십시오.

Amazon EC2 인스턴스를 시작할 때 필요하기 때문입니다.6. [Review] 페이지에서 [Create Role]을 선택합니다.

30

Java용 AWS SDK 버전 2 개발자 안내서연습: Amazon EC2 인스턴스에서 IAM 역할 사용

EC2 인스턴스 시작과 IAM 역할 지정Amazon EC2 콘솔을 사용하여 IAM 역할로 Amazon EC2 인스턴스를 시작할 수 있습니다.

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

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

Note

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

이 IAM 및 Amazon EC2 설정에서 애플리케이션을 EC2 인스턴스로 배포하여 Amazon S3 서비스에 읽기 액세스를 할 수 있습니다.

31

Java용 AWS SDK 버전 2 개발자 안내서Amazon CloudWatch 예제

AWS SDK for Java 2.0 코드 예제이 섹션에서는 특정 사용 사례에 적용되는, AWS SDK for Java 2.0를 사용한 프로그래밍 예제를 제공합니다.

GitHub의 AWS 설명서 코드 예제 리포지토리에서 이러한 예제의 소스 코드와 다른 코드를 찾습니다.

AWS 설명서 팀이 생성을 고려할 수 있는 새 코드 예제를 제안하려면 새 요청을 생성합니다. 이 팀은 개별API 호출만 다루는 간단한 코드 조각에 비해 광범위한 시나리오 및 사용 사례를 다루는 코드를 생성하려고합니다. 지침은 GitHub의 Readme에 있는 “Proposing new code examples” 단원을 참조하십시오.

주제• AWS SDK for Java를 사용하는 CloudWatch 예제 (p. 32)• AWS SDK for Java를 사용하는 DynamoDB 예제 (p. 40)• AWS SDK for Java를 사용하는 Amazon EC2 예제 (p. 51)• AWS SDK for Java를 사용한 IAM 예제 (p. 64)• AWS SDK for Java를 사용한 Kinesis 예제 (p. 79)• AWS SDK for Java를 사용하는 예제 (p. 84)• AWS SDK for Java를 사용하는 Amazon S3 예제 (p. 87)• Amazon S3 미리 서명된 URL을 사용한 작업 (p. 97)• AWS SDK for Java를 사용하는 Amazon SQS 예제 (p. 100)• AWS SDK for Java를 사용하는 Amazon Transcribe 예제 (p. 105)• 페이지 매김 결과 검색 (p. 109)

AWS SDK for Java를 사용하는 CloudWatch 예제이 단원에서는 AWS SDK for Java 2.0를 사용한 CloudWatch 프로그래밍의 예를 제공합니다.

Important

동기식 클라이언트는 프로덕션 환경에서는 권장되지 않는 미리 보기 릴리스입니다.

Amazon CloudWatch는 Amazon Web Services(AWS) 리소스와 AWS에서 실시간으로 실행 중인 애플리케이션을 모니터링합니다. CloudWatch를 사용하여 리소스 및 애플리케이션에 대해 측정할 수 있는 변수인 지표를 수집하고 추적할 수 있습니다. CloudWatch 경보는 알림을 보내거나 정의한 규칙을 기준으로 모니터링하는 리소스를 자동으로 변경합니다.

CloudWatch에 대한 자세한 내용은 Amazon CloudWatch 사용 설명서를 참조하십시오.

다음 예제에는 각 기술을 보여주는 데 필요한 코드만 포함되어 있습니다. 전체 예제 코드는 GitHub에 있습니다. 이 위치에서 단일 소스 파일을 다운로드하거나 리포지토리를 로컬로 복사하여 모든 예제를 빌드하고 실행할 수 있습니다.

주제• CloudWatch에서 지표 가져오기 (p. 33)• 사용자 지정 지표 데이터 게시 (p. 34)• CloudWatch 경보 작업 (p. 35)

32

Java용 AWS SDK 버전 2 개발자 안내서CloudWatch에서 지표 가져오기

• CloudWatch에서 경보 작업 사용 (p. 37)• CloudWatch로 이벤트 전송 (p. 38)

CloudWatch에서 지표 가져오기지표 나열CloudWatch 지표를 나열하려면 ListMetricsRequest를 생성하고 CloudWatchClient의 listMetrics 메서드를 호출합니다. ListMetricsRequest를 사용하여 반환된 지표를 네임스페이스, 지표 이름 또는 차원을 기준으로 필터링할 수 있습니다.

Note

AWS 서비스에서 게시하는 지표 및 차원 목록은 Amazon CloudWatch User Guide의 AmazonCloudWatch 지표 및 차원 참조에서 확인할 수 있습니다.

가져오기

import software.amazon.awssdk.services.cloudwatch.CloudWatchClient;import software.amazon.awssdk.services.cloudwatch.model.ListMetricsRequest;import software.amazon.awssdk.services.cloudwatch.model.ListMetricsResponse;import software.amazon.awssdk.services.cloudwatch.model.Metric;

/** * Lists CloudWatch metrics */

코드

CloudWatchClient cw = CloudWatchClient.builder().build();

boolean done = false;String next_token = null;

while(!done) { ListMetricsResponse response;

if (next_token == null) { ListMetricsRequest request = ListMetricsRequest.builder() .namespace(namespace) .build();

response = cw.listMetrics(request); } else { ListMetricsRequest request = ListMetricsRequest.builder() .namespace(namespace) .nextToken(next_token) .build();

response = cw.listMetrics(request); }

for(Metric metric : response.metrics()) { System.out.printf( "Retrieved metric %s", metric.metricName()); System.out.println();

33

Java용 AWS SDK 버전 2 개발자 안내서사용자 지정 지표 데이터 게시

}

if(response.nextToken() == null) { done = true; } else { next_token = response.nextToken(); }}

getMetrics 메서드를 호출하면 지표가 ListMetricsResponse로 반환됩니다.

결과를 페이징할 수 있습니다. 다음 결과 배치를 검색하려면 응답 객체에서 nextToken를 호출하고 토큰 값을 사용하여 새 요청 객체를 빌드합니다. 그런 다음 새 요청을 사용해 다시 listMetrics 메서드를 호출합니다.

GitHub의 전체 예제를 참조하십시오.

추가 정보• Amazon CloudWatch API Reference의 ListMetrics

사용자 지정 지표 데이터 게시AWS 서비스는 "AWS/"로 시작하는 네임스페이스에 고유의 지표를 게시합니다. 고유의 네임스페이스("AWS/"로 시작하지 않는 경우)를 사용하여 사용자 지정 지표 데이터를 게시할 수도 있습니다.

사용자 지정 지표 데이터 게시고유한 지표 데이터를 게시하려면 PutMetricDataRequest를 사용하여 CloudWatchClient의putMetricData 메서드를 호출합니다. PutMetricDataRequest는 데이터에 사용할 사용자 지정 네임스페이스와, MetricDatum 객체의 데이터 포인트 자체에 대한 정보를 포함해야 합니다.

Note

"AWS/"로 시작하는 네임스페이스는 지정할 수 없습니다. "AWS/"로 시작하는 네임스페이스는Amazon Web Services 제품용으로 예약되어 있습니다.

가져오기

package com.example.cloudwatch;import software.amazon.awssdk.services.cloudwatch.CloudWatchClient;import software.amazon.awssdk.services.cloudwatch.model.Dimension;import software.amazon.awssdk.services.cloudwatch.model.MetricDatum;import software.amazon.awssdk.services.cloudwatch.model.PutMetricDataRequest;import software.amazon.awssdk.services.cloudwatch.model.PutMetricDataResponse;import software.amazon.awssdk.services.cloudwatch.model.StandardUnit;

코드

Double data_point = Double.parseDouble(args[0]);

CloudWatchClient cw = CloudWatchClient.builder().build();

Dimension dimension = Dimension.builder()

34

Java용 AWS SDK 버전 2 개발자 안내서CloudWatch 경보 작업

.name("UNIQUE_PAGES") .value("URLS").build();

MetricDatum datum = MetricDatum.builder() .metricName("PAGES_VISITED") .unit(StandardUnit.NONE) .value(data_point) .dimensions(dimension).build();

PutMetricDataRequest request = PutMetricDataRequest.builder() .namespace("SITE/TRAFFIC") .metricData(datum).build();

PutMetricDataResponse response = cw.putMetricData(request);

System.out.printf("Successfully put data point %f", data_point);

GitHub의 전체 예제를 참조하십시오.

추가 정보• Amazon CloudWatch User Guide의 Amazon CloudWatch 지표 사용• Amazon CloudWatch User Guide의 AWS 네임스페이스• Amazon CloudWatch API Reference의 PutMetricData

CloudWatch 경보 작업경보 만들기CloudWatch 지표에 따라 경보를 생성하려면 경보 조건이 작성된 PutMetricAlarmRequest와 함께CloudWatchClient의 putMetricAlarm 메서드를 호출합니다.

가져오기

import software.amazon.awssdk.services.cloudwatch.CloudWatchClient;import software.amazon.awssdk.services.cloudwatch.model.ComparisonOperator;import software.amazon.awssdk.services.cloudwatch.model.Dimension;import software.amazon.awssdk.services.cloudwatch.model.PutMetricAlarmRequest;import software.amazon.awssdk.services.cloudwatch.model.PutMetricAlarmResponse;import software.amazon.awssdk.services.cloudwatch.model.StandardUnit;import software.amazon.awssdk.services.cloudwatch.model.Statistic;

코드

CloudWatchClient cw = CloudWatchClient.builder().build();

Dimension dimension = Dimension.builder() .name("InstanceId") .value(instanceId).build();

PutMetricAlarmRequest request = PutMetricAlarmRequest.builder() .alarmName(alarmName) .comparisonOperator( ComparisonOperator.GREATER_THAN_THRESHOLD) .evaluationPeriods(1) .metricName("CPUUtilization") .namespace("AWS/EC2")

35

Java용 AWS SDK 버전 2 개발자 안내서CloudWatch 경보 작업

.period(60) .statistic(Statistic.AVERAGE) .threshold(70.0) .actionsEnabled(false) .alarmDescription( "Alarm when server CPU utilization exceeds 70%") .unit(StandardUnit.SECONDS) .dimensions(dimension) .build();

PutMetricAlarmResponse response = cw.putMetricAlarm(request);

GitHub의 전체 예제를 참조하십시오.

경보 나열생성한 CloudWatch 경보를 나열하려면 결과의 옵션을 설정하는 데 사용할 수 있는DescribeAlarmsRequest와 함께 CloudWatchClient의 describeAlarms 메서드를 호출합니다.

가져오기

import software.amazon.awssdk.services.cloudwatch.CloudWatchClient;import software.amazon.awssdk.services.cloudwatch.model.DescribeAlarmsRequest;import software.amazon.awssdk.services.cloudwatch.model.DescribeAlarmsResponse;import software.amazon.awssdk.services.cloudwatch.model.MetricAlarm;

코드

CloudWatchClient cw = CloudWatchClient.builder().build();

boolean done = false;String new_token = null;

while(!done) { DescribeAlarmsResponse response; if (new_token == null) { DescribeAlarmsRequest request = DescribeAlarmsRequest.builder().build(); response = cw.describeAlarms(request); } else { DescribeAlarmsRequest request = DescribeAlarmsRequest.builder() .nextToken(new_token) .build(); response = cw.describeAlarms(request); }

for(MetricAlarm alarm : response.metricAlarms()) { System.out.printf("Retrieved alarm %s", alarm.alarmName()); }

if(response.nextToken() == null) { done = true; } else { new_token = response.nextToken(); }}

describeAlarms에 의해 반환되는 DescribeAlarmsResponse에 대해 MetricAlarms를 호출하여 경보 목록을 가져올 수 있습니다.

36

Java용 AWS SDK 버전 2 개발자 안내서CloudWatch에서 경보 작업 사용

결과를 페이징할 수 있습니다. 다음 결과 배치를 검색하려면 응답 객체에서 nextToken를 호출하고 토큰 값을 사용하여 새 요청 객체를 빌드합니다. 그런 다음 새 요청을 사용해 다시 describeAlarms 메서드를 호출합니다.

Note

CloudWatchClient의 describeAlarmsForMetric 메서드를 사용하여 특정 지표의 경보를 검색할 수도 있습니다. 이 메서드의 용도는 describeAlarms와 비슷합니다.

GitHub의 전체 예제를 참조하십시오.

경보 삭제CloudWatch 경보를 삭제하려면 삭제할 경보 이름이 하나 이상 포함된 DeleteAlarmsRequest와 함께CloudWatchClient의 deleteAlarms 메서드를 호출합니다.

가져오기

import software.amazon.awssdk.services.cloudwatch.CloudWatchClient;import software.amazon.awssdk.services.cloudwatch.model.DeleteAlarmsRequest;import software.amazon.awssdk.services.cloudwatch.model.DeleteAlarmsResponse;

코드

CloudWatchClient cw = CloudWatchClient.builder().build();

DeleteAlarmsRequest request = DeleteAlarmsRequest.builder() .alarmNames(alarm_name).build();

DeleteAlarmsResponse response = cw.deleteAlarms(request);

System.out.printf("Successfully deleted alarm %s", alarm_name);

GitHub의 전체 예제를 참조하십시오.

추가 정보• Amazon CloudWatch User Guide의 Amazon CloudWatch 경보 생성• Amazon CloudWatch API Reference의 PutMetricAlarm• Amazon CloudWatch API Reference의 DescribeAlarms• Amazon CloudWatch API Reference의 DeleteAlarms

CloudWatch에서 경보 작업 사용CloudWatch 경보 작업을 사용하면 Amazon EC2 인스턴스 자동 중지, 종료, 재부팅 또는 복구 등의 작업을수행하는 경보를 생성할 수 있습니다.

Note

경보 작업은 경보를 생성 (p. 35)할 때 PutMetricAlarmRequest의 alarmActions 메서드를 사용하여 경보에 추가할 수 있습니다.

경보 작업 활성화CloudWatch 경보의 경보 작업을 활성화하려면 활성화할 작업이 있는 경보의 이름이 하나 이상 포함된EnableAlarmActionsRequest를 사용하여 CloudWatchClient의 enableAlarmActions를 호출합니다.

37

Java용 AWS SDK 버전 2 개발자 안내서CloudWatch로 이벤트 전송

가져오기

import software.amazon.awssdk.services.cloudwatch.CloudWatchClient;import software.amazon.awssdk.services.cloudwatch.model.EnableAlarmActionsRequest;import software.amazon.awssdk.services.cloudwatch.model.EnableAlarmActionsResponse;

코드

CloudWatchClient cw = CloudWatchClient.builder().build();

EnableAlarmActionsRequest request = EnableAlarmActionsRequest.builder() .alarmNames(alarm).build();

EnableAlarmActionsResponse response = cw.enableAlarmActions(request);

GitHub의 전체 예제를 참조하십시오.

경보 작업 비활성화CloudWatch 경보의 경보 작업을 비활성화하려면 비활성화할 작업이 있는 경보의 이름이 하나 이상 포함된DisableAlarmActionsRequest를 사용하여 CloudWatchClient의 disableAlarmActions를 호출합니다.

가져오기

import software.amazon.awssdk.services.cloudwatch.CloudWatchClient;import software.amazon.awssdk.services.cloudwatch.model.DisableAlarmActionsRequest;import software.amazon.awssdk.services.cloudwatch.model.DisableAlarmActionsResponse;

코드

CloudWatchClient cw = CloudWatchClient.builder().build();

DisableAlarmActionsRequest request = DisableAlarmActionsRequest.builder() .alarmNames(alarmName).build();

DisableAlarmActionsResponse response = cw.disableAlarmActions(request);

GitHub의 전체 예제를 참조하십시오.

추가 정보• Amazon CloudWatch User Guide의 인스턴스를 중지, 종료, 재부팅 또는 복구하는 경보 생성• Amazon CloudWatch API Reference의 PutMetricAlarm• Amazon CloudWatch API Reference의 EnableAlarmActions• Amazon CloudWatch API Reference의 DisableAlarmActions

CloudWatch로 이벤트 전송CloudWatch Events는 Amazon EC2 인스턴스, Lambda 함수, Kinesis 스트림, Amazon ECS 작업, StepFunctions 상태 시스템, Amazon SNS 주제, Amazon SQS 대기열 또는 기본 제공 대상에 대한 AWS 리소스의 변경 사항을 설명하며 실시간에 가까운 시스템 이벤트 스트림을 제공합니다. 단순 규칙을 사용하여 일치하는 이벤트를 검색하고 하나 이상의 대상 함수 또는 스트림으로 이를 라우팅할 수 있습니다.

38

Java용 AWS SDK 버전 2 개발자 안내서CloudWatch로 이벤트 전송

이벤트 추가사용자 지정 CloudWatch 이벤트를 추가하려면 각 이벤트의 세부 정보를 제공하는 PutEventsRequestEntry객체가 하나 이상 포함된 PutEventsRequest 객체를 사용하여 CloudWatchEventsClient의 putEvents 메서드를 호출합니다. 이벤트 유형 및 소스, 이벤트와 연결된 리소스 등 입력 항목에 대한 여러 파라미터를 지정할 수 있습니다.

Note

putEvents 호출당 최대 10개 이벤트를 지정할 수 있습니다.

가져오기

import software.amazon.awssdk.services.cloudwatchevents.CloudWatchEventsClient;import software.amazon.awssdk.services.cloudwatchevents.model.PutEventsRequest;import software.amazon.awssdk.services.cloudwatchevents.model.PutEventsRequestEntry;import software.amazon.awssdk.services.cloudwatchevents.model.PutEventsResponse;

코드

CloudWatchEventsClient cwe = CloudWatchEventsClient.builder().build();

final String EVENT_DETAILS = "{ \"key1\": \"value1\", \"key2\": \"value2\" }";

PutEventsRequestEntry request_entry = PutEventsRequestEntry.builder() .detail(EVENT_DETAILS) .detailType("sampleSubmitted") .resources(resource_arn) .source("aws-sdk-java-cloudwatch-example").build();

PutEventsRequest request = PutEventsRequest.builder() .entries(request_entry).build();

PutEventsResponse response = cwe.putEvents(request);

GitHub의 전체 예제를 참조하십시오.

규칙 추가규칙을 생성하거나 업데이트하려면 규칙 이름과 이벤트 패턴, 규칙에 연결할 IAM 역할 및 규칙실행 빈도를 설명하는 예약 표현식 등의 선택적 파라미터가 포함된 PutRuleRequest를 사용하여CloudWatchEventsClient의 putRule 메서드를 호출합니다.

가져오기

import software.amazon.awssdk.services.cloudwatchevents.CloudWatchEventsClient;import software.amazon.awssdk.services.cloudwatchevents.model.PutRuleRequest;import software.amazon.awssdk.services.cloudwatchevents.model.PutRuleResponse;import software.amazon.awssdk.services.cloudwatchevents.model.RuleState;

코드

CloudWatchEventsClient cwe = CloudWatchEventsClient.builder().build();

PutRuleRequest request = PutRuleRequest.builder() .name(rule_name) .roleArn(role_arn)

39

Java용 AWS SDK 버전 2 개발자 안내서Amazon DynamoDB 예제

.scheduleExpression("rate(5 minutes)") .state(RuleState.ENABLED) .build();

PutRuleResponse response = cwe.putRule(request);

GitHub의 전체 예제를 참조하십시오.

대상 추가대상은 규칙이 트리거될 때 호출되는 리소스입니다. 대상의 예로는 Amazon EC2 인스턴스, Lambda 함수,Kinesis 스트림, Amazon ECS 작업, Step Functions 상태 시스템 및 기본 제공 대상이 있습니다.

규칙에 대상을 추가하려면 업데이트할 규칙과 규칙에 추가할 대상 목록이 포함된 PutTargetsRequest를 사용하여 CloudWatchEventsClient의 putTargets 메서드를 호출합니다.

가져오기

import software.amazon.awssdk.services.cloudwatchevents.CloudWatchEventsClient;import software.amazon.awssdk.services.cloudwatchevents.model.PutTargetsRequest;import software.amazon.awssdk.services.cloudwatchevents.model.PutTargetsResponse;import software.amazon.awssdk.services.cloudwatchevents.model.Target;

코드

CloudWatchEventsClient cwe = CloudWatchEventsClient.builder().build();

Target target = Target.builder() .arn(function_arn) .id(target_id) .build();

PutTargetsRequest request = PutTargetsRequest.builder() .targets(target) .rule(rule_name) .build();

PutTargetsResponse response = cwe.putTargets(request);

GitHub의 전체 예제를 참조하십시오.

추가 정보• Amazon CloudWatch Events User Guide의 PutEvents를 통한 이벤트 추가• Amazon CloudWatch Events User Guide의 규칙에 대한 예약 표현식• Amazon CloudWatch Events User Guide의 CloudWatch 이벤트의 이벤트 유형• Amazon CloudWatch Events User Guide의 이벤트 및 이벤트 패턴• Amazon CloudWatch Events API Reference의 PutEvents• Amazon CloudWatch Events API Reference의 PutTargets• Amazon CloudWatch Events API Reference의 PutRule

AWS SDK for Java를 사용하는 DynamoDB 예제이 단원에서는 AWS SDK for Java 2.0를 사용한 DynamoDB 프로그래밍의 예를 제공합니다.

40

Java용 AWS SDK 버전 2 개발자 안내서DynamoDB의 테이블 작업

Important

동기식 클라이언트는 프로덕션 환경에서는 권장되지 않는 미리 보기 릴리스입니다.

다음 예제에는 각 기술을 보여주는 데 필요한 코드만 포함되어 있습니다. 전체 예제 코드는 GitHub에 있습니다. 이 위치에서 단일 소스 파일을 다운로드하거나 리포지토리를 로컬로 복사하여 모든 예제를 빌드하고 실행할 수 있습니다.

주제• DynamoDB의 테이블 작업 (p. 41)• DynamoDB의 항목 작업 (p. 47)

DynamoDB의 테이블 작업테이블은 DynamoDB 데이터베이스에 있는 모든 항목의 컨테이너입니다. DynamoDB에 데이터를 추가하거나 삭제하기 전에 먼저 테이블을 만들어야 합니다.

각 테이블마다 다음을 정의해야 합니다.

• 계정 및 리전에 고유한 테이블 이름• 모든 값이 고유한 기본 키. 테이블의 두 항목에 동일한 기본 키 값을 지정할 수 없습니다.

기본 키는 단일 파티션(HASH) 키로 이루어진 단순형이거나, 파티션과 정렬(RANGE) 키로 이루어진 복합형일 수 있습니다.

각 키 값에는 ScalarAttributeType 클래스에 의해 열거되는 데이터 형식이 연결되어 있습니다. 키 값은 이진(B), 숫자(N) 또는 문자열(S)일 수 있습니다. 자세한 내용은 Amazon DynamoDB Developer Guide의 이름 지정 규칙 및 데이터 형식을 참조하십시오.

• 프로비저닝된 처리량은 테이블에 예약된 읽기/쓰기 용량 단위 수를 정의하는 값입니다.

Note

Amazon DynamoDB 요금은 테이블에 대해 설정하는 프로비저닝된 처리량 값에 기초하므로 테이블에 필요한 만큼의 용량만 예약하십시오.언제라도 테이블의 프로비저닝된 처리량을 수정할 수 있으므로 변경이 필요할 경우 용량을 조정할 수 있습니다.

테이블 생성DynamoDbClient의 createTable 메서드를 사용하여 새 DynamoDB 테이블을 만듭니다. 테이블 속성과 테이블 스키마를 구성해야 하며, 이 두 가지 요소 모두 테이블의 기본 키를 식별하는 데 사용됩니다. 또한 프로비저닝된 초기 처리량 값과 테이블 이름도 지정해야 합니다.

Note

선택한 이름의 테이블이 이미 있는 경우 DynamoDbException이 발생합니다.

가져오기

import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;import software.amazon.awssdk.services.dynamodb.DynamoDbClient;import software.amazon.awssdk.services.dynamodb.model.AttributeDefinition;import software.amazon.awssdk.services.dynamodb.model.CreateTableRequest;import software.amazon.awssdk.services.dynamodb.model.CreateTableResponse;import software.amazon.awssdk.services.dynamodb.model.KeySchemaElement;import software.amazon.awssdk.services.dynamodb.model.KeyType;

41

Java용 AWS SDK 버전 2 개발자 안내서DynamoDB의 테이블 작업

import software.amazon.awssdk.services.dynamodb.model.ProvisionedThroughput;import software.amazon.awssdk.services.dynamodb.model.ScalarAttributeType;

단순형 기본 키를 사용하여 테이블 생성

이 코드는 단순형 기본 키("Name")를 사용하여 테이블을 만듭니다.

코드

CreateTableRequest request = CreateTableRequest.builder() .attributeDefinitions(AttributeDefinition.builder() .attributeName("Name") .attributeType(ScalarAttributeType.S) .build()) .keySchema(KeySchemaElement.builder() .attributeName("Name") .keyType(KeyType.HASH) .build()) .provisionedThroughput(ProvisionedThroughput.builder() .readCapacityUnits(new Long(10)) .writeCapacityUnits(new Long(10)) .build()) .tableName(table_name) .build();

DynamoDbClient ddb = DynamoDbClient.create();

try { CreateTableResponse response = ddb.createTable(request); System.out.println(response.tableDescription().tableName());} catch (DynamoDbException e) { System.err.println(e.getMessage()); System.exit(1);}

GitHub의 전체 예제를 참조하십시오.

복합형 기본 키를 사용하여 테이블 생성

다른 AttributeDefinition 및 KeySchemaElement를 CreateTableRequest에 추가합니다.

가져오기

import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;import software.amazon.awssdk.services.dynamodb.model.AttributeDefinition;import software.amazon.awssdk.services.dynamodb.model.CreateTableRequest;import software.amazon.awssdk.services.dynamodb.model.CreateTableResponse;import software.amazon.awssdk.services.dynamodb.model.KeySchemaElement;import software.amazon.awssdk.services.dynamodb.model.KeyType;import software.amazon.awssdk.services.dynamodb.model.ProvisionedThroughput;import software.amazon.awssdk.services.dynamodb.model.ScalarAttributeType;

import software.amazon.awssdk.services.dynamodb.DynamoDbClient;import software.amazon.awssdk.services.dynamodb.model.CreateTableRequest;

코드

CreateTableRequest request = CreateTableRequest.builder()

42

Java용 AWS SDK 버전 2 개발자 안내서DynamoDB의 테이블 작업

.attributeDefinitions( AttributeDefinition.builder() .attributeName("Language") .attributeType(ScalarAttributeType.S) .build(), AttributeDefinition.builder() .attributeName("Greeting") .attributeType(ScalarAttributeType.S) .build()) .keySchema( KeySchemaElement.builder() .attributeName("Language") .keyType(KeyType.HASH) .build(), KeySchemaElement.builder() .attributeName("Greeting") .keyType(KeyType.RANGE) .build()) .provisionedThroughput( ProvisionedThroughput.builder() .readCapacityUnits(new Long(10)) .writeCapacityUnits(new Long(10)).build()) .tableName(table_name) .build();

DynamoDbClient ddb = DynamoDbClient.create();

try { CreateTableResponse result = ddb.createTable(request);} catch (DynamoDbException e) { System.err.println(e.getMessage()); System.exit(1);}

GitHub의 전체 예제를 참조하십시오.

테이블 나열DynamoDbClient의 listTables 메서드를 호출하여 특정 리전의 테이블을 나열할 수 있습니다.

Note

계정 및 리전에 대해 이름이 지정된 테이블이 없으면 ResourceNotFoundException이 발생합니다.

가져오기

import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;import software.amazon.awssdk.services.dynamodb.model.ListTablesResponse;import software.amazon.awssdk.services.dynamodb.model.ListTablesRequest;import software.amazon.awssdk.services.dynamodb.DynamoDbClient;

import java.util.List;

코드

DynamoDbClient ddb = DynamoDbClient.create();

boolean more_tables = true;String last_name = null;

while(more_tables) {

43

Java용 AWS SDK 버전 2 개발자 안내서DynamoDB의 테이블 작업

try { ListTablesResponse response = null; if (last_name == null) { ListTablesRequest request = ListTablesRequest.builder().build(); response = ddb.listTables(request); } else { ListTablesRequest request = ListTablesRequest.builder() .exclusiveStartTableName(last_name).build(); response = ddb.listTables(request); }

List<String> table_names = response.tableNames();

if (table_names.size() > 0) { for (String cur_name : table_names) { System.out.format("* %s\n", cur_name); } } else { System.out.println("No tables found!"); System.exit(0); }

last_name = response.lastEvaluatedTableName(); if (last_name == null) { more_tables = false; } } catch (DynamoDbException e) { System.err.println(e.getMessage()); System.exit(1); }}

기본적으로 호출당 최대 100개의 테이블이 반환됩니다. 반환된 ListTablesResponse 객체에lastEvaluatedTableName을 사용하여 마지막으로 평가된 테이블을 가져옵니다. 이 값을 사용하여 이전목록의 마지막으로 반환된 값 다음에 이어지는 목록을 시작할 수 있습니다.

GitHub의 전체 예제를 참조하십시오.

테이블 설명(테이블에 대한 정보 가져오기)DynamoDbClient의 describeTable 메서드를 호출합니다.

Note

계정 및 리전에 대해 이름이 지정된 테이블이 없으면 ResourceNotFoundException이 발생합니다.

가져오기

import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;import software.amazon.awssdk.services.dynamodb.DynamoDbClient;import software.amazon.awssdk.services.dynamodb.model.AttributeDefinition;import software.amazon.awssdk.services.dynamodb.model.DescribeTableRequest;import software.amazon.awssdk.services.dynamodb.model.ProvisionedThroughputDescription;import software.amazon.awssdk.services.dynamodb.model.TableDescription;import java.util.List;

코드

DynamoDbClient ddb = DynamoDbClient.create();

44

Java용 AWS SDK 버전 2 개발자 안내서DynamoDB의 테이블 작업

DescribeTableRequest request = DescribeTableRequest.builder() .tableName(table_name) .build();

try { TableDescription table_info = ddb.describeTable(request).table();

if (table_info != null) { System.out.format("Table name : %s\n", table_info.tableName()); System.out.format("Table ARN : %s\n", table_info.tableArn()); System.out.format("Status : %s\n", table_info.tableStatus()); System.out.format("Item count : %d\n", table_info.itemCount().longValue()); System.out.format("Size (bytes): %d\n", table_info.tableSizeBytes().longValue());

ProvisionedThroughputDescription throughput_info = table_info.provisionedThroughput(); System.out.println("Throughput"); System.out.format(" Read Capacity : %d\n", throughput_info.readCapacityUnits().longValue()); System.out.format(" Write Capacity: %d\n", throughput_info.writeCapacityUnits().longValue());

List<AttributeDefinition> attributes = table_info.attributeDefinitions(); System.out.println("Attributes"); for (AttributeDefinition a : attributes) { System.out.format(" %s (%s)\n", a.attributeName(), a.attributeType()); } }} catch (DynamoDbException e) { System.err.println(e.getMessage()); System.exit(1);}

GitHub의 전체 예제를 참조하십시오.

테이블 수정(업데이트)언제라도 DynamoDbClient의 updateTable 메서드를 호출하여 테이블의 프로비저닝된 처리량 값을 수정할 수 있습니다.

Note

계정 및 리전에 대해 이름이 지정된 테이블이 없으면 ResourceNotFoundException이 발생합니다.

가져오기

import software.amazon.awssdk.services.dynamodb.model.ProvisionedThroughput;import software.amazon.awssdk.services.dynamodb.DynamoDbClient;import software.amazon.awssdk.services.dynamodb.model.QueryRequest;import software.amazon.awssdk.services.dynamodb.model.UpdateTableRequest;

import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;

코드

45

Java용 AWS SDK 버전 2 개발자 안내서DynamoDB의 테이블 작업

ProvisionedThroughput table_throughput = ProvisionedThroughput.builder() .readCapacityUnits(read_capacity) .writeCapacityUnits(write_capacity) .build();

DynamoDbClient ddb = DynamoDbClient.create();

UpdateTableRequest request = UpdateTableRequest.builder() .provisionedThroughput(table_throughput) .tableName(table_name) .build();

try { ddb.updateTable(request);} catch (DynamoDbException e) { System.err.println(e.getMessage()); System.exit(1);}

GitHub의 전체 예제를 참조하십시오.

테이블 삭제DynamoDbClient의 deleteTable 메서드를 호출하여 테이블 이름을 전달합니다.

Note

계정 및 리전에 대해 이름이 지정된 테이블이 없으면 ResourceNotFoundException이 발생합니다.

가져오기

import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;

import software.amazon.awssdk.services.dynamodb.DynamoDbClient;import software.amazon.awssdk.services.dynamodb.model.DeleteTableRequest;

코드

DynamoDbClient ddb = DynamoDbClient.create();

DeleteTableRequest request = DeleteTableRequest.builder() .tableName(table_name) .build();

try { ddb.deleteTable(request);} catch (DynamoDbException e) { System.err.println(e.getMessage()); System.exit(1);}

GitHub의 전체 예제를 참조하십시오.

추가 정보• Amazon DynamoDB Developer Guide의 테이블 작업 지침• Amazon DynamoDB Developer Guide의 DynamoDB의 테이블 작업

46

Java용 AWS SDK 버전 2 개발자 안내서DynamoDB의 항목 작업

DynamoDB의 항목 작업DynamoDB에서 항목은 각각 이름과 값이 있는 속성의 모음입니다. 속성 값은 스칼라, 세트 또는 문서 유형일수 있습니다. 자세한 내용은 Amazon DynamoDB Developer Guide의 이름 지정 규칙 및 데이터 형식을 참조하십시오.

테이블에서 항목 검색(가져오기)DynamoDbClient의 getItem 메서드를 호출하여 테이블 이름과 원하는 항목의 기본 키 값이 포함된GetItemRequest 객체를 이 메서드에 전달합니다. GetItemResponse 객체와 해당되는 모든 속성을 반환합니다. GetItemRequest에서 프로젝션 표현식을 하나 이상 지정해 특정 속성을 검색할 수 있습니다.

반환된 GetItemResponse 객체의 item() 메서드를 사용하여 해당 항목과 연결된 키/값(AttributeValue) 페어의 맵(문자열)을 가져옵니다.

가져오기

import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;import software.amazon.awssdk.services.dynamodb.DynamoDbClient;import software.amazon.awssdk.services.dynamodb.model.AttributeValue;import software.amazon.awssdk.services.dynamodb.model.GetItemRequest;import java.util.HashMap;import java.util.Map;import java.util.Set;

코드

HashMap<String,AttributeValue> key_to_get = new HashMap<String,AttributeValue>();

key_to_get.put("Name", AttributeValue.builder() .s(name).build());

GetItemRequest request = null;if (projection_expression != null) { request = GetItemRequest.builder() .key(key_to_get) .tableName(table_name) .projectionExpression(projection_expression) .build();} else { request = GetItemRequest.builder() .key(key_to_get) .tableName(table_name) .build();}

DynamoDbClient ddb = DynamoDbClient.create();

try { Map<String,AttributeValue> returned_item = ddb.getItem(request).item(); if (returned_item != null) { Set<String> keys = returned_item.keySet(); for (String key : keys) { System.out.format("%s: %s\n", key, returned_item.get(key).toString()); } } else { System.out.format("No item found with the key %s!\n", name);

47

Java용 AWS SDK 버전 2 개발자 안내서DynamoDB의 항목 작업

}} catch (DynamoDbException e) { System.err.println(e.getMessage()); System.exit(1);}

GitHub의 전체 예제를 참조하십시오.

비동기 클라이언트를 사용하여 테이블에서 항목 검색(가져오기)DynamoDbAsyncClient의 getItem 메서드를 호출하여 테이블 이름과 원하는 항목의 기본 키 값이 포함된GetItemRequest 객체를 이 메서드에 전달합니다.

해당 항목에 대한 모든 속성이 포함된 Collection 인스턴스를 반환할 수 있습니다(다음 예제 참조).

가져오기

import software.amazon.awssdk.services.dynamodb.model.GetItemRequest;import software.amazon.awssdk.services.dynamodb.model.AttributeValue;import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient;import java.util.HashMap;import java.util.Map;import java.util.Set;import java.util.stream.Collectors;import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;

코드

//Get both input argumentsString tableName = args[0];String name = args[1];System.out.format("Retrieving item \"%s\" from \"%s\"\n", name, tableName );

HashMap<String, AttributeValue> keyToGet = new HashMap<String, AttributeValue>();

keyToGet.put("Name", AttributeValue.builder().s(name).build());

try {

DynamoDbAsyncClient client = DynamoDbAsyncClient.create();

//Create a GetItemRequest instance GetItemRequest request = GetItemRequest.builder() .key(keyToGet) .tableName(tableName) .build();

//Invoke the DynamoDbAsyncClient object's getItem java.util.Collection<software.amazon.awssdk.services.dynamodb.model.AttributeValue> returnedItem = client.getItem(request).join().item().values();

//Convert Set to Map Map<String, AttributeValue> map = returnedItem.stream().collect(Collectors.toMap(AttributeValue::s, s->s)); Set<String> keys = map.keySet(); for (String key : keys) { System.out.format("%s: %s\n", key, map.get(key).toString()); }

} catch (DynamoDbException e) {

48

Java용 AWS SDK 버전 2 개발자 안내서DynamoDB의 항목 작업

System.err.println(e.getMessage()); System.exit(1);}

GitHub의 전체 예제를 참조하십시오.

테이블에 새 항목 추가항목의 속성을 나타내는 키-값 페어의 맵을 생성합니다. 여기에는 테이블의 기본 키 필드 값이 포함되어야 합니다. 기본 키로 식별되는 항목이 이미 존재하면 필드가 요청에 따라 업데이트됩니다.

Note

계정 및 리전에 대해 이름이 지정된 테이블이 없으면 ResourceNotFoundException이 발생합니다.

가져오기

import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;import software.amazon.awssdk.services.dynamodb.DynamoDbClient;import software.amazon.awssdk.services.dynamodb.model.AttributeValue;import software.amazon.awssdk.services.dynamodb.model.PutItemRequest;import software.amazon.awssdk.services.dynamodb.model.ResourceNotFoundException;import java.util.ArrayList;import java.util.HashMap;

코드

HashMap<String,AttributeValue> item_values = new HashMap<String,AttributeValue>();

item_values.put("Name", AttributeValue.builder().s(name).build());

for (String[] field : extra_fields) { item_values.put(field[0], AttributeValue.builder().s(field[1]).build());}

DynamoDbClient ddb = DynamoDbClient.create();PutItemRequest request = PutItemRequest.builder() .tableName(table_name) .item(item_values) .build();

try { ddb.putItem(request);} catch (ResourceNotFoundException e) { System.err.format("Error: The table \"%s\" can't be found.\n", table_name); System.err.println("Be sure that it exists and that you've typed its name correctly!"); System.exit(1);} catch (DynamoDbException e) { System.err.println(e.getMessage()); System.exit(1);}

GitHub의 전체 예제를 참조하십시오.

테이블의 기존 항목 업데이트DynamoDbClient의 updateItem 메서드를 사용하여 테이블 이름, 기본 키 값 및 업데이트할 필드 맵을 지정함으로써 테이블에 이미 존재하는 항목의 속성을 업데이트할 수 있습니다.

49

Java용 AWS SDK 버전 2 개발자 안내서DynamoDB의 항목 작업

Note

해당 계정 및 리전에 대해 이름이 지정된 테이블이 없거나 전달한 기본 키로 식별되는 항목이 없으면 ResourceNotFoundException이 발생합니다.

가져오기

import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;import software.amazon.awssdk.services.dynamodb.model.AttributeAction;import software.amazon.awssdk.services.dynamodb.model.AttributeValue;import software.amazon.awssdk.services.dynamodb.model.AttributeValueUpdate;import software.amazon.awssdk.services.dynamodb.model.ResourceNotFoundException;import software.amazon.awssdk.services.dynamodb.model.UpdateItemRequest;import software.amazon.awssdk.services.dynamodb.DynamoDbClient;

import java.util.ArrayList;import java.util.HashMap;

코드

System.out.format("Updating \"%s\" in %s\n", name, table_name);if (extra_fields.size() > 0) { System.out.println("Additional fields:"); for (String[] field : extra_fields) { System.out.format(" %s: %s\n", field[0], field[1]); }}

HashMap<String,AttributeValue> item_key = new HashMap<String,AttributeValue>();

item_key.put("Name", AttributeValue.builder().s(name).build());

HashMap<String,AttributeValueUpdate> updated_values = new HashMap<String,AttributeValueUpdate>();

for (String[] field : extra_fields) { updated_values.put(field[0], AttributeValueUpdate.builder() .value(AttributeValue.builder().s(field[1]).build()) .action(AttributeAction.PUT) .build());}

UpdateItemRequest request = UpdateItemRequest.builder() .tableName(table_name) .key(item_key) .attributeUpdates(updated_values) .build();

DynamoDbClient ddb = DynamoDbClient.create();

try { ddb.updateItem(request);} catch (ResourceNotFoundException e) { System.err.println(e.getMessage()); System.exit(1);} catch (DynamoDbException e) { System.err.println(e.getMessage()); System.exit(1);}

GitHub의 전체 예제를 참조하십시오.

50

Java용 AWS SDK 버전 2 개발자 안내서Amazon EC2 예제

테이블의 기존 항목 삭제DynamoDbClient의 deleteItem 메서드를 사용하고 기본 키 값 및 테이블 이름을 지정하여 테이블에 있는항목을 삭제할 수 있습니다.

Note

해당 계정 및 리전에 대해 이름이 지정된 테이블이 없거나 전달한 기본 키로 식별되는 항목이 없으면 ResourceNotFoundException이 발생합니다.

가져오기

import software.amazon.awssdk.services.dynamodb.model.AttributeValue;import software.amazon.awssdk.services.dynamodb.model.DeleteItemRequest;import software.amazon.awssdk.services.dynamodb.model.DeleteItemResponse;import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient;import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;import java.util.HashMap;

코드

HashMap<String,AttributeValue> key_to_get = new HashMap<String,AttributeValue>();

key_to_get.put("Name", AttributeValue.builder() .s(name) .build());

DeleteItemRequest deleteReq = DeleteItemRequest.builder() .tableName(table_name) .key(key_to_get) .build();

DynamoDbAsyncClient ddb = DynamoDbAsyncClient.create();

try { ddb.deleteItem(deleteReq);} catch (DynamoDbException e) { System.err.println(e.getMessage()); System.exit(1);}

GitHub의 전체 예제를 참조하십시오.

추가 정보• Amazon DynamoDB Developer Guide의 항목 작업 지침• Amazon DynamoDB Developer Guide의 DynamoDB의 항목 작업

AWS SDK for Java를 사용하는 Amazon EC2 예제이 단원에서는 AWS SDK for Java 2.0를 사용한 Amazon EC2 프로그래밍의 예를 제공합니다.

주제• Amazon EC2 인스턴스 관리 (p. 52)

51

Java용 AWS SDK 버전 2 개발자 안내서Amazon EC2 인스턴스 관리

• Amazon EC2에서 탄력적 IP 주소 사용 (p. 56)• 리전 및 가용 영역 사용 (p. 58)• Amazon EC2 키 페어 작업 (p. 60)• Amazon EC2의 보안 그룹 작업 (p. 62)

Amazon EC2 인스턴스 관리인스턴스 생성Ec2Client의 runInstances 메서드를 호출하고, 사용할 Amazon Machine Image(AMI) 및 인스턴스 유형을포함하는 RunInstancesRequest를 이 메서드에 제공하여 새로운 Amazon EC2 인스턴스를 생성합니다.

가져오기

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.InstanceType;import software.amazon.awssdk.services.ec2.model.RunInstancesRequest;import software.amazon.awssdk.services.ec2.model.RunInstancesResponse;import software.amazon.awssdk.services.ec2.model.Tag;import software.amazon.awssdk.services.ec2.model.CreateTagsRequest;import software.amazon.awssdk.services.ec2.model.Ec2Exception;

코드

Ec2Client ec2 = Ec2Client.create();

RunInstancesRequest run_request = RunInstancesRequest.builder() .imageId(ami_id) .instanceType(InstanceType.T1_MICRO) .maxCount(1) .minCount(1) .build();

RunInstancesResponse response = ec2.runInstances(run_request);

String instance_id = response.instances().get(0).instanceId();

Tag tag = Tag.builder() .key("Name") .value(name) .build();

CreateTagsRequest tag_request = CreateTagsRequest.builder() .resources(instance_id) .tags(tag) .build();

try { ec2.createTags(tag_request);

System.out.printf( "Successfully started EC2 instance %s based on AMI %s", instance_id, ami_id);}catch (Ec2Exception e) { System.err.println(e.getMessage()); System.exit(1);

52

Java용 AWS SDK 버전 2 개발자 안내서Amazon EC2 인스턴스 관리

}

GitHub의 전체 예제를 참조하십시오.

인스턴스 시작하기Amazon EC2 인스턴스를 시작하려면 Ec2Client의 startInstances 메서드를 호출하고 시작할 인스턴스의 ID가 포함된 StartInstancesRequest를 이 메서드에 제공합니다.

가져오기

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.StartInstancesRequest;import software.amazon.awssdk.services.ec2.model.StopInstancesRequest;

코드

Ec2Client ec2 = Ec2Client.create();

StartInstancesRequest request = StartInstancesRequest.builder() .instanceIds(instance_id).build();

ec2.startInstances(request);

GitHub의 전체 예제를 참조하십시오.

인스턴스 중지Amazon EC2 인스턴스를 중지하려면 Ec2Client의 stopInstances 메서드를 호출하고, 중지할 인스턴스의ID가 포함된 StopInstancesRequest를 이 메서드에 제공합니다.

가져오기

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.StartInstancesRequest;import software.amazon.awssdk.services.ec2.model.StopInstancesRequest;

코드

Ec2Client ec2 = Ec2Client.create();

StopInstancesRequest request = StopInstancesRequest.builder() .instanceIds(instance_id).build();

ec2.stopInstances(request);

GitHub의 전체 예제를 참조하십시오.

인스턴스 재부팅Amazon EC2 인스턴스를 재부팅하려면 Ec2Client의 rebootInstances 메서드를 호출하고, 재부팅할 인스턴스의 ID가 포함된 RebootInstancesRequest를 이 메서드에 제공합니다.

가져오기

53

Java용 AWS SDK 버전 2 개발자 안내서Amazon EC2 인스턴스 관리

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.RebootInstancesRequest;import software.amazon.awssdk.services.ec2.model.RebootInstancesResponse;

코드

Ec2Client ec2 = Ec2Client.create();

RebootInstancesRequest request = RebootInstancesRequest.builder() .instanceIds(instance_id).build();

RebootInstancesResponse response = ec2.rebootInstances(request);

GitHub의 전체 예제를 참조하십시오.

인스턴스 설명인스턴스를 나열하려면 DescribeInstancesRequest를 생성하고 Ec2Client의 describeInstances메서드를 호출합니다. 그러면 계정 및 리전의 Amazon EC2 인스턴스를 나열하는 데 사용할 수 있는DescribeInstancesResponse 객체가 반환됩니다.

인스턴스는 예약별로 그룹화됩니다. 각 예약은 인스턴스를 시작하는 startInstances 호출에 해당합니다.인스턴스를 나열하려면 먼저 DescribeInstancesResponse 클래스의 reservations 메서드를 호출한후 반환된 각각의 Reservation 객체에서 instances를 호출해야 합니다.

가져오기

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.DescribeInstancesRequest;import software.amazon.awssdk.services.ec2.model.DescribeInstancesResponse;import software.amazon.awssdk.services.ec2.model.Instance;import software.amazon.awssdk.services.ec2.model.Reservation;

코드

String nextToken = null;do { DescribeInstancesRequest request = DescribeInstancesRequest.builder().maxResults(6).nextToken(nextToken).build(); DescribeInstancesResponse response = ec2.describeInstances(request);

for (Reservation reservation : response.reservations()) { for (Instance instance : reservation.instances()) { System.out.printf( "Found reservation with id %s, " + "AMI %s, " + "type %s, " + "state %s " + "and monitoring state %s", instance.instanceId(), instance.imageId(), instance.instanceType(), instance.state().name(), instance.monitoring().state()); System.out.println("");

54

Java용 AWS SDK 버전 2 개발자 안내서Amazon EC2 인스턴스 관리

} } nextToken = response.nextToken();

} while (nextToken != null);

결과가 페이징됩니다. 결과 객체의 nextToken 메서드에서 반환된 값을 새 요청 객체의 nextToken 메서드에 전달하고 다음 번 describeInstances 호출의 새 요청 객체를 사용함으로써 추가 결과를 가져올 수 있습니다.

GitHub의 전체 예제를 참조하십시오.

인스턴스 모니터링CPU와 네트워크 사용률, 사용 가능한 메모리 및 남은 디스크 공간 등 Amazon EC2 인스턴스의 다양한 측면을 모니터링할 수 있습니다. 인스턴스 모니터링에 대한 자세한 내용은 Amazon EC2 User Guide for LinuxInstances의 Amazon EC2 모니터링을 참조하십시오.

인스턴스 모니터링을 시작하려면 모니터링할 인스턴스의 ID로 MonitorInstancesRequest를 생성하고Ec2Client의 monitorInstances 메서드에 전달해야 합니다.

가져오기

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.MonitorInstancesRequest;import software.amazon.awssdk.services.ec2.model.UnmonitorInstancesRequest;

코드

Ec2Client ec2 = Ec2Client.create();

MonitorInstancesRequest request = MonitorInstancesRequest.builder() .instanceIds(instance_id).build();

ec2.monitorInstances(request);

GitHub의 전체 예제를 참조하십시오.

인스턴스 모니터링 중지인스턴스 모니터링을 중지하려면 모니터링을 중지할 인스턴스의 ID로 UnmonitorInstancesRequest를 생성하고 Ec2Client의 unmonitorInstances 메서드에 전달합니다.

가져오기

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.MonitorInstancesRequest;import software.amazon.awssdk.services.ec2.model.UnmonitorInstancesRequest;

코드

Ec2Client ec2 = Ec2Client.create();

UnmonitorInstancesRequest request = UnmonitorInstancesRequest.builder()

55

Java용 AWS SDK 버전 2 개발자 안내서Amazon EC2에서 탄력적 IP 주소 사용

.instanceIds(instance_id).build();

ec2.unmonitorInstances(request);

GitHub의 전체 예제를 참조하십시오.

추가 정보• Amazon EC2 API Reference의 RunInstances• Amazon EC2 API Reference의 DescribeInstances• Amazon EC2 API Reference의 StartInstances• Amazon EC2 API Reference의 StopInstances• Amazon EC2 API Reference의 RebootInstances• Amazon EC2 API Reference의 DescribeInstances• Amazon EC2 API Reference의 MonitorInstances• Amazon EC2 API Reference의 UnmonitorInstances

Amazon EC2에서 탄력적 IP 주소 사용탄력적 IP 주소 할당탄력적 IP 주소를 사용하려면 먼저 계정에 주소를 할당한 후 인스턴스 또는 네트워크 인터페이스와 연결합니다.

탄력적 IP 주소를 할당하려면 네트워크 유형(기존 EC2 또는 VPC)을 포함하는 AllocateAddressRequest 객체와 함께 Ec2Client의 allocateAddress 메서드를 호출합니다.

반환된 AllocateAddressResponse에는 AssociateAddressRequest에 있는 할당 ID와 인스턴스 ID를Ec2Client의 associateAddress 메서드에 전달하여 주소를 인스턴스와 연결하는 데 사용할 수 있는 할당ID가 포함됩니다.

가져오기

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.AllocateAddressRequest;import software.amazon.awssdk.services.ec2.model.AllocateAddressResponse;import software.amazon.awssdk.services.ec2.model.AssociateAddressRequest;import software.amazon.awssdk.services.ec2.model.AssociateAddressResponse;import software.amazon.awssdk.services.ec2.model.DomainType;

코드

Ec2Client ec2 = Ec2Client.create();

AllocateAddressRequest allocate_request = AllocateAddressRequest.builder() .domain(DomainType.VPC) .build();

AllocateAddressResponse allocate_response = ec2.allocateAddress(allocate_request);

String allocation_id = allocate_response.allocationId();

56

Java용 AWS SDK 버전 2 개발자 안내서Amazon EC2에서 탄력적 IP 주소 사용

AssociateAddressRequest associate_request = AssociateAddressRequest.builder() .instanceId(instance_id) .allocationId(allocation_id) .build();

AssociateAddressResponse associate_response = ec2.associateAddress(associate_request);

GitHub의 전체 예제를 참조하십시오.

탄력적 IP 주소 설명계정에 지정된 탄력적 IP 주소를 나열하려면 Ec2Client의 describeAddresses 메서드를 호출합니다. 계정에서 탄력적 IP 주소를 나타내는 주소 객체 목록을 가져오는 데 사용할 수 있는DescribeAddressesResponse를 반환합니다.

가져오기

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.Address;import software.amazon.awssdk.services.ec2.model.DescribeAddressesResponse;

코드

Ec2Client ec2 = Ec2Client.create();

DescribeAddressesResponse response = ec2.describeAddresses();

for(Address address : response.addresses()) { System.out.printf( "Found address with public IP %s, " + "domain %s, " + "allocation id %s " + "and NIC id %s", address.publicIp(), address.domain(), address.allocationId(), address.networkInterfaceId());}

GitHub의 전체 예제를 참조하십시오.

탄력적 IP 주소 해제탄력적 IP 주소를 릴리스하려면 Ec2Client의 releaseAddress 메서드를 호출하고 릴리스할 탄력적 IP 주소의 할당 ID가 포함된 ReleaseAddressRequest를 이 메서드에 전달합니다.

가져오기

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.ReleaseAddressRequest;import software.amazon.awssdk.services.ec2.model.ReleaseAddressResponse;

코드

57

Java용 AWS SDK 버전 2 개발자 안내서리전 및 가용 영역 사용

Ec2Client ec2 = Ec2Client.create();

ReleaseAddressRequest request = ReleaseAddressRequest.builder() .allocationId(alloc_id).build();

ReleaseAddressResponse response = ec2.releaseAddress(request);

탄력적 IP 주소를 릴리스하고 나면 이 주소가 AWS IP 주소 풀로 릴리스되어 이후부터는 사용할 수 없게 됩니다. 해당 주소와 통신하는 모든 서버 또는 장치와 DNS 레코드를 업데이트해야 합니다.

EC2-Classic 또는 기본 VPC를 사용하려는 경우에는 탄력적 IP 주소를 릴리스하면 연결되어 있는인스턴스에서 연결 해제됩니다. 탄력적 IP 주소를 릴리스하지 않고 연결을 해제하려면 Ec2Client의disassociateAddress 메서드를 사용합니다.

기본 VPC 이외의 VPC를 사용하려는 경우 릴리스하기 전에 disassociateAddress를 사용하여 탄력적 IP주소를 연결 해제해야 합니다. 그렇지 않으면 Amazon EC2에서 오류(InvalidIPAddress.InUse)를 반환합니다.

GitHub의 전체 예제를 참조하십시오.

추가 정보• Amazon EC2 User Guide for Linux Instances의 탄력적 IP 주소• Amazon EC2 API Reference의 AllocateAddress• Amazon EC2 API Reference의 DescribeAddresses• Amazon EC2 API Reference의 ReleaseAddress

리전 및 가용 영역 사용리전 설명계정에 사용할 수 있는 리전을 나열하려면 Ec2Client의 describeRegions 메서드를 호출합니다. 이 메서드는 DescribeRegionsResponse를 반환합니다. 반환된 객체의 regions 메서드를 호출하여 각 리전을 나타내는 Region 객체의 목록을 가져옵니다.

가져오기

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.DescribeRegionsResponse;import software.amazon.awssdk.services.ec2.model.Region;import software.amazon.awssdk.services.ec2.model.AvailabilityZone;import software.amazon.awssdk.services.ec2.model.DescribeAvailabilityZonesResponse;

코드

DescribeRegionsResponse regions_response = ec2.describeRegions();

for(Region region : regions_response.regions()) { System.out.printf( "Found region %s " + "with endpoint %s", region.regionName(), region.endpoint());

58

Java용 AWS SDK 버전 2 개발자 안내서리전 및 가용 영역 사용

System.out.println();

GitHub의 전체 예제를 참조하십시오.

가용 영역 설명계정에 사용할 수 있는 각 가용 영역을 나열하려면 Ec2Client의 describeAvailabilityZones 메서드를호출합니다. 이 메서드는 DescribeAvailabilityZonesResponse를 반환합니다. availabilityZones 메서드를 호출하여 각 가용 영역을 나타내는 AvailabilityZone 객체의 목록을 가져옵니다.

가져오기

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.DescribeRegionsResponse;import software.amazon.awssdk.services.ec2.model.Region;import software.amazon.awssdk.services.ec2.model.AvailabilityZone;import software.amazon.awssdk.services.ec2.model.DescribeAvailabilityZonesResponse;

코드

Ec2Client를 생성합니다.

Ec2Client ec2 = Ec2Client.create();

그런 다음 describeAvailabilityZones()를 호출하고 결과를 검색합니다.

DescribeAvailabilityZonesResponse zones_response = ec2.describeAvailabilityZones();

for(AvailabilityZone zone : zones_response.availabilityZones()) { System.out.printf( "Found availability zone %s " + "with status %s " + "in region %s", zone.zoneName(), zone.state(), zone.regionName()); System.out.println();

GitHub의 전체 예제를 참조하십시오.

계정 설명계정을 설명하려면 Ec2Client의 describeAccountAttributes 메서드를 호출합니다. 이 메서드는DescribeAccountAttributesResponse 객체를 반환합니다. 이 객체 accountAttributes 메서드를 호출하여 AccountAttribute 객체 목록을 확보합니다. 목록을 반복하여 AccountAttribute 객체를 검색할 수 있습니다.

AccountAttribute 객체의 attributeValues 메서드를 호출하여 사용자의 속성 값을 확보할 수 있습니다.이 메서드는 AccountAttributeValue 객체 목록을 반환합니다. 이 두 번째 목록을 반복하여 속성 값을 표시할수 있습니다(다음 코드 예제 참조).

가져오기

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.DescribeRegionsResponse;import software.amazon.awssdk.services.ec2.model.Region;import software.amazon.awssdk.services.ec2.model.AvailabilityZone;

59

Java용 AWS SDK 버전 2 개발자 안내서Amazon EC2 키 페어 작업

import software.amazon.awssdk.services.ec2.model.DescribeAvailabilityZonesResponse;

코드

DescribeRegionsResponse regions_response = ec2.describeRegions();

for(Region region : regions_response.regions()) { System.out.printf( "Found region %s " + "with endpoint %s", region.regionName(), region.endpoint()); System.out.println();

GitHub의 전체 예제를 참조하십시오.

추가 정보• Amazon EC2 User Guide for Linux Instances의 리전 및 가용 영역• Amazon EC2 API Reference의 DescribeRegions• Amazon EC2 API Reference의 DescribeAvailabilityZones

Amazon EC2 키 페어 작업키 페어 만들기키 페어를 생성하려면 키 이름이 포함된 CreateKeyPairRequest를 사용하여 Ec2Client의 createKeyPair메서드를 호출합니다.

가져오기

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.CreateKeyPairRequest;import software.amazon.awssdk.services.ec2.model.CreateKeyPairResponse;

코드

Ec2Client ec2 = Ec2Client.create();

CreateKeyPairRequest request = CreateKeyPairRequest.builder() .keyName(key_name).build();

CreateKeyPairResponse response = ec2.createKeyPair(request);

GitHub의 전체 예제를 참조하십시오.

키 페어 설명키 페어를 나열하거나 키 페어에 대한 정보를 가져오려면 Ec2Client의 describeKeyPairs 메서드를 호출합니다. 이 메서드는 KeyPairInfo 객체의 목록을 반환하는 keyPairs 메서드를 호출하여 키 페어 목록에 액세스하는 데 사용할 수 있는 DescribeKeyPairsResponse를 반환합니다.

60

Java용 AWS SDK 버전 2 개발자 안내서Amazon EC2 키 페어 작업

가져오기

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.DescribeKeyPairsResponse;import software.amazon.awssdk.services.ec2.model.KeyPairInfo;

코드

Ec2Client ec2 = Ec2Client.create();

DescribeKeyPairsResponse response = ec2.describeKeyPairs();

for(KeyPairInfo key_pair : response.keyPairs()) { System.out.printf( "Found key pair with name %s " + "and fingerprint %s", key_pair.keyName(), key_pair.keyFingerprint()); System.out.println("");}

GitHub의 전체 예제를 참조하십시오.

키 페어 삭제키 페어를 삭제하려면 Ec2Client의 deleteKeyPair 메서드를 호출하고 삭제할 키 페어 이름이 포함된DeleteKeyPairRequest를 이 메서드를 전달합니다.

가져오기

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.DeleteKeyPairRequest;import software.amazon.awssdk.services.ec2.model.DeleteKeyPairResponse;

코드

Ec2Client ec2 = Ec2Client.create();

DeleteKeyPairRequest request = DeleteKeyPairRequest.builder() .keyName(key_name) .build();

DeleteKeyPairResponse response = ec2.deleteKeyPair(request);

GitHub의 전체 예제를 참조하십시오.

추가 정보• Amazon EC2 User Guide for Linux Instances의 Amazon EC2 키 페어• Amazon EC2 API Reference의 CreateKeyPair• Amazon EC2 API Reference의 DescribeKeyPairs• Amazon EC2 API Reference의 DeleteKeyPair

61

Java용 AWS SDK 버전 2 개발자 안내서Amazon EC2의 보안 그룹 작업

Amazon EC2의 보안 그룹 작업보안 그룹 생성보안 그룹을 생성하려면 키 이름이 포함된 CreateSecurityGroupRequest를 사용하여 Ec2Client의createSecurityGroup 메서드를 호출합니다.

가져오기

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.CreateSecurityGroupRequest;import software.amazon.awssdk.services.ec2.model.CreateSecurityGroupResponse;import software.amazon.awssdk.services.ec2.model.AuthorizeSecurityGroupIngressRequest;import software.amazon.awssdk.services.ec2.model.AuthorizeSecurityGroupIngressResponse;import software.amazon.awssdk.services.ec2.model.IpPermission;import software.amazon.awssdk.services.ec2.model.IpRange;

코드

CreateSecurityGroupRequest create_request = CreateSecurityGroupRequest.builder() .groupName(group_name) .description(group_desc) .vpcId(vpc_id) .build();

CreateSecurityGroupResponse create_response = ec2.createSecurityGroup(create_request);

GitHub의 전체 예제를 참조하십시오.

보안 그룹 구성보안 그룹은 Amazon EC2 인스턴스에 대한 인바운드(수신) 및 아웃바운드(송신) 트래픽을 모두 제어할 수 있습니다.

수신 규칙을 보안 그룹에 추가하려면 보안 그룹의 이름과 AuthorizeSecurityGroupIngressRequest객체 안에서 해당 보안 그룹에 할당할 액세스 규칙(IpPermission)을 지정하여 Ec2Client의authorizeSecurityGroupIngress 메서드를 사용합니다. 다음 예제에서는 IP 권한을 보안 그룹에 추가하는 방법을 보여줍니다.

가져오기

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.CreateSecurityGroupRequest;import software.amazon.awssdk.services.ec2.model.CreateSecurityGroupResponse;import software.amazon.awssdk.services.ec2.model.AuthorizeSecurityGroupIngressRequest;import software.amazon.awssdk.services.ec2.model.AuthorizeSecurityGroupIngressResponse;import software.amazon.awssdk.services.ec2.model.IpPermission;import software.amazon.awssdk.services.ec2.model.IpRange;

코드

먼저 Ec2Client를 생성합니다.

Ec2Client ec2 = Ec2Client.create();

62

Java용 AWS SDK 버전 2 개발자 안내서Amazon EC2의 보안 그룹 작업

그런 다음 Ec2Client의 authorizeSecurityGroupIngress 메서드를 사용합니다.

IpRange ip_range = IpRange.builder() .cidrIp("0.0.0.0/0").build();

IpPermission ip_perm = IpPermission.builder() .ipProtocol("tcp") .toPort(80) .fromPort(80) .ipRanges(ip_range) // .ipv4Ranges(ip_range) .build();

IpPermission ip_perm2 = IpPermission.builder() .ipProtocol("tcp") .toPort(22) .fromPort(22) .ipRanges(ip_range) .build();

AuthorizeSecurityGroupIngressRequest auth_request = AuthorizeSecurityGroupIngressRequest.builder() .groupName(group_name) .ipPermissions(ip_perm, ip_perm2) .build();

AuthorizeSecurityGroupIngressResponse auth_response = ec2.authorizeSecurityGroupIngress(auth_request);

송신 규칙을 보안 그룹에 추가하려면 AuthorizeSecurityGroupEgressRequest의 유사한 데이터를 Ec2Client의 authorizeSecurityGroupEgress 메서드에 제공합니다.

GitHub의 전체 예제를 참조하십시오.

보안 그룹 설명보안 그룹을 설명하거나 보안 그룹에 대한 정보를 가져오려면 Ec2Client의 describeSecurityGroups 메서드를 호출합니다. 그러면 SecurityGroup 객체 목록을 반환하는 securityGroups 메서드를 호출하여 보안 그룹의 목록에 액세스하는 데 사용할 수 있는 DescribeSecurityGroupsResponse가 반환됩니다.

가져오기

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.DescribeSecurityGroupsRequest;import software.amazon.awssdk.services.ec2.model.DescribeSecurityGroupsResponse;import software.amazon.awssdk.services.ec2.model.SecurityGroup;

코드

Ec2Client ec2 = Ec2Client.create();

DescribeSecurityGroupsRequest request = DescribeSecurityGroupsRequest.builder() .groupIds(group_id).build();

DescribeSecurityGroupsResponse response = ec2.describeSecurityGroups(request);

63

Java용 AWS SDK 버전 2 개발자 안내서AWS Identity and Access Management(IAM) 예제

GitHub의 전체 예제를 참조하십시오.

보안 그룹 삭제보안 그룹을 삭제하려면 Ec2Client의 deleteSecurityGroup 메서드를 호출하여 삭제할 보안 그룹의 ID가포함된 DeleteSecurityGroupRequest를 이 메서드에 전달합니다.

가져오기

import software.amazon.awssdk.services.ec2.Ec2Client;import software.amazon.awssdk.services.ec2.model.DeleteSecurityGroupRequest;import software.amazon.awssdk.services.ec2.model.DeleteSecurityGroupResponse;

코드

Ec2Client ec2 = Ec2Client.create();

DeleteSecurityGroupRequest request = DeleteSecurityGroupRequest.builder() .groupId(group_id) .build();

DeleteSecurityGroupResponse response = ec2.deleteSecurityGroup(request);

GitHub의 전체 예제를 참조하십시오.

추가 정보• Amazon EC2 User Guide for Linux Instances의 Amazon EC2 보안 그룹• Amazon EC2 User Guide for Linux Instances의 Linux 인스턴스의 인바운드 트래픽 권한 부여• Amazon EC2 API Reference의 CreateSecurityGroup• Amazon EC2 API Reference의 DescribeSecurityGroups• Amazon EC2 API Reference의 DeleteSecurityGroup• Amazon EC2 API Reference의 AuthorizeSecurityGroupIngress

AWS SDK for Java를 사용한 IAM 예제이 단원에서는 AWS SDK for Java 2.0를 사용한 IAM 프로그래밍의 예를 제공합니다.

AWS Identity and Access Management(IAM)를 사용하면 사용자의 AWS 서비스 및 리소스에 대한 액세스를안전하게 제어할 수 있습니다. IAM을 사용하면 AWS 사용자 및 그룹을 만들고 관리하며 AWS 리소스에 대한액세스를 허용 및 거부할 수 있습니다. IAM의 전체 설명서는 IAM 사용 설명서를 참조하십시오.

다음 예제에는 각 기술을 보여주는 데 필요한 코드만 포함되어 있습니다. 전체 예제 코드는 GitHub에 있습니다. 이 위치에서 단일 소스 파일을 다운로드하거나 리포지토리를 로컬로 복사하여 모든 예제를 빌드하고 실행할 수 있습니다.

주제• IAM 액세스 키 관리 (p. 65)• IAM 사용자 관리 (p. 68)• IAM 계정 별칭 사용 (p. 71)

64

Java용 AWS SDK 버전 2 개발자 안내서IAM 액세스 키 관리

• IAM 정책 작업 (p. 72)• IAM 서버 인증서 작업 (p. 76)

IAM 액세스 키 관리액세스 키 생성IAM 액세스 키를 생성하려면 CreateAccessKeyRequest 객체를 사용하여 IamClient의 createAccessKey메서드를 호출합니다.

Note

IAM이 글로벌 서비스이므로 리전을 AWS_GLOBAL로 설정해야 IamClient 호출이 작동합니다.

가져오기

import software.amazon.awssdk.services.iam.model.CreateAccessKeyRequest;import software.amazon.awssdk.services.iam.model.CreateAccessKeyResponse;

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;

코드

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

CreateAccessKeyRequest request = CreateAccessKeyRequest.builder() .userName(user).build();

CreateAccessKeyResponse response = iam.createAccessKey(request);

System.out.println("Created access key: " + response.accessKey());

GitHub의 전체 예제를 참조하십시오.

액세스 키 나열해당 사용자의 액세스 키를 나열하려면 키를 나열할 사용자 이름이 포함된 ListAccessKeysRequest 객체를생성하여 IamClient의 listAccessKeys 메서드에 전달합니다.

Note

사용자 이름을 listAccessKeys에 제공하지 않으면 이 메서드는 요청에 서명한 AWS 계정과 연결된 액세스 키를 나열하려고 합니다.

가져오기

import software.amazon.awssdk.services.iam.model.AccessKeyMetadata;import software.amazon.awssdk.services.iam.model.ListAccessKeysRequest;import software.amazon.awssdk.services.iam.model.ListAccessKeysResponse;

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;

코드

65

Java용 AWS SDK 버전 2 개발자 안내서IAM 액세스 키 관리

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

boolean done = false;String new_marker = null;

while (!done) { ListAccessKeysResponse response;

if(new_marker == null) { ListAccessKeysRequest request = ListAccessKeysRequest.builder() .userName(username).build(); response = iam.listAccessKeys(request); } else { ListAccessKeysRequest request = ListAccessKeysRequest.builder() .userName(username) .marker(new_marker).build(); response = iam.listAccessKeys(request); }

for (AccessKeyMetadata metadata : response.accessKeyMetadata()) { System.out.format("Retrieved access key %s", metadata.accessKeyId()); }

if (!response.isTruncated()) { done = true; } else { new_marker = response.marker(); }}

listAccessKeys의 결과가 페이징됩니다(호출당 기본 최대 100개 레코드). 반환된ListAccessKeysResponse 객체에 대해 isTruncated를 호출하여 이 쿼리에서 사용 가능한 결과가 거의 반환되지 않는지 여부를 확인할 수 있습니다. 그런 후 marker에서 ListAccessKeysResponse를 호출해 새요청 생성 때 사용합니다. 다음 listAccessKeys 호출에 이 새 요청을 사용합니다.

GitHub의 전체 예제를 참조하십시오.

액세스 키의 마지막 사용 시간 가져오기액세스 키를 마지막으로 사용한 시간을 확인하려면 액세스 키 ID(GetAccessKeyLastUsedRequest 객체를 사용해 전달할 수 있음)로 IamClient의 getAccessKeyLastUsed 메서드를 호출합니다.

그런 다음 반환된 GetAccessKeyLastUsedResponse 객체를 사용하여 키의 마지막 사용 시간을 가져올 수 있습니다.

가져오기

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;import software.amazon.awssdk.services.iam.model.GetAccessKeyLastUsedRequest;import software.amazon.awssdk.services.iam.model.GetAccessKeyLastUsedResponse;

코드

Region region = Region.AWS_GLOBAL;

66

Java용 AWS SDK 버전 2 개발자 안내서IAM 액세스 키 관리

IamClient iam = IamClient.builder().region(region).build();

GetAccessKeyLastUsedRequest request = GetAccessKeyLastUsedRequest.builder() .accessKeyId(access_id).build();

GetAccessKeyLastUsedResponse response = iam.getAccessKeyLastUsed(request);

System.out.println("Access key was last used at: " + response.accessKeyLastUsed().lastUsedDate());

GitHub의 전체 예제를 참조하십시오.

액세스 키 활성화 또는 비활성화UpdateAccessKeyRequest 객체를 생성하고 액세스 키 ID, 사용자 이름(선택 사항) 및 원하는 상태를 제공한후, 요청 객체를 IamClient의 updateAccessKey 메서드에 전달함으로써 액세스 키를 활성화하거나 비활성화할 수 있습니다.

가져오기

import software.amazon.awssdk.services.iam.model.StatusType;import software.amazon.awssdk.services.iam.model.UpdateAccessKeyRequest;import software.amazon.awssdk.services.iam.model.UpdateAccessKeyResponse;

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;

코드

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

UpdateAccessKeyRequest request = UpdateAccessKeyRequest.builder() .accessKeyId(access_id) .userName(username) .status(statusType) .build();

UpdateAccessKeyResponse response = iam.updateAccessKey(request);

GitHub의 전체 예제를 참조하십시오.

액세스 키 삭제액세스 키를 영구적으로 삭제하려면 액세스 키의 ID와 사용자 이름이 포함된 DeleteAccessKeyRequest와 함께 IamClient의 deleteKey 메서드를 호출합니다.

Note

키는 삭제하고 나면 더 이상 가져오거나 사용할 수 없습니다. 나중에 다시 활성화할 수 있도록 키를일시적으로 비활성화하려면 대신에 updateAccessKey (p. 67) 메서드를 사용합니다.

가져오기

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;import software.amazon.awssdk.services.iam.model.DeleteAccessKeyRequest;

67

Java용 AWS SDK 버전 2 개발자 안내서IAM 사용자 관리

import software.amazon.awssdk.services.iam.model.DeleteAccessKeyResponse;

코드

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

DeleteAccessKeyRequest request = DeleteAccessKeyRequest.builder() .accessKeyId(access_key) .userName(username).build();

DeleteAccessKeyResponse response = iam.deleteAccessKey(request);

GitHub의 전체 예제를 참조하십시오.

추가 정보• IAM API Reference의 CreateAccessKey• IAM API Reference의 ListAccessKeys• IAM API Reference의 GetAccessKeyLastUsed• IAM API Reference의 UpdateAccessKey• IAM API Reference의 DeleteAccessKey

IAM 사용자 관리사용자 생성사용자 이름이 포함된 CreateUserRequest 객체를 사용하여 IamClient의 createUser 메서드에 사용자 이름을 제공해 새 IAM 사용자를 생성합니다.

가져오기

import software.amazon.awssdk.services.iam.model.CreateUserRequest;import software.amazon.awssdk.services.iam.model.CreateUserResponse;

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;

코드

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

CreateUserRequest request = CreateUserRequest.builder() .userName(username).build();

CreateUserResponse response = iam.createUser(request);

System.out.println("Successfully created user: " + response.user().userName());

GitHub의 전체 예제를 참조하십시오.

68

Java용 AWS SDK 버전 2 개발자 안내서IAM 사용자 관리

사용자 표시계정의 IAM 사용자를 나열하려면 새 ListUsersRequest를 생성하여 IamClient의 listUsers 메서드에 전달합니다. 반환된 ListUsersResponse 객체에 대해 users를 호출하여 사용자 목록을 가져올 수 있습니다.

listUsers에서 반환된 사용자 목록이 페이징됩니다. 응답 객체의 isTruncated 메서드를 호출하여 가져올 결과가 더 있는지 확인할 수 있습니다. 그런 다음 true를 반환하면 응답 객체의 marker() 메서드를 호출합니다. 마커 값을 사용해 새 요청 객체를 생성합니다. 그런 다음 새 요청을 사용해 다시 listUsers 메서드를 호출합니다.

가져오기

import software.amazon.awssdk.services.iam.model.ListUsersRequest;import software.amazon.awssdk.services.iam.model.ListUsersResponse;import software.amazon.awssdk.services.iam.model.User;

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;

코드

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

boolean done = false;String new_marker = null;

while(!done) { ListUsersResponse response;

if (new_marker == null) { ListUsersRequest request = ListUsersRequest.builder().build(); response = iam.listUsers(request); } else { ListUsersRequest request = ListUsersRequest.builder() .marker(new_marker).build(); response = iam.listUsers(request); }

for(User user : response.users()) { System.out.format("Retrieved user %s", user.userName()); }

if(!response.isTruncated()) { done = true; } else { new_marker = response.marker(); }}

GitHub의 전체 예제를 참조하십시오.

사용자 업데이트사용자를 업데이트하려면 IamClient 객체의 updateUser 메서드를 호출합니다. 이 메서드는 사용자의 이름이나 경로를 변경하는 데 사용할 수 있는 UpdateUserRequest 객체를 사용합니다.

가져오기

69

Java용 AWS SDK 버전 2 개발자 안내서IAM 사용자 관리

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;import software.amazon.awssdk.services.iam.model.UpdateUserRequest;import software.amazon.awssdk.services.iam.model.UpdateUserResponse;

코드

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

UpdateUserRequest request = UpdateUserRequest.builder() .userName(cur_name) .newUserName(new_name).build();

UpdateUserResponse response = iam.updateUser(request);

GitHub의 전체 예제를 참조하십시오.

사용자 삭제사용자를 삭제하려면 삭제할 사용자 이름으로 설정된 UpdateUserRequest 객체와 함께 IamClient의deleteUser 요청을 호출합니다.

가져오기

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;import software.amazon.awssdk.services.iam.model.DeleteConflictException;import software.amazon.awssdk.services.iam.model.DeleteUserRequest;

코드

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

DeleteUserRequest request = DeleteUserRequest.builder() .userName(username).build();

try { iam.deleteUser(request);} catch (DeleteConflictException e) { System.out.println("Unable to delete user. Verify user is not" + " associated with any resources"); throw e;}

GitHub의 전체 예제를 참조하십시오.

추가 정보• IAM User Guide의 IAM 사용자• IAM User Guide의 IAM 사용자 관리• IAM API Reference의 CreateUser• IAM API Reference의 ListUsers

70

Java용 AWS SDK 버전 2 개발자 안내서IAM 계정 별칭 사용

• IAM API Reference의 UpdateUser• IAM API Reference의 DeleteUser

IAM 계정 별칭 사용AWS 계정 ID 대신 회사 이름이나 기타 친숙한 식별자를 로그인 페이지의 URL에 포함하려는 경우 AWS 계정의 별칭을 만들 수 있습니다.

Note

AWS에서는 계정당 정확히 계정 별칭 하나를 지원합니다.

계정 별칭 생성계정 별칭을 만들려면 별칭 이름이 포함된 CreateAccountAliasRequest 객체와 함께 IamClient의createAccountAlias 메서드를 호출합니다.

가져오기

import software.amazon.awssdk.services.iam.model.CreateAccountAliasRequest;import software.amazon.awssdk.services.iam.model.CreateAccountAliasResponse;

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;

코드

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

CreateAccountAliasRequest request = CreateAccountAliasRequest.builder() .accountAlias(alias).build();

CreateAccountAliasResponse response = iam.createAccountAlias(request);

System.out.println("Successfully created account alias: " + alias);

GitHub의 전체 예제를 참조하십시오.

계정 별칭 나열계정 별칭을 나열하려면 IamClient의 listAccountAliases 메서드를 호출합니다.

Note

반환된 ListAccountAliasesResponse에서는 다른 AWS SDK for Javalist 메서드와 동일한isTruncated 및 marker 메서드를 지원하지만 AWS 계정에는 계정 별칭을 한 개만 지정할 수 있습니다.

가져오기

import software.amazon.awssdk.services.iam.model.ListAccountAliasesResponse;

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;

71

Java용 AWS SDK 버전 2 개발자 안내서IAM 정책 작업

코드

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

ListAccountAliasesResponse response = iam.listAccountAliases();

for (String alias : response.accountAliases()) { System.out.printf("Retrieved account alias %s", alias);}

GitHub의 전체 예제를 참조하십시오.

계정 별칭 삭제계정의 별칭을 삭제하려면 IamClient의 deleteAccountAlias 메서드를 호출합니다. 계정 별칭을 삭제하려는 경우 DeleteAccountAliasRequest 객체를 사용하여 별칭 이름을 지정해야 합니다.

가져오기

import software.amazon.awssdk.services.iam.model.DeleteAccountAliasRequest;import software.amazon.awssdk.services.iam.model.DeleteAccountAliasResponse;

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;

코드

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

DeleteAccountAliasRequest request = DeleteAccountAliasRequest.builder() .accountAlias(alias).build();

DeleteAccountAliasResponse response = iam.deleteAccountAlias(request);

GitHub의 전체 예제를 참조하십시오.

추가 정보• IAM User Guide의 AWS 계정 ID 및 별칭• IAM API Reference의 CreateAccountAlias• IAM API Reference의 ListAccountAliases• IAM API Reference의 DeleteAccountAlias

IAM 정책 작업정책 만들기새 정책을 생성하려면 CreatePolicyRequest의 정책 이름과 JSON 형식으로 된 정책 문서를 IamClient의createPolicy 메서드에 제공합니다.

72

Java용 AWS SDK 버전 2 개발자 안내서IAM 정책 작업

가져오기

import software.amazon.awssdk.services.iam.model.CreatePolicyRequest;import software.amazon.awssdk.services.iam.model.CreatePolicyResponse;

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;

코드

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

CreatePolicyRequest request = CreatePolicyRequest.builder() .policyName(policy_name) .policyDocument(POLICY_DOCUMENT).build();

CreatePolicyResponse response = iam.createPolicy(request);

System.out.println("Successfully created policy: " + response.policy().policyName());

IAM 정책 문서는 올바르게 문서화된 구문으로 된 JSON 문자열입니다. 다음은 DynamoDB에 대한 특정 요청을 작성하기 위한 액세스 권한을 제공하는 예입니다.

ic static final String POLICY_DOCUMENT ="{" +" \"Version\": \"2012-10-17\"," +" \"Statement\": [" +" {" +" \"Effect\": \"Allow\"," +" \"Action\": \"logs:CreateLogGroup\"," +" \"Resource\": \"%s\"" +" }," +" {" +" \"Effect\": \"Allow\"," +" \"Action\": [" +" \"dynamodb:DeleteItem\"," +" \"dynamodb:GetItem\"," +" \"dynamodb:PutItem\"," +" \"dynamodb:Scan\"," +" \"dynamodb:UpdateItem\"" +" ]," +" \"Resource\": \"RESOURCE_ARN\"" +" }" +" ]" +"}";

GitHub의 전체 예제를 참조하십시오.

정책 가져오기기존 정책을 검색하려면 GetPolicyRequest 객체에 정책의 ARN을 제공하여 IamClient의 getPolicy 메서드를 호출합니다.

가져오기

import software.amazon.awssdk.services.iam.model.GetPolicyRequest;import software.amazon.awssdk.services.iam.model.GetPolicyResponse;

73

Java용 AWS SDK 버전 2 개발자 안내서IAM 정책 작업

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;

코드

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

GetPolicyRequest request = GetPolicyRequest.builder() .policyArn(policy_arn).build();

GetPolicyResponse response = iam.getPolicy(request);

GitHub의 전체 예제를 참조하십시오.

역할 정책 연결IamClient의 attachRolePolicy 메서드를 호출하고 AttachRolePolicyRequest의 역할 이름과 정책 ARN을이 메서드에 제공해 IAM 역할에 정책을 연결할 수 있습니다.

가져오기

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;import software.amazon.awssdk.services.iam.model.AttachRolePolicyRequest;import software.amazon.awssdk.services.iam.model.AttachedPolicy;import software.amazon.awssdk.services.iam.model.ListAttachedRolePoliciesRequest;import software.amazon.awssdk.services.iam.model.ListAttachedRolePoliciesResponse;import java.util.ArrayList;import java.util.List;import java.util.stream.Collectors;

코드

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

AttachRolePolicyRequest attach_request = AttachRolePolicyRequest.builder() .roleName(role_name) .policyArn(POLICY_ARN).build();

iam.attachRolePolicy(attach_request);

GitHub의 전체 예제를 참조하십시오.

연결된 역할 정책 나열IamClient의 listAttachedRolePolicies 메서드를 호출하여 역할의 연결된 정책을 나열합니다. 이 메서드는 정책을 나열할 역할 이름을 포함하는 ListAttachedRolePoliciesRequest 객체를 사용합니다.

반환된 ListAttachedRolePoliciesResponse 객체에 대해 getAttachedPolicies를 호출하여 연결된 정책의 목록을 가져옵니다. ListAttachedRolePoliciesResponse 객체의 isTruncated 메서드가 true를 반환하고, ListAttachedRolePoliciesResponse 객체의 marker 메서드를 호

74

Java용 AWS SDK 버전 2 개발자 안내서IAM 정책 작업

출하는 경우 결과가 잘릴 수 있습니다. 반환된 마커를 사용하여 새 요청을 생성하고, 이를 사용하여listAttachedRolePolicies를 다시 호출해 다음 검색 배치를 가져옵니다.

가져오기

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;import software.amazon.awssdk.services.iam.model.AttachRolePolicyRequest;import software.amazon.awssdk.services.iam.model.AttachedPolicy;import software.amazon.awssdk.services.iam.model.ListAttachedRolePoliciesRequest;import software.amazon.awssdk.services.iam.model.ListAttachedRolePoliciesResponse;import java.util.ArrayList;import java.util.List;import java.util.stream.Collectors;

코드

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

List<AttachedPolicy> matching_policies = new ArrayList<>();

boolean done = false;String new_marker = null;

while(!done) {

ListAttachedRolePoliciesResponse response;

if (new_marker == null) { ListAttachedRolePoliciesRequest request = ListAttachedRolePoliciesRequest.builder() .roleName(role_name).build(); response = iam.listAttachedRolePolicies(request); } else { ListAttachedRolePoliciesRequest request = ListAttachedRolePoliciesRequest.builder() .roleName(role_name) .marker(new_marker).build(); response = iam.listAttachedRolePolicies(request); }

matching_policies.addAll( response.attachedPolicies() .stream() .filter(p -> p.policyName().equals(role_name)) .collect(Collectors.toList()));

if(!response.isTruncated()) { done = true; } else { new_marker = response.marker(); }}

if (matching_policies.size() > 0) { System.out.println(role_name + " policy is already attached to this role."); return;}

75

Java용 AWS SDK 버전 2 개발자 안내서IAM 서버 인증서 작업

GitHub의 전체 예제를 참조하십시오.

역할 정책 분리역할에서 정책을 분리하려면 IamClient의 detachRolePolicy 메서드를 호출하여DetachRolePolicyRequest의 역할 이름과 정책 ARN을 이 메서드에 지정합니다.

가져오기

import software.amazon.awssdk.services.iam.model.DetachRolePolicyRequest;import software.amazon.awssdk.services.iam.model.DetachRolePolicyResponse;

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;

코드

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

DetachRolePolicyRequest request = DetachRolePolicyRequest.builder() .roleName(role_name) .policyArn(policy_arn).build();

DetachRolePolicyResponse response = iam.detachRolePolicy(request);

GitHub의 전체 예제를 참조하십시오.

추가 정보• IAM User Guide의 IAM 정책 개요• IAM User Guide의 AWS IAM 정책 참조• IAM API Reference의 CreatePolicy• IAM API Reference의 GetPolicy• IAM API Reference의 AttachRolePolicy• IAM API Reference의 ListAttachedRolePolicies• IAM API Reference의 DetachRolePolicy

IAM 서버 인증서 작업AWS에서 웹 사이트나 애플리케이션에 대한 HTTPS 연결을 활성화하려면 SSL/TLS 서버 인증서가 필요합니다. AWS Certificate Manager에서 제공하거나 외부 공급자에게서 얻은 서버 인증서를 사용할 수 있습니다.

서버 인증서를 프로비저닝 및 관리하고 배포할 때 ACM을 사용하는 것이 좋습니다. ACM을 사용하면 인증서를 요청하여 AWS 리소스에 배포할 수 있고, ACM에서 인증서 갱신을 처리하게 할 수 있습니다. ACM에서 제공하는 인증서는 무료입니다. ACM에 대한 자세한 내용은 ACM 사용 설명서를 참조하십시오.

서버 인증서 가져오기IamClient의 getServerCertificate 메서드를 호출하고 인증서 이름이 포함된GetServerCertificateRequest를 이 메서드에 전달하여 서버 인증서를 검색할 수 있습니다.

가져오기

76

Java용 AWS SDK 버전 2 개발자 안내서IAM 서버 인증서 작업

import software.amazon.awssdk.services.iam.model.GetServerCertificateRequest;import software.amazon.awssdk.services.iam.model.GetServerCertificateResponse;

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;

코드

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

GetServerCertificateRequest request = GetServerCertificateRequest.builder() .serverCertificateName(cert_name).build();

GetServerCertificateResponse response = iam.getServerCertificate(request);

GitHub의 전체 예제를 참조하십시오.

서버 인증서 목록 조회서버 인증서를 나열하려면 ListServerCertificatesRequest와 함께 IamClient의 listServerCertificates메서드를 호출합니다. 그러면 ListServerCertificatesResponse가 반환됩니다.

반환된 ListServerCertificateResponse 객체의 serverCertificateMetadataList 메서드를 호출하여 각 인증서에 대한 정보를 가져오는 데 사용할 수 있는 ServerCertificateMetadata 객체의 목록을 가져옵니다.

ListServerCertificateResponse 객체의 isTruncated 메서드가 true을 반환하고,ListServerCertificatesResponse 객체의 marker 메서드를 호출하고, 마커를 사용하여 새 요청을 생성하는 경우 결과가 잘릴 수도 있습니다. 이 경우 새 요청을 사용하여 listServerCertificates를 다시호출해 다음 결과들을 가져옵니다.

가져오기

import software.amazon.awssdk.services.iam.model.ListServerCertificatesRequest;import software.amazon.awssdk.services.iam.model.ListServerCertificatesResponse;import software.amazon.awssdk.services.iam.model.ServerCertificateMetadata;

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;

코드

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

boolean done = false;String new_marker = null;

while(!done) { ListServerCertificatesResponse response;

if (new_marker == null) { ListServerCertificatesRequest request = ListServerCertificatesRequest.builder().build(); response = iam.listServerCertificates(request); } else {

77

Java용 AWS SDK 버전 2 개발자 안내서IAM 서버 인증서 작업

ListServerCertificatesRequest request = ListServerCertificatesRequest.builder() .marker(new_marker).build(); response = iam.listServerCertificates(request); }

for(ServerCertificateMetadata metadata : response.serverCertificateMetadataList()) { System.out.printf("Retrieved server certificate %s", metadata.serverCertificateName()); }

if(!response.isTruncated()) { done = true; } else { new_marker = response.marker(); }}

GitHub의 전체 예제를 참조하십시오.

서버 인증서 업데이트IamClient의 updateServerCertificate 메서드를 호출하여 서버 인증서의 이름이나 경로를 업데이트할 수 있습니다. 이 메서드는 서버 인증서의 현재 이름 및 사용할 새 이름이나 새 경로로 설정된UpdateServerCertificateRequest 객체를 사용합니다.

가져오기

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;import software.amazon.awssdk.services.iam.model.UpdateServerCertificateRequest;import software.amazon.awssdk.services.iam.model.UpdateServerCertificateResponse;

코드

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

UpdateServerCertificateRequest request = UpdateServerCertificateRequest.builder() .serverCertificateName(cur_name) .newServerCertificateName(new_name) .build();

UpdateServerCertificateResponse response = iam.updateServerCertificate(request);

GitHub의 전체 예제를 참조하십시오.

서버 인증서 삭제서버 인증서를 삭제하려면 인증서 이름이 포함된 DeleteServerCertificateRequest와 함께 IamClient의deleteServerCertificate 메서드를 호출합니다.

가져오기

import software.amazon.awssdk.services.iam.model.DeleteServerCertificateRequest;

78

Java용 AWS SDK 버전 2 개발자 안내서Amazon Kinesis 예제

import software.amazon.awssdk.services.iam.model.DeleteServerCertificateResponse;

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.iam.IamClient;

코드

Region region = Region.AWS_GLOBAL;IamClient iam = IamClient.builder().region(region).build();

DeleteServerCertificateRequest request = DeleteServerCertificateRequest.builder() .serverCertificateName(cert_name).build();

DeleteServerCertificateResponse response = iam.deleteServerCertificate(request);

GitHub의 전체 예제를 참조하십시오.

추가 정보• IAM User Guide의 서버 인증서 작업• IAM API Reference의 GetServerCertificate• IAM API Reference의 ListServerCertificates• IAM API Reference의 UpdateServerCertificate• IAM API Reference의 DeleteServerCertificate• ACM 사용 설명서

AWS SDK for Java를 사용한 Kinesis 예제이 단원에서는 AWS SDK for Java 2.0를 사용하여 Amazon Kinesis를 프로그래밍하는 예제를 다룹니다.

Kinesis에 대한 자세한 내용은 Amazon Kinesis 개발자 안내서를 참조하십시오.

다음 예제에는 각 기술을 보여주는 데 필요한 코드만 포함되어 있습니다. 전체 예제 코드는 GitHub에 있습니다. 이 위치에서 단일 소스 파일을 다운로드하거나 리포지토리를 로컬로 복사하여 모든 예제를 빌드하고 실행할 수 있습니다.

주제• Amazon Kinesis Data Streams 구독 (p. 79)

Amazon Kinesis Data Streams 구독다음 예제에서는 subscribeToShard 메서드를 사용하여 Amazon Kinesis Data Streams에서 데이터를 검색하고 처리하는 방법을 보여줍니다. Kinesis Data Streams에서는 이제 향상된 팬아웃 기능과 지연 시간이짧은 HTTP/2 데이터 검색 API를 갖추어 개발자가 동일한 Kinesis 데이터 스트림에서 여러 개의 지연 시간이짧은 고성능 애플리케이션을 쉽게 실행할 수 있습니다.

설정먼저 비동기 Kinesis 클라이언트와 SubscribeToShardRequest 객체를 만듭니다. 이러한 객체는 다음 각 예제에서 사용되어 Kinesis 이벤트를 구독합니다.

79

Java용 AWS SDK 버전 2 개발자 안내서Amazon Kinesis Data Streams 구독

가져오기

import java.net.URI;import java.util.concurrent.CompletableFuture;import java.util.concurrent.atomic.AtomicInteger;import java.util.function.Supplier;

import org.reactivestreams.Subscriber;import org.reactivestreams.Subscription;import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;import software.amazon.awssdk.core.async.SdkPublisher;import software.amazon.awssdk.http.Protocol;import software.amazon.awssdk.http.SdkHttpConfigurationOption;import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient;import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.kinesis.KinesisAsyncClient;import software.amazon.awssdk.services.kinesis.model.ShardIteratorType;import software.amazon.awssdk.services.kinesis.model.SubscribeToShardEvent;import software.amazon.awssdk.services.kinesis.model.SubscribeToShardEventStream;import software.amazon.awssdk.services.kinesis.model.SubscribeToShardRequest;import software.amazon.awssdk.services.kinesis.model.SubscribeToShardResponse;import software.amazon.awssdk.services.kinesis.model.SubscribeToShardResponseHandler;import software.amazon.awssdk.utils.AttributeMap;

코드

KinesisAsyncClient client = KinesisAsyncClient.create();

SubscribeToShardRequest request = SubscribeToShardRequest.builder() .consumerARN(CONSUMER_ARN) .shardId("shardId-000000000000") .startingPosition(s -> s.type(ShardIteratorType.LATEST)).build();

작성기 인터페이스 사용builder 메서드를 사용하여 SubscribeToShardResponseHandler 생성을 간소화할 수 있습니다.

작성기를 사용하여 전체 인터페이스를 구현하는 대신 메서드 호출을 통해 각 수명 주기 콜백을 설정할 수 있습니다.

코드

private static CompletableFuture<Void> responseHandlerBuilder(KinesisAsyncClient client, SubscribeToShardRequest request) { SubscribeToShardResponseHandler responseHandler = SubscribeToShardResponseHandler .builder() .onError(t -> System.err.println("Error during stream - " + t.getMessage())) .onComplete(() -> System.out.println("All records stream successfully")) // Must supply some type of subscriber .subscriber(e -> System.out.println("Received event - " + e)) .build(); return client.subscribeToShard(request, responseHandler);}

게시자의 더욱 많은 제어를 위해 publisherTransformer 메서드를 사용하여 게시자를 사용자 지정할 수있습니다.

코드

80

Java용 AWS SDK 버전 2 개발자 안내서Amazon Kinesis Data Streams 구독

private static CompletableFuture<Void> responseHandlerBuilder_PublisherTransformer(KinesisAsyncClient client, SubscribeToShardRequest request) { SubscribeToShardResponseHandler responseHandler = SubscribeToShardResponseHandler .builder() .onError(t -> System.err.println("Error during stream - " + t.getMessage())) .publisherTransformer(p -> p.filter(e -> e instanceof SubscribeToShardEvent).limit(100)) .subscriber(e -> System.out.println("Received event - " + e)) .build(); return client.subscribeToShard(request, responseHandler);}

GitHub의 전체 예제를 참조하십시오.

사용자 지정 응답 핸들러 사용구독자와 게시자의 완전한 제어를 위해 SubscribeToShardResponseHandler 인터페이스를 구현합니다.

이 예제에서는 onEventStream 메서드를 구현하고, 이는 게시자에 대한 모든 액세스를 허용합니다. 게시자를 구독자가 출력할 이벤트 레코드로 전환하는 방법을 보여줍니다.

코드

private static CompletableFuture<Void> responseHandlerBuilder_Classic(KinesisAsyncClient client, SubscribeToShardRequest request) { SubscribeToShardResponseHandler responseHandler = new SubscribeToShardResponseHandler() {

@Override public void responseReceived(SubscribeToShardResponse response) { System.out.println("Receieved initial response"); }

@Override public void onEventStream(SdkPublisher<SubscribeToShardEventStream> publisher) { publisher // Filter to only SubscribeToShardEvents .filter(SubscribeToShardEvent.class) // Flat map into a publisher of just records .flatMapIterable(SubscribeToShardEvent::records) // Limit to 1000 total records .limit(1000) // Batch records into lists of 25 .buffer(25) // Print out each record batch .subscribe(batch -> System.out.println("Record Batch - " + batch)); }

@Override public void complete() { System.out.println("All records stream successfully"); }

@Override public void exceptionOccurred(Throwable throwable) { System.err.println("Error during stream - " + throwable.getMessage()); }

}; return client.subscribeToShard(request, responseHandler);}

81

Java용 AWS SDK 버전 2 개발자 안내서Amazon Kinesis Data Streams 구독

GitHub의 전체 예제를 참조하십시오.

방문자 인터페이스 사용Visitor 객체를 사용하여 보고 싶은 특정 이벤트를 구독할 수 있습니다.

코드

private static CompletableFuture<Void> responseHandlerBuilder_VisitorBuilder(KinesisAsyncClient client, SubscribeToShardRequest request) { SubscribeToShardResponseHandler.Visitor visitor = SubscribeToShardResponseHandler.Visitor .builder() .onSubscribeToShardEvent(e -> System.out.println("Received subscribe to shard event " + e)) .build(); SubscribeToShardResponseHandler responseHandler = SubscribeToShardResponseHandler .builder() .onError(t -> System.err.println("Error during stream - " + t.getMessage())) .subscriber(visitor) .build(); return client.subscribeToShard(request, responseHandler);}

GitHub의 전체 예제를 참조하십시오.

사용자 지정 구독자 사용사용자 지정 구독자를 구현하여 스트림을 구독할 수도 있습니다.

이 코드 조각은 예제 구독자를 보여줍니다.

코드

private static class MySubscriber implements Subscriber<SubscribeToShardEventStream> {

private Subscription subscription; private AtomicInteger eventCount = new AtomicInteger(0);

@Override public void onSubscribe(Subscription subscription) { this.subscription = subscription; this.subscription.request(1); }

@Override public void onNext(SubscribeToShardEventStream shardSubscriptionEventStream) { System.out.println("Received event " + shardSubscriptionEventStream); if (eventCount.incrementAndGet() >= 100) { // You can cancel the subscription at any time if you wish to stop receiving events. subscription.cancel(); } subscription.request(1); }

@Override public void onError(Throwable throwable) { System.err.println("Error occurred while stream - " + throwable.getMessage()); }

82

Java용 AWS SDK 버전 2 개발자 안내서Amazon Kinesis Data Streams 구독

@Override public void onComplete() { System.out.println("Finished streaming all events"); }}

미리 보기 예제와 유사하게 사용자 지정 구독자를 subscribe 메서드로 전달할 수 있습니다. 다음 코드 조각은 이 예제를 보여줍니다.

코드

private static CompletableFuture<Void> responseHandlerBuilder_Subscriber(KinesisAsyncClient client, SubscribeToShardRequest request) { SubscribeToShardResponseHandler responseHandler = SubscribeToShardResponseHandler .builder() .onError(t -> System.err.println("Error during stream - " + t.getMessage())) .subscriber(MySubscriber::new) .build(); return client.subscribeToShard(request, responseHandler);}

GitHub의 전체 예제를 참조하십시오.

타사 라이브러리 사용사용자 지정 구독자를 구현하는 대신 타사 라이브러리를 사용할 수 있습니다. 다음은 RxJava 구현을 사용하는 방법에 대한 예입니다. 그렇지만 반응형 스트림 인터페이스를 구현하는 모든 라이브러리를 사용할 수 있습니다. 해당 라이브러리에 대한 자세한 내용은 GitHub의 RxJava 위키 페이지를 참조하십시오.

라이브러리를 사용하려면 종속성으로 추가합니다. 이 예에서는 Maven을 사용하는 경우에 사용할 POM 조각을 알려줍니다.

POM 항목

<target>1.8</target> </configuration> </plugin> </plugins> </build>

가져오기

import java.net.URI;import java.util.concurrent.CompletableFuture;

import io.reactivex.Flowable;import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;import software.amazon.awssdk.core.async.SdkPublisher;import software.amazon.awssdk.http.Protocol;import software.amazon.awssdk.http.SdkHttpConfigurationOption;import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient;import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.kinesis.KinesisAsyncClient;import software.amazon.awssdk.services.kinesis.model.ShardIteratorType;import software.amazon.awssdk.services.kinesis.model.StartingPosition;import software.amazon.awssdk.services.kinesis.model.SubscribeToShardEvent;import software.amazon.awssdk.services.kinesis.model.SubscribeToShardRequest;import software.amazon.awssdk.services.kinesis.model.SubscribeToShardResponseHandler;import software.amazon.awssdk.utils.AttributeMap;

83

Java용 AWS SDK 버전 2 개발자 안내서Amazon Lambda 예제

이 예제에서는 onEventStream 수명 주기 메서드에서 RxJava를 사용합니다. 이는 게시자에 대한 모든 액세스를 제공하고, 이를 사용하여 Rx Flowable을 생성할 수 있습니다.

코드

SubscribeToShardResponseHandler responseHandler = SubscribeToShardResponseHandler .builder() .onError(t -> System.err.println("Error during stream - " + t.getMessage())) .onEventStream(p -> Flowable.fromPublisher(p) .ofType(SubscribeToShardEvent.class) .flatMapIterable(SubscribeToShardEvent::records) .limit(1000) .buffer(25) .subscribe(e -> System.out.println("Record batch = " + e))) .build();

또한 다음과 같이 publisherTransformer 게시자를 포함하여 Flowable 메서드를 사용할 수 있습니다.다음 예제에 표시된 것과 같이 Flowable 게시자를 SdkPublisher로 조정해야 합니다.

코드

SubscribeToShardResponseHandler responseHandler = SubscribeToShardResponseHandler .builder() .onError(t -> System.err.println("Error during stream - " + t.getMessage())) .publisherTransformer(p -> SdkPublisher.adapt(Flowable.fromPublisher(p).limit(100))) .build();

GitHub의 전체 예제를 참조하십시오.

추가 정보• Amazon Kinesis API Reference의 SubscribeToShardEvent• Amazon Kinesis API Reference의 SubscribeToShard

AWS SDK for Java를 사용하는 예제이 단원에서는 AWS SDK for Java 2.0를 사용한 Lambda 프로그래밍의 예를 제공합니다.

다음 예제에는 각 기술을 보여주는 데 필요한 코드만 포함되어 있습니다. 전체 예제 코드는 GitHub에 있습니다. 이 위치에서 단일 소스 파일을 다운로드하거나 리포지토리를 로컬로 복사하여 모든 예제를 빌드하고 실행할 수 있습니다.

주제• Lambda 함수 호출, 나열 및 삭제 (p. 84)

Lambda 함수 호출, 나열 및 삭제이 단원에서는 Java 2.0용 AWS SDK를 사용하여 Lambda 서비스 클라이언트를 통해 프로그래밍하는 예제를 제공합니다.

주제• Lambda 함수를 호출합니다. (p. 85)• Lambda 함수 나열 (p. 86)• Lambda 함수 삭제 (p. 86)

84

Java용 AWS SDK 버전 2 개발자 안내서서비스 작업

Lambda 함수를 호출합니다.LambdaClient 객체를 만들고 객체의 invoke 메서드를 호출하여 Lambda 함수를 호출할 수 있습니다.InvokeRequest 객체를 만들어 Lambda 함수에 전달할 함수 이름 및 페이로드와 같은 추가 정보를 지정합니다. 함수 이름은 arn:aws:lambda:us-west-2:555556330391:function:HelloFunction과 같이 나타납니다. AWS콘솔에서 함수를 확인해 값을 검색할 수 있습니다.

함수에 페이로드 데이터를 전달하려면 정보가 포함된 SdkBytes 객체를 만듭니다. 예를 들어 다음 코드 예제에서는 Lambda 함수에 JSON 데이터가 전달됩니다.

가져오기

import software.amazon.awssdk.services.lambda.LambdaClient;import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.lambda.model.InvokeRequest;import software.amazon.awssdk.core.SdkBytes;import software.amazon.awssdk.services.lambda.model.InvokeResponse;import software.amazon.awssdk.services.lambda.model.ServiceException;

코드

다음 코드 예제는 Lambda 함수를 호출하는 방법을 보여줍니다.

/* Function names appear as arn:aws:lambda:us-west-2:335556330391:function:HelloFunction you can retrieve the value by looking at the function in the AWS Console */ String functionName = args[0];

InvokeResponse res = null ; try { Region region = Region.US_WEST_2; LambdaClient awsLambda = LambdaClient.builder().region(region).build();

//Need a SdkBytes instance for the payload SdkBytes payload = SdkBytes.fromUtf8String("{\n" + " \"Hello \": \"Paris\",\n" + " \"countryCode\": \"FR\"\n" + "}" ) ;

//Setup an InvokeRequest InvokeRequest request = InvokeRequest.builder() .functionName(functionName) .payload(payload) .build();

//Invoke the Lambda function res = awsLambda.invoke(request);

//Get the response String value = res.payload().asUtf8String() ;

//write out the response System.out.println(value);

} catch(ServiceException e) { e.getStackTrace(); }

GitHub의 전체 예제를 참조하십시오.

85

Java용 AWS SDK 버전 2 개발자 안내서서비스 작업

Lambda 함수 나열LambdaClient 객체를 빌드하고 해당 listFunctions 메서드를 호출합니다. 이 메서드는 ListFunctionsResponse 객체를 반환합니다. 이 객체의 functions 메서드를 호출하여FunctionConfiguration 객체 목록을 반환할 수 있습니다. 목록을 반복하여 함수에 대한 정보를 검색할 수 있습니다. 예를 들어 다음 Java 코드 예제는 각 함수 이름을 가져오는 방법을 보여줍니다.

가져오기

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.lambda.LambdaClient;import software.amazon.awssdk.services.lambda.model.ListFunctionsResponse;import software.amazon.awssdk.services.lambda.model.FunctionConfiguration;import software.amazon.awssdk.services.lambda.model.ServiceException;import java.util.Iterator;import java.util.List;

코드

다음 Java 코드 예제는 함수 이름 목록을 검색하는 방법을 보여 줍니다.

ListFunctionsResponse functionResult = null ; try { Region region = Region.US_WEST_2; LambdaClient awsLambda = LambdaClient.builder().region(region).build();

//Get a list of all functions functionResult = awsLambda.listFunctions();

List<FunctionConfiguration> list = functionResult.functions();

for (Iterator iter = list.iterator(); iter.hasNext(); ) { FunctionConfiguration config = (FunctionConfiguration)iter.next(); System.out.println("The function name is "+config.functionName()); } } catch(ServiceException e) { e.getStackTrace(); }

GitHub의 전체 예제를 참조하십시오.

Lambda 함수 삭제LambdaClient 객체를 빌드하고 해당 deleteFunction 메서드를 호출합니다. DeleteFunctionRequest 객체를 만들고 deleteFunction 메서드에 전달합니다. 이 개체에는 삭제할 함수의 이름과 같은 정보가 포함되어 있습니다. 함수 이름은 arn:aws:lambda:us-west-2:555556330391:function:HelloFunction과 같이 나타납니다. AWS 콘솔에서 함수를 확인해 값을 검색할 수 있습니다.

가져오기

import software.amazon.awssdk.services.lambda.LambdaClient;import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.lambda.model.DeleteFunctionRequest;import software.amazon.awssdk.services.lambda.model.ServiceException;

코드

다음 Java 코드는 Lambda 함수를 삭제하는 방법을 설명합니다.

86

Java용 AWS SDK 버전 2 개발자 안내서Amazon S3 예제

String functionName = args[0]; try { Region region = Region.US_WEST_2; LambdaClient awsLambda = LambdaClient.builder().region(region).build();

//Setup an DeleteFunctionRequest DeleteFunctionRequest request = DeleteFunctionRequest.builder() .functionName(functionName) .build();

//Invoke the Lambda deleteFunction method awsLambda.deleteFunction(request); System.out.println("Done"); } catch(ServiceException e) { e.getStackTrace(); }

GitHub의 전체 예제를 참조하십시오.

AWS SDK for Java를 사용하는 Amazon S3 예제이 단원에서는 AWS SDK for Java 2.0를 사용하여 Amazon S3를 프로그래밍하는 예제를 다룹니다.

다음 예제에는 각 기술을 보여주는 데 필요한 코드만 포함되어 있습니다. 전체 예제 코드는 GitHub에 있습니다. 이 위치에서 단일 소스 파일을 다운로드하거나 리포지토리를 로컬로 복사하여 모든 예제를 빌드하고 실행할 수 있습니다.

주제• Amazon S3 버킷 생성, 나열 및 삭제 (p. 87)• Amazon S3 객체 작업 수행 (p. 91)

Amazon S3 버킷 생성, 나열 및 삭제Amazon S3의 모든 객체(파일)는 버킷에 있어야 합니다. 버킷은 객체 모음(컨테이너)입니다. 각 버킷은 고유한 키(이름)을 갖고 있어야 합니다. 버킷 및 관련 구성에 대한 자세한 내용은 Amazon S3 Developer Guide의Amazon S3 버킷을 사용한 작업을 참조하십시오.

Note

모범 사례Amazon S3 버킷에서 AbortIncompleteMultipartUpload 수명 주기 규칙을 활성화하는 것이 좋습니다.이 규칙은 시작된 후 지정된 일수 내에 완료되지 않은 멀티파트 업로드를 중단하도록 Amazon S3에지시합니다. 설정된 시간 제한을 초과하면 Amazon S3가 업로드를 중단한 후 완료되지 않은 업로드데이터를 삭제합니다.자세한 내용은 Amazon S3 User Guide의 버전 관리를 사용하는 버킷의 수명 주기 구성을 참조하십시오.

Note

이 코드 조각에서는 개발자가 Java 2.0용 AWS SDK 사용 (p. 13)의 내용을 이해하고 개발을 위한AWS 자격 증명 및 리전 설정 (p. 5)의 정보를 사용하여 기본 AWS 자격 증명을 구성했다고 가정합니다.

주제

87

Java용 AWS SDK 버전 2 개발자 안내서버킷 작업

• 버킷 만들기 (p. 88)• 버킷 목록 나열 (p. 88)• 버킷 삭제 (p. 89)

버킷 만들기CreateBucketRequest를 빌드하고 버킷 이름을 제공합니다. S3Client의 createBucket 메서드에 전달합니다. 다음 예제처럼 S3Client를 사용하여 버킷 나열이나 삭제 같은 추가 작업을 수행합니다.

가져오기

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.s3.S3Client;import software.amazon.awssdk.services.s3.model.CreateBucketConfiguration;import software.amazon.awssdk.services.s3.model.CreateBucketRequest;import software.amazon.awssdk.services.s3.model.DeleteBucketRequest;import software.amazon.awssdk.services.s3.model.ListBucketsRequest;import software.amazon.awssdk.services.s3.model.ListBucketsResponse;

코드

먼저 S3Client를 생성합니다.

Region region = Region.US_WEST_2; S3Client s3 = S3Client.builder().region(region).build();

버킷 생성 요청을 만듭니다.

Region region = Region.US_WEST_2;S3Client s3 = S3Client.builder().region(region).build(); String bucket = "bucket" + System.currentTimeMillis();System.out.println(bucket);

// Create bucketCreateBucketRequest createBucketRequest = CreateBucketRequest .builder() .bucket(bucket) .createBucketConfiguration(CreateBucketConfiguration.builder() .locationConstraint(region.id()) .build()) .build();s3.createBucket(createBucketRequest);

GitHub의 전체 예제를 참조하십시오.

버킷 목록 나열ListBucketsRequest를 빌드합니다. S3Client의 listBuckets 메서드를 사용하여 버킷 목록을 검색합니다.요청이 성공하면 ListBucketsResponse가 반환됩니다. 이 요청 객체를 사용하여 버킷 목록을 검색합니다.

가져오기

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.s3.S3Client;import software.amazon.awssdk.services.s3.model.CreateBucketConfiguration;

88

Java용 AWS SDK 버전 2 개발자 안내서버킷 작업

import software.amazon.awssdk.services.s3.model.CreateBucketRequest;import software.amazon.awssdk.services.s3.model.DeleteBucketRequest;import software.amazon.awssdk.services.s3.model.ListBucketsRequest;import software.amazon.awssdk.services.s3.model.ListBucketsResponse;

코드

먼저 S3Client를 생성합니다.

Region region = Region.US_WEST_2; S3Client s3 = S3Client.builder().region(region).build();

버킷 나열 요청을 만듭니다.

// List bucketsListBucketsRequest listBucketsRequest = ListBucketsRequest.builder().build();ListBucketsResponse listBucketsResponse = s3.listBuckets(listBucketsRequest);listBucketsResponse.buckets().stream().forEach(x -> System.out.println(x.name()));

GitHub의 전체 예제를 참조하십시오.

버킷 삭제Amazon S3 버킷을 삭제하려면 먼저 버킷이 비어 있는지 확인해야 합니다. 비어 있지 않으면 서비스에 오류가 발생합니다. 버전 지정된 버킷이 있으면 버킷과 연결된 버전 지정된 객체도 모두 삭제해야 합니다.

주제• 버킷의 객체 삭제 (p. 89)• 빈 버킷 삭제 (p. 90)

버킷의 객체 삭제ListObjectsV2Request를 빌드하고 S3Client의 listObjects 메서드를 사용하여 버킷의 객체 목록을 검색합니다. 그런 후 삭제할 각 객체에 deleteObject 메서드를 사용합니다.

가져오기

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.s3.S3Client;import software.amazon.awssdk.services.s3.model.CreateBucketConfiguration;import software.amazon.awssdk.services.s3.model.CreateBucketRequest;import software.amazon.awssdk.services.s3.model.DeleteBucketRequest;import software.amazon.awssdk.services.s3.model.ListBucketsRequest;import software.amazon.awssdk.services.s3.model.ListBucketsResponse;

코드

먼저 S3Client를 생성합니다.

Region region = Region.US_WEST_2; S3Client s3 = S3Client.builder().region(region).build();

ListObjectsV2Request listObjectsV2Request = ListObjectsV2Request.builder().bucket(bucket2).build();ListObjectsV2Response listObjectsV2Response;

89

Java용 AWS SDK 버전 2 개발자 안내서버킷 작업

do { listObjectsV2Response = s3.listObjectsV2(listObjectsV2Request); for (S3Object s3Object : listObjectsV2Response.contents()) { s3.deleteObject(DeleteObjectRequest.builder().bucket(bucket2).key(s3Object.key()).build()); }

listObjectsV2Request = ListObjectsV2Request.builder().bucket(bucket2) .continuationToken(listObjectsV2Response.nextContinuationToken()) .build();

} while (listObjectsV2Response.isTruncated());

GitHub의 전체 예제를 참조하십시오.

빈 버킷 삭제버킷 이름으로 DeleteBucketRequest를 빌드하고 S3Client의 deleteBucket 메서드에 전달합니다.

가져오기

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.s3.S3Client;import software.amazon.awssdk.services.s3.model.CreateBucketConfiguration;import software.amazon.awssdk.services.s3.model.CreateBucketRequest;import software.amazon.awssdk.services.s3.model.DeleteBucketRequest;import software.amazon.awssdk.services.s3.model.ListBucketsRequest;import software.amazon.awssdk.services.s3.model.ListBucketsResponse;

코드

먼저 S3Client를 생성합니다.

ListObjectsV2Request listObjectsV2Request = ListObjectsV2Request.builder().bucket(bucket2).build();ListObjectsV2Response listObjectsV2Response;do { listObjectsV2Response = s3.listObjectsV2(listObjectsV2Request); for (S3Object s3Object : listObjectsV2Response.contents()) { s3.deleteObject(DeleteObjectRequest.builder().bucket(bucket2).key(s3Object.key()).build()); }

listObjectsV2Request = ListObjectsV2Request.builder().bucket(bucket2) .continuationToken(listObjectsV2Response.nextContinuationToken()) .build();

} while (listObjectsV2Response.isTruncated());

버킷의 모든 객체를 삭제합니다.

ListObjectsV2Request listObjectsV2Request = ListObjectsV2Request.builder().bucket(bucket2).build();ListObjectsV2Response listObjectsV2Response;do { listObjectsV2Response = s3.listObjectsV2(listObjectsV2Request); for (S3Object s3Object : listObjectsV2Response.contents()) { s3.deleteObject(DeleteObjectRequest.builder().bucket(bucket2).key(s3Object.key()).build());

90

Java용 AWS SDK 버전 2 개발자 안내서객체 작업

}

listObjectsV2Request = ListObjectsV2Request.builder().bucket(bucket2) .continuationToken(listObjectsV2Response.nextContinuationToken()) .build();

} while (listObjectsV2Response.isTruncated());

GitHub의 전체 예제를 참조하십시오.

Amazon S3 객체 작업 수행Amazon S3 객체는 데이터 모음 또는 파일을 나타냅니다. 모든 객체가 버킷 (p. 87)에 포함되어야 합니다.

Note

모범 사례Amazon S3 버킷에서 AbortIncompleteMultipartUpload 수명 주기 규칙을 활성화하는 것이 좋습니다.이 규칙은 시작된 후 지정된 일수 내에 완료되지 않은 멀티파트 업로드를 중단하도록 Amazon S3에지시합니다. 설정된 시간 제한을 초과하면 Amazon S3가 업로드를 중단한 후 완료되지 않은 업로드데이터를 삭제합니다.자세한 내용은 Amazon S3 User Guide의 버전 관리를 사용하는 버킷의 수명 주기 구성을 참조하십시오.

Note

이 코드 조각에서는 개발자가 Java 2.0용 AWS SDK 사용 (p. 13)의 내용을 이해하고 개발을 위한AWS 자격 증명 및 리전 설정 (p. 5)의 정보를 사용하여 기본 AWS 자격 증명을 구성했다고 가정합니다.

주제• 객체 업로드 (p. 91)• 객체의 멀티파트 업로드 (p. 92)• 객체 다운로드 (p. 93)• 객체 삭제 (p. 94)• 객체 복사 (p. 95)• 객체 목록 생성 (p. 96)

객체 업로드PutObjectRequest를 빌드하고, 버킷 이름과 키 이름을 제공합니다. 그런 다음 객체 내용과PutObjectRequest 객체가 포함된 RequestBody와 함께 S3Client의 putObject 메서드를 사용합니다. 버킷 이름이 존재해야 합니다. 그렇지 않으면 서비스에 오류가 발생합니다.

가져오기

import java.io.IOException;import java.nio.ByteBuffer;import java.nio.file.Paths;import java.util.Random;import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.s3.S3Client;import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadRequest;import software.amazon.awssdk.services.s3.model.CompletedMultipartUpload;

91

Java용 AWS SDK 버전 2 개발자 안내서객체 작업

import software.amazon.awssdk.services.s3.model.CompletedPart;import software.amazon.awssdk.services.s3.model.CreateBucketConfiguration;import software.amazon.awssdk.services.s3.model.CreateBucketRequest;import software.amazon.awssdk.services.s3.model.CreateMultipartUploadRequest;import software.amazon.awssdk.services.s3.model.CreateMultipartUploadResponse;import software.amazon.awssdk.services.s3.model.DeleteBucketRequest;import software.amazon.awssdk.services.s3.model.DeleteObjectRequest;import software.amazon.awssdk.services.s3.model.GetObjectRequest;import software.amazon.awssdk.services.s3.model.ListObjectsV2Request;import software.amazon.awssdk.services.s3.model.ListObjectsV2Response;import software.amazon.awssdk.services.s3.model.PutObjectRequest;import software.amazon.awssdk.services.s3.model.S3Object;import software.amazon.awssdk.services.s3.model.UploadPartRequest;import software.amazon.awssdk.services.s3.paginators.ListObjectsV2Iterable;import software.amazon.awssdk.core.sync.RequestBody;import software.amazon.awssdk.core.sync.ResponseTransformer;

코드

Region region = Region.US_WEST_2;s3 = S3Client.builder().region(region).build();

String bucket = "bucket" + System.currentTimeMillis();String key = "key";

createBucket(bucket, region);

// Put Objects3.putObject(PutObjectRequest.builder().bucket(bucket).key(key) .build(), RequestBody.fromByteBuffer(getRandomByteBuffer(10_000)));

GitHub의 전체 예제를 참조하십시오.

객체의 멀티파트 업로드S3Client의 createMultipartUpload 메서드를 사용하여 업로드 ID를 가져옵니다. 그런 다음uploadPart 메서드로 각 파트를 업로드합니다. 마지막으로 S3Client의 completeMultipartUpload 메서드를 사용하여 모든 업로드 파트를 병합하고 업로드 작업을 완료하도록 Amazon S3에 지시합니다.

가져오기

import java.io.IOException;import java.nio.ByteBuffer;import java.nio.file.Paths;import java.util.Random;import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.s3.S3Client;import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadRequest;import software.amazon.awssdk.services.s3.model.CompletedMultipartUpload;import software.amazon.awssdk.services.s3.model.CompletedPart;import software.amazon.awssdk.services.s3.model.CreateBucketConfiguration;import software.amazon.awssdk.services.s3.model.CreateBucketRequest;import software.amazon.awssdk.services.s3.model.CreateMultipartUploadRequest;import software.amazon.awssdk.services.s3.model.CreateMultipartUploadResponse;import software.amazon.awssdk.services.s3.model.DeleteBucketRequest;import software.amazon.awssdk.services.s3.model.DeleteObjectRequest;import software.amazon.awssdk.services.s3.model.GetObjectRequest;import software.amazon.awssdk.services.s3.model.ListObjectsV2Request;import software.amazon.awssdk.services.s3.model.ListObjectsV2Response;

92

Java용 AWS SDK 버전 2 개발자 안내서객체 작업

import software.amazon.awssdk.services.s3.model.PutObjectRequest;import software.amazon.awssdk.services.s3.model.S3Object;import software.amazon.awssdk.services.s3.model.UploadPartRequest;import software.amazon.awssdk.services.s3.paginators.ListObjectsV2Iterable;import software.amazon.awssdk.core.sync.RequestBody;import software.amazon.awssdk.core.sync.ResponseTransformer;

코드

// First create a multipart upload and get upload id CreateMultipartUploadRequest createMultipartUploadRequest = CreateMultipartUploadRequest.builder() .bucket(bucketName).key(key) .build();CreateMultipartUploadResponse response = s3.createMultipartUpload(createMultipartUploadRequest);String uploadId = response.uploadId();System.out.println(uploadId);

// Upload all the different parts of the objectUploadPartRequest uploadPartRequest1 = UploadPartRequest.builder().bucket(bucketName).key(key) .uploadId(uploadId) .partNumber(1).build();String etag1 = s3.uploadPart(uploadPartRequest1, RequestBody.fromByteBuffer(getRandomByteBuffer(5 * MB))).eTag();CompletedPart part1 = CompletedPart.builder().partNumber(1).eTag(etag1).build();

UploadPartRequest uploadPartRequest2 = UploadPartRequest.builder().bucket(bucketName).key(key) .uploadId(uploadId) .partNumber(2).build();String etag2 = s3.uploadPart(uploadPartRequest2, RequestBody.fromByteBuffer(getRandomByteBuffer(3 * MB))).eTag();CompletedPart part2 = CompletedPart.builder().partNumber(2).eTag(etag2).build();

// Finally call completeMultipartUpload operation to tell S3 to merge all uploaded// parts and finish the multipart operation.CompletedMultipartUpload completedMultipartUpload = CompletedMultipartUpload.builder().parts(part1, part2).build();CompleteMultipartUploadRequest completeMultipartUploadRequest = CompleteMultipartUploadRequest.builder().bucket(bucketName).key(key).uploadId(uploadId) .multipartUpload(completedMultipartUpload).build();s3.completeMultipartUpload(completeMultipartUploadRequest);

GitHub의 전체 예제를 참조하십시오.

객체 다운로드GetObjectRequest를 빌드하고, 버킷 이름과 키 이름을 제공합니다. S3Client의 getObject 메서드를 사용하고 GetObjectRequest 객체 및 ResponseTransformer 객체에 전달합니다.ResponseTransformer가 지정 파일이나 스트림에 응답 내용을 작성하는 응답 핸들러를 생성합니다.

다음은 객체 내용을 쓸 파일 이름을 지정하는 방법에 대한 예입니다.

가져오기

93

Java용 AWS SDK 버전 2 개발자 안내서객체 작업

import java.io.IOException;import java.nio.ByteBuffer;import java.nio.file.Paths;import java.util.Random;import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.s3.S3Client;import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadRequest;import software.amazon.awssdk.services.s3.model.CompletedMultipartUpload;import software.amazon.awssdk.services.s3.model.CompletedPart;import software.amazon.awssdk.services.s3.model.CreateBucketConfiguration;import software.amazon.awssdk.services.s3.model.CreateBucketRequest;import software.amazon.awssdk.services.s3.model.CreateMultipartUploadRequest;import software.amazon.awssdk.services.s3.model.CreateMultipartUploadResponse;import software.amazon.awssdk.services.s3.model.DeleteBucketRequest;import software.amazon.awssdk.services.s3.model.DeleteObjectRequest;import software.amazon.awssdk.services.s3.model.GetObjectRequest;import software.amazon.awssdk.services.s3.model.ListObjectsV2Request;import software.amazon.awssdk.services.s3.model.ListObjectsV2Response;import software.amazon.awssdk.services.s3.model.PutObjectRequest;import software.amazon.awssdk.services.s3.model.S3Object;import software.amazon.awssdk.services.s3.model.UploadPartRequest;import software.amazon.awssdk.services.s3.paginators.ListObjectsV2Iterable;import software.amazon.awssdk.core.sync.RequestBody;import software.amazon.awssdk.core.sync.ResponseTransformer;

코드

s3.getObject(GetObjectRequest.builder().bucket(bucket).key(key).build(), ResponseTransformer.toFile(Paths.get("multiPartKey")));

GitHub의 전체 예제를 참조하십시오.

객체 삭제DeleteObjectRequest를 빌드하고, 버킷 이름과 키 이름을 제공합니다. S3Client의 deleteObject 메서드를사용하여 삭제할 버킷 및 객체 이름을 전달합니다. 지정한 버킷 및 객체 키가 존재해야 합니다. 그렇지 않으면 서비스에 오류가 발생합니다.

가져오기

import java.io.IOException;import java.nio.ByteBuffer;import java.nio.file.Paths;import java.util.Random;import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.s3.S3Client;import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadRequest;import software.amazon.awssdk.services.s3.model.CompletedMultipartUpload;import software.amazon.awssdk.services.s3.model.CompletedPart;import software.amazon.awssdk.services.s3.model.CreateBucketConfiguration;import software.amazon.awssdk.services.s3.model.CreateBucketRequest;import software.amazon.awssdk.services.s3.model.CreateMultipartUploadRequest;import software.amazon.awssdk.services.s3.model.CreateMultipartUploadResponse;import software.amazon.awssdk.services.s3.model.DeleteBucketRequest;import software.amazon.awssdk.services.s3.model.DeleteObjectRequest;import software.amazon.awssdk.services.s3.model.GetObjectRequest;import software.amazon.awssdk.services.s3.model.ListObjectsV2Request;import software.amazon.awssdk.services.s3.model.ListObjectsV2Response;import software.amazon.awssdk.services.s3.model.PutObjectRequest;import software.amazon.awssdk.services.s3.model.S3Object;import software.amazon.awssdk.services.s3.model.UploadPartRequest;

94

Java용 AWS SDK 버전 2 개발자 안내서객체 작업

import software.amazon.awssdk.services.s3.paginators.ListObjectsV2Iterable;import software.amazon.awssdk.core.sync.RequestBody;import software.amazon.awssdk.core.sync.ResponseTransformer;

코드

DeleteObjectRequest deleteObjectRequest = DeleteObjectRequest.builder().bucket(bucket).key(key).build();s3.deleteObject(deleteObjectRequest);

GitHub의 전체 예제를 참조하십시오.

객체 복사CopyObjectRequest를 빌드하고 객체가 복사되는 버킷 이름, URL 인코딩된 문자열 값(URLEncoder.encode메서드 참조) 및 객체의 키 이름을 지정합니다. S3Client의 copyObject 메서드를 사용하고CopyObjectRequest 객체를 전달합니다. 지정한 버킷 및 객체 키가 존재해야 합니다. 그렇지 않으면 서비스에 오류가 발생합니다.

가져오기

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.s3.S3Client;import software.amazon.awssdk.services.s3.model.CopyObjectRequest;import software.amazon.awssdk.services.s3.model.CopyObjectResponse;import software.amazon.awssdk.services.s3.model.S3Exception;

import java.io.UnsupportedEncodingException;import java.net.URLEncoder;import java.nio.charset.StandardCharsets;

코드

String object_key = args[0];String from_bucket = args[1];String to_bucket = args[2];

System.out.format("Copying object %s from bucket %s to %s\n", object_key, from_bucket, to_bucket);Region region = Region.US_WEST_2;S3Client s3 = S3Client.builder().region(region).build();String encodedUrl = null;try { encodedUrl = URLEncoder.encode(from_bucket + "/" + object_key, StandardCharsets.UTF_8.toString());} catch (UnsupportedEncodingException e) { System.out.println("URL could not be encoded: " + e.getMessage());}

CopyObjectRequest copyReq = CopyObjectRequest.builder() .copySource(encodedUrl) .bucket(to_bucket) .key(object_key) .build();

try { CopyObjectResponse copyRes = s3.copyObject(copyReq); System.out.println(copyRes.copyObjectResult().toString());} catch (S3Exception e) {

95

Java용 AWS SDK 버전 2 개발자 안내서객체 작업

System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1);}System.out.println("Done!");

GitHub의 전체 예제를 참조하십시오.

객체 목록 생성ListObjectsRequest를 빌드하고 버킷 이름을 지정합니다. 그런 다음 S3Client의 listObjects 메서드를 호출하고 ListObjectsRequest 객체를 전달합니다. 이 메서드는 버킷의 모든 객체를 포함하는ListObjectsResponse를 반환합니다. 이 객체의 contents 메서드를 호출하여 객체 목록을 가져올 수 있습니다. 다음 코드 예제와 같이 이 목록을 반복하여 객체를 표시할 수 있습니다.

가져오기

import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.s3.S3Client;import software.amazon.awssdk.services.s3.model.ListObjectsRequest;import software.amazon.awssdk.services.s3.model.ListObjectsResponse;import software.amazon.awssdk.services.s3.model.S3Exception;import software.amazon.awssdk.services.s3.model.S3Object;

import java.util.List;import java.util.ListIterator;

코드

String bucketName = args[0];

try { Region region = Region.US_WEST_2; S3Client s3 = S3Client.builder().region(region).build();

ListObjectsRequest listObjects = ListObjectsRequest .builder() .bucket(bucketName) .build();

ListObjectsResponse res = s3.listObjects(listObjects); List<S3Object> objects = res.contents();

for (ListIterator iterVals = objects.listIterator(); iterVals.hasNext(); ) { S3Object myValue = (S3Object) iterVals.next(); System.out.print("\n The name of the key is " + myValue.key()); System.out.print("\n The object is " + calKb(myValue.size()) + " KBs"); System.out.print("\n The owner is " + myValue.owner()); } } catch (S3Exception e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } }

//convert bytes to kbs private static long calKb(Long val) { return val/1024;

}

GitHub의 전체 예제를 참조하십시오.

96

Java용 AWS SDK 버전 2 개발자 안내서Amazon S3 미리 서명된 예제

Amazon S3 미리 서명된 URL을 사용한 작업S3Presigner 객체를 사용하여 Amazon S3SdkRequest에 서명함으로써 호출자에 대한 인증을 요구하지 않고 해당 객체가 실행되도록 할 수 있습니다. 예를 들어 Alice가 S3 객체에 대한 액세스 권한을 가지고 있고 해당 객체에 대한 액세스 권한을 Bob과 일시적으로 공유하려고 할 경우, Alice는 미리 서명된GetObjectRequest 객체를 생성하여 Bob이 Alice의 자격 증명에 액세스하지 않고도 객체를 다운로드할 수 있도록 함으로써 안전하게 Bob과 객체를 공유할 수 있습니다.

주제• 미리 서명된 URL 생성 및 객체 업로드 (p. 97)• 미리 서명된 객체 가져오기 (p. 98)

미리 서명된 URL 생성 및 객체 업로드클라이언트 객체를 나타내는 S3Presigner 객체를 빌드합니다. 그런 다음 이후에 추가 서명 또는 인증 없이실행될 수 있는 PresignedPutObjectRequest 객체를 생성합니다. 이 객체를 생성할 때 버킷 이름과 키 이름을지정할 수 있습니다. 또한 signatureDuration 메서드를 호출하여 자격 증명을 사용하지 않고 버킷에 액세스할 수 있는 시간(분)을 지정할 수도 있습니다(아래 코드 예제 참조).

PresignedPutObjectRequest 객체를 사용하여 url 메서드를 호출함으로써 URL을 얻을 수 있습니다.

가져오기

import java.io.IOException;import java.io.OutputStreamWriter;import java.net.HttpURLConnection;import java.net.URL;import java.time.Duration;

import software.amazon.awssdk.services.lambda.model.ServiceException;import software.amazon.awssdk.services.s3.presigner.model.PresignedPutObjectRequest;import software.amazon.awssdk.services.s3.presigner.S3Presigner;

코드

다음 Java 코드 예제는 미리 서명된 S3 버킷에 내용을 업로드합니다.

String bucketName = args[0]; String keyName = args[1];

// Create an S3Presigner using the default AWS Region and credentials S3Presigner presigner = S3Presigner.create();

try { PresignedPutObjectRequest presignedRequest = presigner.presignPutObject(z -> z.signatureDuration(Duration.ofMinutes(10)) .putObjectRequest(por -> por.bucket(bucketName).key(keyName)));

System.out.println("Pre-signed URL to upload a file to: " + presignedRequest.url()); System.out.println("Which HTTP method needs to be used when uploading a file: " + presignedRequest.httpRequest().method());

//Upload content to the bucket by using this URL URL url = presignedRequest.url();

97

Java용 AWS SDK 버전 2 개발자 안내서미리 서명된 객체 가져오기

// Create the connection and use it to upload the new object by using the pre-signed URL HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoOutput(true); connection.setRequestProperty("Content-Type","text/plain"); connection.setRequestMethod("PUT"); OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream()); out.write("This text uploaded as an object via presigned URL."); out.close();

connection.getResponseCode(); System.out.println("HTTP response code: " + connection.getResponseCode());

// It's recommended that you close the S3Presigner when it is done being used, because some credential // providers (e.g. if your AWS profile is configured to assume an STS role) require system resources // that need to be freed. If you are using one S3Presigner per application (as recommended), this // usually isn't needed presigner.close();

} catch (ServiceException | IOException e) { e.getStackTrace(); }

GitHub의 전체 예제를 참조하십시오.

미리 서명된 객체 가져오기클라이언트 객체를 나타내는 S3Presigner 객체를 빌드합니다. 그런 다음 GetObjectRequest 객체를생성하고 버킷 이름과 키 이름을 지정합니다. 또한 이후에 추가 서명 또는 인증 없이 실행될 수 있는GetObjectPresignRequest 객체를 생성합니다. 이 객체를 생성할 때 signatureDuration 메서드를 호출하여 자격 증명을 사용하지 않고 버킷에 액세스할 수 있는 시간(분)을 지정할 수 있습니다(아래 코드 예제 참조).

S3Presigner 객체에 속한 presignGetObject 메서드를 호출하여 PresignedPutObjectRequest 객체를 생성합니다. 이 객체의 url 메서드를 호출하여 사용할 URL을 얻을 수 있습니다. URL을 확보했으면 다음 Java코드 예제와 같이 표준 HTTP Java 로직을 사용하여 버킷의 내용을 읽을 수 있습니다.

가져오기

import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.HttpURLConnection;import java.time.Duration;

import software.amazon.awssdk.services.lambda.model.ServiceException;import software.amazon.awssdk.services.s3.model.GetObjectRequest;import software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest;import software.amazon.awssdk.services.s3.presigner.model.PresignedGetObjectRequest;import software.amazon.awssdk.services.s3.presigner.S3Presigner;import software.amazon.awssdk.utils.IoUtils;

코드

다음 Java 코드 예제는 미리 서명된 S3 버킷의 내용을 읽습니다.

String bucketName = args[0];

98

Java용 AWS SDK 버전 2 개발자 안내서미리 서명된 객체 가져오기

String keyName = args[1];

// Create an S3Presigner by using the default AWS Region and credentials S3Presigner presigner = S3Presigner.create();

try {

// Create a GetObjectRequest to be pre-signed GetObjectRequest getObjectRequest = GetObjectRequest.builder() .bucket(bucketName) .key(keyName) .build();

// Create a GetObjectPresignRequest to specify the signature duration GetObjectPresignRequest getObjectPresignRequest = GetObjectPresignRequest.builder() .signatureDuration(Duration.ofMinutes(10)) .getObjectRequest(getObjectRequest) .build();

// Generate the presigned request PresignedGetObjectRequest presignedGetObjectRequest = presigner.presignGetObject(getObjectPresignRequest);

// Log the presigned URL System.out.println("Presigned URL: " + presignedGetObjectRequest.url());

// Create a JDK HttpURLConnection for communicating with S3 HttpURLConnection connection = (HttpURLConnection) presignedGetObjectRequest.url().openConnection();

// Specify any headers that the service needs (not needed when isBrowserExecutable is true) presignedGetObjectRequest.httpRequest().headers().forEach((header, values) -> { values.forEach(value -> { connection.addRequestProperty(header, value); }); });

// Send any request payload that the service needs (not needed when isBrowserExecutable is true) if (presignedGetObjectRequest.signedPayload().isPresent()) { connection.setDoOutput(true); try (InputStream signedPayload = presignedGetObjectRequest.signedPayload().get().asInputStream(); OutputStream httpOutputStream = connection.getOutputStream()) { IoUtils.copy(signedPayload, httpOutputStream); } }

// Download the result of executing the request try (InputStream content = connection.getInputStream()) { System.out.println("Service returned response: "); IoUtils.copy(content, System.out); }

// It's recommended that you close the S3Presigner when it is done being used, because some credential // providers (e.g. if your AWS profile is configured to assume an STS role) require system resources // that need to be freed. If you are using one S3Presigner per application (as recommended), this // usually isn't needed presigner.close();

99

Java용 AWS SDK 버전 2 개발자 안내서Amazon SQS 예제

} catch (ServiceException | IOException e) { e.getStackTrace(); }

GitHub의 전체 예제를 참조하십시오.

AWS SDK for Java를 사용하는 Amazon SQS 예제이 단원에서는 AWS SDK for Java 2.0를 사용하여 Amazon SQS를 프로그래밍하는 예제를 다룹니다.

다음 예제에는 각 기술을 보여주는 데 필요한 코드만 포함되어 있습니다. 전체 예제 코드는 GitHub에 있습니다. 이 위치에서 단일 소스 파일을 다운로드하거나 리포지토리를 로컬로 복사하여 모든 예제를 빌드하고 실행할 수 있습니다.

주제• Amazon SQS 메시지 대기열 작업 (p. 100)• Amazon SQS 메시지 전송, 수신 및 삭제 (p. 102)

Amazon SQS 메시지 대기열 작업메시지 대기열은 Amazon SQS에서 메시지를 안정적으로 전송하는 데 사용되는 논리적 컨테이너입니다. 표준과 선입선출(FIFO), 이렇게 두 가지 유형의 대기열이 있습니다. 이들 대기열과 이러한 유형 간의 차이에 대해 자세히 알아보려면 Amazon SQS 개발자 안내서를 참조하십시오.

이 주제에서는 AWS SDK for Java를 사용하여 Amazon SQS 대기열의 URL을 생성, 나열, 삭제 및 가져오는방법을 설명합니다.

대기열 생성SqsClient의 createQueue 메서드를 사용하고, 대기열 파리미터를 설명하는 CreateQueueRequest 객체를제공합니다.

가져오기

import software.amazon.awssdk.services.sqs.SqsClient;import software.amazon.awssdk.services.sqs.model.ChangeMessageVisibilityRequest;import software.amazon.awssdk.services.sqs.model.CreateQueueRequest;import software.amazon.awssdk.services.sqs.model.DeleteMessageRequest;import software.amazon.awssdk.services.sqs.model.DeleteQueueRequest;import software.amazon.awssdk.services.sqs.model.GetQueueUrlRequest;import software.amazon.awssdk.services.sqs.model.GetQueueUrlResponse;import software.amazon.awssdk.services.sqs.model.ListQueuesRequest;import software.amazon.awssdk.services.sqs.model.ListQueuesResponse;import software.amazon.awssdk.services.sqs.model.Message;import software.amazon.awssdk.services.sqs.model.ReceiveMessageRequest;import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequest;import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequestEntry;import software.amazon.awssdk.services.sqs.model.SendMessageRequest;

코드

CreateQueueRequest createQueueRequest = CreateQueueRequest.builder().queueName(queueName).build();sqsClient.createQueue(createQueueRequest);

100

Java용 AWS SDK 버전 2 개발자 안내서대기열 작업

GitHub의 전체 예제를 참조하십시오.

대기열 목록 나열계정의 Amazon SQS 대기열을 나열하려면 SqsClient의 listQueues 메서드를 ListQueuesRequest 객체와함께 호출합니다.

파라미터 없이 listQueues 오버로드를 사용하면 모든 대기열이 최대 1,000개까지 반환됩니다.ListQueuesRequest 객체에 대기열 이름 접두사를 지정해 접두사와 일치하는 대기열만 결과로 표시되도록 만들 수 있습니다.

가져오기

import software.amazon.awssdk.services.sqs.SqsClient;import software.amazon.awssdk.services.sqs.model.ChangeMessageVisibilityRequest;import software.amazon.awssdk.services.sqs.model.CreateQueueRequest;import software.amazon.awssdk.services.sqs.model.DeleteMessageRequest;import software.amazon.awssdk.services.sqs.model.DeleteQueueRequest;import software.amazon.awssdk.services.sqs.model.GetQueueUrlRequest;import software.amazon.awssdk.services.sqs.model.GetQueueUrlResponse;import software.amazon.awssdk.services.sqs.model.ListQueuesRequest;import software.amazon.awssdk.services.sqs.model.ListQueuesResponse;import software.amazon.awssdk.services.sqs.model.Message;import software.amazon.awssdk.services.sqs.model.ReceiveMessageRequest;import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequest;import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequestEntry;import software.amazon.awssdk.services.sqs.model.SendMessageRequest;

코드

String prefix = "que";ListQueuesRequest listQueuesRequest = ListQueuesRequest.builder().queueNamePrefix(prefix).build();ListQueuesResponse listQueuesResponse = sqsClient.listQueues(listQueuesRequest);for (String url : listQueuesResponse.queueUrls()) { System.out.println(url);}

GitHub의 전체 예제를 참조하십시오.

대기열의 URL 가져오기SqsClient의 getQueueUrl 메서드를 GetQueueUrlRequest 객체와 함께 호출합니다.

가져오기

import software.amazon.awssdk.services.sqs.SqsClient;import software.amazon.awssdk.services.sqs.model.ChangeMessageVisibilityRequest;import software.amazon.awssdk.services.sqs.model.CreateQueueRequest;import software.amazon.awssdk.services.sqs.model.DeleteMessageRequest;import software.amazon.awssdk.services.sqs.model.DeleteQueueRequest;import software.amazon.awssdk.services.sqs.model.GetQueueUrlRequest;import software.amazon.awssdk.services.sqs.model.GetQueueUrlResponse;import software.amazon.awssdk.services.sqs.model.ListQueuesRequest;import software.amazon.awssdk.services.sqs.model.ListQueuesResponse;import software.amazon.awssdk.services.sqs.model.Message;import software.amazon.awssdk.services.sqs.model.ReceiveMessageRequest;import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequest;import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequestEntry;import software.amazon.awssdk.services.sqs.model.SendMessageRequest;

101

Java용 AWS SDK 버전 2 개발자 안내서메시지 작업

코드

GetQueueUrlResponse getQueueUrlResponse = sqsClient.getQueueUrl(GetQueueUrlRequest.builder().queueName(queueName).build());String queueUrl = getQueueUrlResponse.queueUrl();System.out.println(queueUrl);

GitHub의 전체 예제를 참조하십시오.

대기열 삭제대기열의 URL (p. 101)을 DeleteMessageRequest 객체에 제공합니다. SqsClient의 deleteQueue 메서드를 호출합니다.

가져오기

import software.amazon.awssdk.services.sqs.SqsClient;import software.amazon.awssdk.services.sqs.model.ChangeMessageVisibilityRequest;import software.amazon.awssdk.services.sqs.model.CreateQueueRequest;import software.amazon.awssdk.services.sqs.model.DeleteMessageRequest;import software.amazon.awssdk.services.sqs.model.DeleteQueueRequest;import software.amazon.awssdk.services.sqs.model.GetQueueUrlRequest;import software.amazon.awssdk.services.sqs.model.GetQueueUrlResponse;import software.amazon.awssdk.services.sqs.model.ListQueuesRequest;import software.amazon.awssdk.services.sqs.model.ListQueuesResponse;import software.amazon.awssdk.services.sqs.model.Message;import software.amazon.awssdk.services.sqs.model.ReceiveMessageRequest;import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequest;import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequestEntry;import software.amazon.awssdk.services.sqs.model.SendMessageRequest;

코드

for (Message message : messages) { DeleteMessageRequest deleteMessageRequest = DeleteMessageRequest.builder() .queueUrl(queueUrl) .receiptHandle(message.receiptHandle()) .build(); sqsClient.deleteMessage(deleteMessageRequest);}

GitHub의 전체 예제를 참조하십시오.

추가 정보• Amazon SQS Developer Guide의 Amazon SQS 대기열의 작동 방식• Amazon SQS API Reference의 CreateQueue• Amazon SQS API Reference의 GetQueueUrl• Amazon SQS API Reference의 ListQueues• Amazon SQS API Reference의 DeleteQueues

Amazon SQS 메시지 전송, 수신 및 삭제메시지는 분산된 구성 요소가 송신 및 수신할 수 있는 데이터 조각입니다. 메시지는 항상 SQS 대기열 (p. 100)을 사용하여 전달됩니다.

102

Java용 AWS SDK 버전 2 개발자 안내서메시지 작업

메시지 보내기SqsClient 클라이언트 sendMessage 메서드를 호출하여 Amazon SQS 대기열에 단일 메시지를 추가합니다. 대기열의 URL (p. 101), 메시지 본문 및 지연 값(초)(선택 사항)을 포함하는 SendMessageRequest 객체를 제공합니다.

가져오기

import software.amazon.awssdk.services.sqs.SqsClient;import software.amazon.awssdk.services.sqs.model.ChangeMessageVisibilityRequest;import software.amazon.awssdk.services.sqs.model.CreateQueueRequest;import software.amazon.awssdk.services.sqs.model.DeleteMessageRequest;import software.amazon.awssdk.services.sqs.model.DeleteQueueRequest;import software.amazon.awssdk.services.sqs.model.GetQueueUrlRequest;import software.amazon.awssdk.services.sqs.model.GetQueueUrlResponse;import software.amazon.awssdk.services.sqs.model.ListQueuesRequest;import software.amazon.awssdk.services.sqs.model.ListQueuesResponse;import software.amazon.awssdk.services.sqs.model.Message;import software.amazon.awssdk.services.sqs.model.ReceiveMessageRequest;import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequest;import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequestEntry;import software.amazon.awssdk.services.sqs.model.SendMessageRequest;

코드

sqsClient.sendMessage(SendMessageRequest.builder() .queueUrl(queueUrl) .messageBody("Hello world!") .delaySeconds(10) .build());

한 번의 요청에 여러 메시지를 전송SqsClientsendMessageBatch 메서드를 사용하여 단일 요청에서 메시지를 2개 이상 전송합니다. 이 메서드는 전송할 메시지 목록과 대기열 URL이 포함된 SendMessageBatchRequest를 가져옵니다. (각 메시지는SendMessageBatchRequestEntry임) 또 메시지의 지연 값을 설정해 특정 메시지 전송을 지연시킬 수 있습니다.

가져오기

import software.amazon.awssdk.services.sqs.SqsClient;import software.amazon.awssdk.services.sqs.model.ChangeMessageVisibilityRequest;import software.amazon.awssdk.services.sqs.model.CreateQueueRequest;import software.amazon.awssdk.services.sqs.model.DeleteMessageRequest;import software.amazon.awssdk.services.sqs.model.DeleteQueueRequest;import software.amazon.awssdk.services.sqs.model.GetQueueUrlRequest;import software.amazon.awssdk.services.sqs.model.GetQueueUrlResponse;import software.amazon.awssdk.services.sqs.model.ListQueuesRequest;import software.amazon.awssdk.services.sqs.model.ListQueuesResponse;import software.amazon.awssdk.services.sqs.model.Message;import software.amazon.awssdk.services.sqs.model.ReceiveMessageRequest;import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequest;import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequestEntry;import software.amazon.awssdk.services.sqs.model.SendMessageRequest;

코드

SendMessageBatchRequest sendMessageBatchRequest = SendMessageBatchRequest.builder() .queueUrl(queueUrl)

103

Java용 AWS SDK 버전 2 개발자 안내서메시지 작업

.entries(SendMessageBatchRequestEntry.builder().id("id1").messageBody("Hello from msg 1").build(), SendMessageBatchRequestEntry.builder().id("id2").messageBody("msg 2").delaySeconds(10).build()) .build();sqsClient.sendMessageBatch(sendMessageBatchRequest);

GitHub의 전체 예제를 참조하십시오.

메시지 검색SqsClientreceiveMessage 메서드를 호출하여 현재 대기열에 있는 메시지를 검색합니다. 이 메서드는 대기열 URL이 포함된 ReceiveMessageRequest를 가져옵니다. 또 반환할 메시지의 최대 수를 지정할 수 있습니다. 메시지는 Message 객체의 목록으로 반환됩니다.

가져오기

import software.amazon.awssdk.services.sqs.SqsClient;import software.amazon.awssdk.services.sqs.model.ChangeMessageVisibilityRequest;import software.amazon.awssdk.services.sqs.model.CreateQueueRequest;import software.amazon.awssdk.services.sqs.model.DeleteMessageRequest;import software.amazon.awssdk.services.sqs.model.DeleteQueueRequest;import software.amazon.awssdk.services.sqs.model.GetQueueUrlRequest;import software.amazon.awssdk.services.sqs.model.GetQueueUrlResponse;import software.amazon.awssdk.services.sqs.model.ListQueuesRequest;import software.amazon.awssdk.services.sqs.model.ListQueuesResponse;import software.amazon.awssdk.services.sqs.model.Message;import software.amazon.awssdk.services.sqs.model.ReceiveMessageRequest;import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequest;import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequestEntry;import software.amazon.awssdk.services.sqs.model.SendMessageRequest;

코드

ReceiveMessageRequest receiveMessageRequest = ReceiveMessageRequest.builder() .queueUrl(queueUrl) .maxNumberOfMessages(5) .build();List<Message> messages= sqsClient.receiveMessage(receiveMessageRequest).messages();

수신 후 메시지 삭제메시지를 수신하고 내용을 처리한 후에는 메시지의 수신 핸들과 대기열 URL을 SqsClientdeleteMessage메서드로 전송하여 대기열에서 메시지를 삭제합니다.

가져오기

import software.amazon.awssdk.services.sqs.SqsClient;import software.amazon.awssdk.services.sqs.model.ChangeMessageVisibilityRequest;import software.amazon.awssdk.services.sqs.model.CreateQueueRequest;import software.amazon.awssdk.services.sqs.model.DeleteMessageRequest;import software.amazon.awssdk.services.sqs.model.DeleteQueueRequest;import software.amazon.awssdk.services.sqs.model.GetQueueUrlRequest;import software.amazon.awssdk.services.sqs.model.GetQueueUrlResponse;import software.amazon.awssdk.services.sqs.model.ListQueuesRequest;import software.amazon.awssdk.services.sqs.model.ListQueuesResponse;import software.amazon.awssdk.services.sqs.model.Message;import software.amazon.awssdk.services.sqs.model.ReceiveMessageRequest;import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequest;

104

Java용 AWS SDK 버전 2 개발자 안내서Amazon Transcribe 예제

import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequestEntry;import software.amazon.awssdk.services.sqs.model.SendMessageRequest;

코드

for (Message message : messages) { DeleteMessageRequest deleteMessageRequest = DeleteMessageRequest.builder() .queueUrl(queueUrl) .receiptHandle(message.receiptHandle()) .build(); sqsClient.deleteMessage(deleteMessageRequest);}

GitHub의 전체 예제를 참조하십시오.

추가 정보• Amazon SQS Developer Guide의 Amazon SQS 대기열의 작동 방식• Amazon SQS API Reference의 SendMessage• Amazon SQS API Reference의 SendMessageBatch• Amazon SQS API Reference의 ReceiveMessage• Amazon SQS API Reference의 DeleteMessage

AWS SDK for Java를 사용하는 Amazon Transcribe예제

이 단원에서는 AWS SDK for Java 2.0을 사용하여 Amazon Transcribe를 프로그래밍하는 예제를 제공합니다.

다음 예제에는 각 기술을 보여주는 데 필요한 코드만 포함되어 있습니다. 전체 예제 코드는 GitHub에 있습니다. 이 위치에서 단일 소스 파일을 다운로드하거나 리포지토리를 로컬로 복사하여 모든 예제를 빌드하고 실행할 수 있습니다.

주제• Amazon Transcribe 작업 (p. 105)

Amazon Transcribe 작업다음 예제는 Amazon Transcribe를 사용하여 양방향 스트리밍이 작동하는 방식을 보여 줍니다. 양방향 스트리밍은 서비스로 향하는 데이터 스트림과 실시간으로 다시 수신되는 데이터 스트림이 둘 다 있다는 의미입니다. 예제에서는 Amazon Transcribe 스트리밍 트랜스크립션을 사용하여 오디오 스트림을 보내고 트랜스크립션된 텍스트의 스트림을 실시간으로 다시 수신합니다.

이 기능에 대한 자세한 내용은 Amazon Transcribe Developer Guide의 스트리밍 트랜스크립션을 참조하십시오.

Amazon Transcribe 사용을 시작하려면 Amazon Transcribe Developer Guide의 시작하기를 참조하십시오.

마이크 설정이 코드는 javax.sound.sampled 패키지를 사용하여 입력 디바이스에서 오디오를 스트리밍합니다.

105

Java용 AWS SDK 버전 2 개발자 안내서Amazon Transcribe 작업

코드

import javax.sound.sampled.AudioFormat;import javax.sound.sampled.AudioSystem;import javax.sound.sampled.DataLine;import javax.sound.sampled.TargetDataLine;

public class Microphone {

public static TargetDataLine get() throws Exception { AudioFormat format = new AudioFormat(16000, 16, 1, true, false); DataLine.Info datalineInfo = new DataLine.Info(TargetDataLine.class, format);

TargetDataLine dataLine = (TargetDataLine) AudioSystem.getLine(datalineInfo); dataLine.open(format);

return dataLine; }}

GitHub의 전체 예제를 참조하십시오.

게시자 생성이 코드는 Amazon Transcribe 오디오 스트림에서 오디오 데이터를 게시하는 게시자를 구현합니다.

코드

import java.io.IOException;import java.io.InputStream;import java.io.UncheckedIOException;import java.nio.ByteBuffer;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.atomic.AtomicLong;import org.reactivestreams.Publisher;import org.reactivestreams.Subscriber;import org.reactivestreams.Subscription;import software.amazon.awssdk.core.SdkBytes;import software.amazon.awssdk.services.transcribestreaming.model.AudioEvent;import software.amazon.awssdk.services.transcribestreaming.model.AudioStream;

public class AudioStreamPublisher implements Publisher<AudioStream> { private final InputStream inputStream;

public AudioStreamPublisher(InputStream inputStream) { this.inputStream = inputStream; }

@Override public void subscribe(Subscriber<? super AudioStream> s) { s.onSubscribe(new SubscriptionImpl(s, inputStream)); }

private class SubscriptionImpl implements Subscription { private static final int CHUNK_SIZE_IN_BYTES = 1024 * 1; private ExecutorService executor = Executors.newFixedThreadPool(1); private AtomicLong demand = new AtomicLong(0);

private final Subscriber<? super AudioStream> subscriber;

106

Java용 AWS SDK 버전 2 개발자 안내서Amazon Transcribe 작업

private final InputStream inputStream;

private SubscriptionImpl(Subscriber<? super AudioStream> s, InputStream inputStream) { this.subscriber = s; this.inputStream = inputStream; }

@Override public void request(long n) { if (n <= 0) { subscriber.onError(new IllegalArgumentException("Demand must be positive")); }

demand.getAndAdd(n);

executor.submit(() -> { try { do { ByteBuffer audioBuffer = getNextEvent(); if (audioBuffer.remaining() > 0) { AudioEvent audioEvent = audioEventFromBuffer(audioBuffer); subscriber.onNext(audioEvent); } else { subscriber.onComplete(); break; } } while (demand.decrementAndGet() > 0); } catch (Exception e) { subscriber.onError(e); } }); }

@Override public void cancel() {

}

private ByteBuffer getNextEvent() { ByteBuffer audioBuffer; byte[] audioBytes = new byte[CHUNK_SIZE_IN_BYTES];

int len = 0; try { len = inputStream.read(audioBytes);

if (len <= 0) { audioBuffer = ByteBuffer.allocate(0); } else { audioBuffer = ByteBuffer.wrap(audioBytes, 0, len); } } catch (IOException e) { throw new UncheckedIOException(e); }

return audioBuffer; }

private AudioEvent audioEventFromBuffer(ByteBuffer bb) { return AudioEvent.builder() .audioChunk(SdkBytes.fromByteBuffer(bb)) .build(); } }

107

Java용 AWS SDK 버전 2 개발자 안내서Amazon Transcribe 작업

}

GitHub의 전체 예제를 참조하십시오.

클라이언트 생성 및 스트림 시작주 메서드에서 요청 객체를 만들고 오디오 입력 스트림을 시작하며 오디오 입력으로 게시자를 인스턴스화합니다.

또한 StartStreamTranscriptionResponseHandler를 생성하여 Amazon Transcribe의 응답을 처리하는 방법을지정해야 합니다.

그런 다음 TranscribeStreamingAsyncClient의 startStreamTranscription 메서드를 사용하여 양방향스트리밍을 시작합니다.

가져오기

import javax.sound.sampled.AudioFormat;import javax.sound.sampled.AudioSystem;import javax.sound.sampled.DataLine;import javax.sound.sampled.TargetDataLine;

import javax.sound.sampled.AudioInputStream;import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;import software.amazon.awssdk.services.transcribestreaming.TranscribeStreamingAsyncClient;import software.amazon.awssdk.services.transcribestreaming.model.LanguageCode;import software.amazon.awssdk.services.transcribestreaming.model.MediaEncoding;import software.amazon.awssdk.services.transcribestreaming.model.StartStreamTranscriptionRequest;import software.amazon.awssdk.services.transcribestreaming.model.StartStreamTranscriptionResponseHandler;import software.amazon.awssdk.services.transcribestreaming.model.TranscriptEvent;

코드

public static void main(String[] args) throws Exception { TranscribeStreamingAsyncClient client = TranscribeStreamingAsyncClient.builder().credentialsProvider(ProfileCredentialsProvider.create()).build();

StartStreamTranscriptionRequest request = StartStreamTranscriptionRequest.builder() .mediaEncoding(MediaEncoding.PCM) .languageCode(LanguageCode.EN_US) .mediaSampleRateHertz(16_000).build();

TargetDataLine mic = Microphone.get(); mic.start();

AudioStreamPublisher publisher = new AudioStreamPublisher(new AudioInputStream(mic));

StartStreamTranscriptionResponseHandler response = StartStreamTranscriptionResponseHandler.builder().subscriber(e -> { TranscriptEvent event = (TranscriptEvent) e; event.transcript().results().forEach(r -> r.alternatives().forEach(a -> System.out.println(a.transcript()))); }).build();

client.startStreamTranscription(request, publisher, response).join();

108

Java용 AWS SDK 버전 2 개발자 안내서페이지 매김 예제

}

GitHub의 전체 예제를 참조하십시오.

추가 정보• Amazon Transcribe Developer Guide의 작동 방식• Amazon Transcribe Developer Guide의 오디오 스트리밍 시작하기• Amazon Transcribe Developer Guide의 지침 및 제한 사항

페이지 매김 결과 검색많은 AWS 작업이 응답 객체가 너무 커서 단일 응답을 반환할 수 없을 때 페이지 매김 결과를 반환합니다.AWS SDK for Java 1.0용 AWS SDK의 경우 다음 결과 페이지를 검색할 때 사용해야 할 토큰이 포함되어 있었습니다. AWS SDK for Java 2.0에는 다중 서비스 호출로 자동으로 다음 결과 페이지를 가져오는 자동 페이지 매김 메서드가 새로 추가되었습니다. 결과를 처리할 코드를 작성하기만 하면 됩니다. 추가적으로 두 유형의 메서드 모두에 동기식과 비동기식 버전이 있습니다. 비동기식 클라이언트에 대한 자세한 내용은 비동기식프로그래밍 (p. 21)을 참조하십시오.

다음은 Amazon S3 및 Amazon DynamoDB 작업에서 다양한 메서드를 사용해 페이지 매김 응답에서 데이터를 검색하는 방법에 대한 예입니다.

Note

이 코드 조각에서는 개발자가 Java 2.0용 AWS SDK 사용 (p. 13)의 내용을 이해하고 개발을 위한AWS 자격 증명 및 리전 설정 (p. 5)의 정보를 사용하여 기본 AWS 자격 증명을 구성했다고 가정합니다.

동기식 페이지 매김다음은 동기식 페이지 매김 메서드를 사용해 Amazon S3 버킷의 객체를 나열하는 방법에 대한 예입니다.

페이지 반복ListObjectsV2Request를 빌드하고 버킷 이름을 제공합니다. 선택적으로 한 번에 검색할 키의 최대 수를 지정할 수 있습니다. S3Client의 listObjectsV2Paginator 메서드에 전달합니다. 이 메서드는ListObjectsV2Response 클래스의 Iterable인 ListObjectsV2Iterable 객체를 반환합니다.

첫 번째는 stream 메서드에서 페이지네이터 객체를 사용해 모든 응답 페이지를 반복하는 방법에 대한 예입니다. 응답 페이지로 직접 스트림하거나 응답 스트림을 S3Object 내용 스트림으로 변환한 후 Amazon S3 객체의 내용을 처리할 수 있습니다.

가져오기

import java.io.IOException;import java.nio.ByteBuffer;import java.nio.file.Paths;import java.util.Random;import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.s3.S3Client;import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadRequest;import software.amazon.awssdk.services.s3.model.CompletedMultipartUpload;import software.amazon.awssdk.services.s3.model.CompletedPart;import software.amazon.awssdk.services.s3.model.CreateBucketConfiguration;

109

Java용 AWS SDK 버전 2 개발자 안내서동기식 페이지 매김

import software.amazon.awssdk.services.s3.model.CreateBucketRequest;import software.amazon.awssdk.services.s3.model.CreateMultipartUploadRequest;import software.amazon.awssdk.services.s3.model.CreateMultipartUploadResponse;import software.amazon.awssdk.services.s3.model.DeleteBucketRequest;import software.amazon.awssdk.services.s3.model.DeleteObjectRequest;import software.amazon.awssdk.services.s3.model.GetObjectRequest;import software.amazon.awssdk.services.s3.model.ListObjectsV2Request;import software.amazon.awssdk.services.s3.model.ListObjectsV2Response;import software.amazon.awssdk.services.s3.model.PutObjectRequest;import software.amazon.awssdk.services.s3.model.S3Object;import software.amazon.awssdk.services.s3.model.UploadPartRequest;import software.amazon.awssdk.services.s3.paginators.ListObjectsV2Iterable;import software.amazon.awssdk.core.sync.RequestBody;import software.amazon.awssdk.core.sync.ResponseTransformer;

코드

// Build the list objects requestListObjectsV2Request listReq = ListObjectsV2Request.builder() .bucket(bucket) .maxKeys(1) .build();

ListObjectsV2Iterable listRes = s3.listObjectsV2Paginator(listReq);// Process response pageslistRes.stream() .flatMap(r -> r.contents().stream()) .forEach(content -> System.out.println(" Key: " + content.key() + " size = " + content.size()));

GitHub의 전체 예제를 참조하십시오.

객체 반복다음은 응답 페이지 대신 응답에서 반환된 객체에 대해 반복하는 방법을 설명한 예입니다.

스트림 사용응답 내용에 대해 stream 메서드를 사용하여 페이지 매김 항목 모음에 대해 반복합니다.

코드

// Helper method to work with paginated collection of items directlylistRes.contents().stream() .forEach(content -> System.out.println(" Key: " + content.key() + " size = " + content.size()));

GitHub의 전체 예제를 참조하십시오.

For 루프 사용표준 for 루프를 사용하여 응답 내용을 반복합니다.

코드

// Use simple for loop if stream is not necessaryfor (S3Object content : listRes.contents()) { System.out.println(" Key: " + content.key() + " size = " + content.size());}

110

Java용 AWS SDK 버전 2 개발자 안내서비동기 페이지 매김

GitHub의 전체 예제를 참조하십시오.

수동 페이지 매김사용 사례에 따라 필요한 경우 수동 페이지 매김을 사용할 수도 있습니다. 후속 요청에 응답 객체의 다음 토큰을 사용합니다. 다음은 while 루프 사용에 대한 예입니다.

코드

// Use manual paginationListObjectsV2Request listObjectsReqManual = ListObjectsV2Request.builder() .bucket(bucket) .maxKeys(1) .build();

boolean done = false;while (!done) { ListObjectsV2Response listObjResponse = s3.listObjectsV2(listObjectsReqManual); for (S3Object content : listObjResponse.contents()) { System.out.println(content.key()); }

if (listObjResponse.nextContinuationToken() == null) { done = true; }

listObjectsReqManual = listObjectsReqManual.toBuilder() .continuationToken(listObjResponse.nextContinuationToken()) .build();}

GitHub의 전체 예제를 참조하십시오.

비동기 페이지 매김다음은 비동기식 페이지 매김 메서드를 사용해 DynamoDB의 테이블을 나열하는 방법에 대한 예입니다. 비동기식 프로그래밍 (p. 21) 주제에서 수동 페이지 매김에 대한 예도 다루고 있습니다.

테이블 이름 페이지 반복먼저 비동기식 DynamoDB 클라이언트를 생성합니다. 그리고 listTablesPaginator 메서드를 호출해ListTablesPublisher를 가져옵니다. 반응적 스트림 게시자 인터페이스를 구현한 것입니다. 반응적 스트림 모델에 대한 자세한 내용은 반응적 스트림 GitHub 리포지토리를 참조하십시오.

subscribe 메서드를 ListTablesPublisher에 호출하고, 구독자 구현을 전달합니다. 이 예제에서 구독자는 게시자에게 한 번에 하나의 항목을 요청하는 onNext 메서드를 갖고 있습니다. 모든 페이지를 검색할 때까지호출을 반복하는 메서드입니다. onSubscribe 메서드가 Subscription.request 메서드를 호출해 게시자에게 데이터를 요청하기 시작합니다. 게시자에게 데이터를 가져오기 시작할 때 호출해야 하는 메서드입니다. 데이터 검색 동안 오류가 발생할 경우 onError 메서드가 트리거됩니다. 마지막으로 모든 페이지를 다요청했을 때 onComplete 메서드가 호출됩니다.

구독자 사용

가져오기

import java.util.List;import java.util.concurrent.CompletableFuture;import java.util.concurrent.ExecutionException;

111

Java용 AWS SDK 버전 2 개발자 안내서비동기 페이지 매김

import org.reactivestreams.Subscriber;import org.reactivestreams.Subscription;

import software.amazon.awssdk.core.async.SdkPublisher;import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient;import software.amazon.awssdk.services.dynamodb.model.ListTablesRequest;import software.amazon.awssdk.services.dynamodb.model.ListTablesResponse;import software.amazon.awssdk.services.dynamodb.paginators.ListTablesPublisher;import io.reactivex.Flowable;import reactor.core.publisher.Flux;

코드

먼저 비동기 클라이언트를 생성합니다.

// Creates a default client with credentials and regions loaded from the environmentfinal DynamoDbAsyncClient asyncClient = DynamoDbAsyncClient.create();

ListTablesRequest listTablesRequest = ListTablesRequest.builder().limit(3).build();

그런 다음 구독자를 사용하여 결과를 가져옵니다.

// Or subscribe method should be called to create a new Subscription.// A Subscription represents a one-to-one life-cycle of a Subscriber subscribing to a Publisher.publisher.subscribe(new Subscriber<ListTablesResponse>() { // Maintain a reference to the subscription object, which is required to request data from the publisher private Subscription subscription;

@Override public void onSubscribe(Subscription s) { subscription = s; // Request method should be called to demand data. Here we request a single page subscription.request(1); }

@Override public void onNext(ListTablesResponse response) { response.tableNames().forEach(System.out::println); // Once you process the current page, call the request method to signal that you are ready for next page subscription.request(1); }

@Override public void onError(Throwable t) { // Called when an error has occurred while processing the requests }

@Override public void onComplete() { // This indicates all the results are delivered and there are no more pages left }

GitHub의 전체 예제를 참조하십시오.

For 루프 사용새 구독자 생성에 대한 오버헤드가 지나치게 클 경우 단순한 사용 사례의 페이지 반복에 for 루프를 사용합니다. 응답 게시자 객체에는 이를 위한 forEach 헬퍼가 있습니다.

112

Java용 AWS SDK 버전 2 개발자 안내서비동기 페이지 매김

코드

ListTablesPublisher publisher = asyncClient.listTablesPaginator(listTablesRequest);

// Use a for-loop for simple use casesCompletableFuture<Void> future = publisher.subscribe(response -> response.tableNames() .forEach(System.out::println));

GitHub의 전체 예제를 참조하십시오.

테이블 이름 반복다음은 응답 페이지 대신 응답에서 반환된 객체에 대해 반복하는 방법을 설명한 예입니다. 비동기식 결과 클래스에는 동기식 결과와 유사하게 기본 항목 모음과 상호 작용하는 메서드가 있습니다. 이 유용한 메서드는모든 페이지에서 항목을 요청하기 위해 사용할 수 있는 게시자를 반환합니다.

구독자 사용

코드

먼저 비동기 클라이언트를 생성합니다.

System.out.println("running AutoPagination - iterating on item collection...\n");

// Creates a default client with credentials and regions loaded from the environmentfinal DynamoDbAsyncClient asyncClient = DynamoDbAsyncClient.create();

ListTablesRequest listTablesRequest = ListTablesRequest.builder().limit(3).build();

그런 다음 구독자를 사용하여 결과를 가져옵니다.

// Use subscriberpublisher.subscribe(new Subscriber<String>() { private Subscription subscription;

@Override public void onSubscribe(Subscription s) { subscription = s; subscription.request(1); }

@Override public void onNext(String tableName) { System.out.println(tableName); subscription.request(1); }

@Override public void onError(Throwable t) { }

@Override public void onComplete() { }

GitHub의 전체 예제를 참조하십시오.

For 루프 사용

유용한 forEach 메서드를 사용해 결과를 반복합니다.

113

Java용 AWS SDK 버전 2 개발자 안내서비동기 페이지 매김

코드

// Use forEachCompletableFuture<Void> future = publisher.subscribe(System.out::println);future.get();

GitHub의 전체 예제를 참조하십시오.

타사 라이브러리 사용사용자 지정 구독자를 구현하는 대신 타사 라이브러리를 사용할 수 있습니다. 다음은 RxJava 구현을 사용하는 방법에 대한 예입니다. 그렇지만 반응형 스트림 인터페이스를 구현하는 모든 라이브러리를 사용할 수 있습니다. 해당 라이브러리에 대한 자세한 내용은 GitHub의 RxJava 위키 페이지를 참조하십시오.

라이브러리를 사용하려면 종속성으로 추가합니다. 이 예에서는 Maven을 사용하는 경우에 사용할 POM 조각을 알려줍니다.

POM 항목

<dependency> <groupId>io.reactivex.rxjava2</groupId> <artifactId>rxjava</artifactId> <version>2.1.9</version> </dependency>

가져오기

import java.util.List;import java.util.concurrent.CompletableFuture;import java.util.concurrent.ExecutionException;

import org.reactivestreams.Subscriber;import org.reactivestreams.Subscription;

import software.amazon.awssdk.core.async.SdkPublisher;import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient;import software.amazon.awssdk.services.dynamodb.model.ListTablesRequest;import software.amazon.awssdk.services.dynamodb.model.ListTablesResponse;import software.amazon.awssdk.services.dynamodb.paginators.ListTablesPublisher;import io.reactivex.Flowable;import reactor.core.publisher.Flux;

코드

System.out.println("running AutoPagination - using third party subscriber...\n");

DynamoDbAsyncClient asyncClient = DynamoDbAsyncClient.create();ListTablesPublisher publisher = asyncClient.listTablesPaginator(ListTablesRequest.builder() .build());

// The Flowable class has many helper methods that work with any reactive streams compatible publisher implementationList<String> tables = Flowable.fromPublisher(publisher) .flatMapIterable(ListTablesResponse::tableNames) .toList() .blockingGet();System.out.println(tables);

114

Java용 AWS SDK 버전 2 개발자 안내서데이터 보호

this AWS product or service에 대한보안

Amazon Web Services(AWS)에서는 클라우드 보안의 우선 순위가 가장 높습니다. AWS 고객은 보안에 매우보안에 민감한 조직의 요구 사항에 부합하도록 구축된 데이터 센터 및 네트워크 아키텍처의 혜택을 누릴 수있습니다. 보안은 AWS와 귀하의 공동 책임입니다. 공동 책임 모델은 이 사항을 클라우드 내 보안 및 클라우드의 보안으로 설명합니다.

클라우드의 보안 – AWS는 AWS 클라우드에서 제공하는 모든 서비스를 실행하는 인프라를 보호하며 안전하게 사용할 수 있는 서비스를 제공합니다. 당사의 보안 책임은 AWS에서 우선 순위가 가장 높으며, 타사 감사자는 AWS 규정 준수 프로그램의 일환으로 정기적으로 보안 효율성을 테스트하고 검증합니다.

클라우드 내 보안 – 사용자의 책임은 사용하는 AWS 서비스, 그리고 데이터의 민감도, 조직의 요구 사항, 관련 법률 및 규정을 비롯한 기타 요소에 의해 결정됩니다.

주제• this AWS product or service에 대한 데이터 보호 (p. 115)• this AWS product or service의 Identity and Access Management (p. 116)• this AWS product or service에 대한 규정 준수 확인 (p. 116)• this AWS product or service에 대한 복원력 (p. 117)• this AWS product or service에 대한 인프라 보안 (p. 117)

this AWS product or service에 대한 데이터 보호This AWS product or service는 공동 책임 모델을 준수하며, 여기에는 데이터 보호 관련 규정 및 지침이 포함됩니다. Amazon Web Services(AWS)는 모든 AWS 서비스를 실행하는 글로벌 인프라를 보호할 책임이 있습니다. AWS는 고객 콘텐츠 및 개인 데이터를 처리하기 위한 보안 구성 제어를 포함하여 이 인프라에서 호스팅되는 데이터에 대한 제어를 유지합니다. 데이터 컨트롤러 또는 데이터 프로세서의 역할을 담당하는 AWS고객과 APN 파트너는 AWS 클라우드에 입력한 모든 개인 데이터에 대해 책임이 있습니다.

데이터 보호를 위해 AWS 계정 자격 증명을 보호하고 AWS Identity and Access Management (IAM)을 사용하여 개별 사용자 계정을 설정하여 각 사용자에게 직무를 수행하는 데 필요한 권한만 부여하는 것이 좋습니다. 또한 다음과 같은 방법으로 데이터를 보호하는 것이 좋습니다.

• 각 계정마다 멀티 팩터 인증(MFA)을 사용합니다.• SSL/TLS를 사용하여 AWS 리소스와 통신합니다.• AWS CloudTrail로 API 및 사용자 활동 로깅을 설정합니다.• AWS 암호화 솔루션을 AWS 서비스 내의 모든 기본 보안 컨트롤과 함께 사용합니다.• Amazon S3에 저장된 개인 데이터를 검색하고 보호하는 데 도움이 되는 Amazon Macie와 같은 고급 관리

형 보안 서비스를 사용합니다.

이름 필드와 같은 자유 형식 필드에 고객 계정 번호와 같은 중요 식별 정보를 절대 입력하지 마십시오. 여기에는 this AWS product or service 또는 기타 AWS 제품에서 콘솔, API, AWS CLI 또는 AWS SDK를 사용하여작업하는 경우가 포함됩니다. this AWS product or service 또는 기타 서비스에 입력하는 모든 데이터는 진단로그에 포함하기 위해 선택될 수 있습니다. 외부 서버에 URL을 제공할 때 해당 서버에 대한 요청을 검증하기위해 자격 증명 정보를 URL에 포함하지 마십시오.

115

Java용 AWS SDK 버전 2 개발자 안내서ID 및 액세스 관리

데이터 보호에 대한 자세한 내용은 AWS 보안 블로그의 AWS 공동 책임 모델과 GDPR 블로그 게시물을 참조하십시오.

this AWS product or service의 Identity and AccessManagement

AWS Identity and Access Management(IAM)는 관리자가 AWS 리소스에 대한 액세스를 안전하게 제어할 수있도록 지원하는 Amazon Web Services(AWS) 서비스입니다. IAM 관리자는 AWS 리소스를 사용하기 위해인증(로그인) 및 권한 부여(권한 있음)할 수 있는 사람을 제어합니다. IAM은 추가 비용 없이 사용할 수 있는AWS 서비스입니다.

this AWS product or service 사용을 통해 AWS에 액세스하려면 AWS 계정 및 AWS 자격 증명이 필요합니다.AWS 계정의 보안을 강화하려면 AWS 계정 자격 증명을 사용하는 대신 IAM 사용자를 사용해 액세스 자격 증명을 제공하는 것이 좋습니다.

IAM 작업에 대한 자세한 내용은 IAM을 참조하십시오.

IAM 사용자 개요 및 해당 사용자가 계정의 보안에 중요한 이유에 대해서는 Amazon Web Services 일반 참조의 AWS 보안 자격 증명을 참조하십시오.

This AWS product or service에서는 지원하는 특정 Amazon Web Services(AWS) 서비스를 통해 공동 책임모델을 따릅니다. AWS 서비스 보안 정보는 AWS 서비스 보안 설명서 페이지 및 규정 준수 프로그램의 AWS규정 준수 업무 범위에 속하는 AWS 서비스를 참조하십시오.

this AWS product or service에 대한 규정 준수 확인This AWS product or service에서는 지원하는 특정 Amazon Web Services(AWS) 서비스를 통해 공동 책임모델을 따릅니다. AWS 서비스 보안 정보는 AWS 서비스 보안 설명서 페이지 및 규정 준수 프로그램의 AWS규정 준수 업무 범위에 속하는 AWS 서비스를 참조하십시오.

타사 감사자는 여러 AWS 규정 준수 프로그램의 일환으로 Amazon Web Services(AWS) 서비스의 보안 및규정 준수를 평가합니다. 여기에는 SOC, PCI, FedRAMP, HIPAA 등이 포함됩니다. AWS는 규정 준수 프로그램 제공 범위 내 AWS 서비스의 특정 규정 준수 프로그램 범위에 있는 AWS 서비스의 자주 업데이트되는목록을 제공합니다.

AWS Artifact를 사용하여 다운로드할 수 있는 타사 감사 보고서가 있습니다. 자세한 내용은 AWS Artifact에서 보고서 다운로드를 참조하십시오.

AWS 규정 준수 프로그램에 대한 자세한 내용은 AWS 규정 준수 프로그램을 참조하십시오.

this AWS product or service를 사용하여 AWS 서비스에 액세스할 때 귀하의 규정 준수 책임은 데이터의민감도, 조직의 규정 준수 목표, 관련 법률과 규정에 따라 결정됩니다. AWS 서비스 사용 시 HIPAA, PCI,FedRAMP와 같은 표준으로 규정 준수해야 하는 경우 다음과 같은 AWS 도움말 리소스를 활용하십시오.

• 보안 및 규정 준수 Quick Start 안내서 – 아키텍처 고려 사항에 대해 설명하고 보안 및 규정 준수에 중점을둔 기본 환경을 AWS에 배포하기 위한 단계를 제공하는 배포 가이드입니다.

• HIPAA 보안 및 규정 준수를 위한 아키텍처 설계 백서 – 회사에서 AWS를 사용하여 HIPAA를 준수하는 애플리케이션을 생성하는 방법을 설명하는 백서입니다.

• AWS 규정 준수 리소스 – 귀사의 산업 및 위치에 적용할 수 있는 워크북 및 안내서 모음입니다.• AWS Config – 리소스 구성이 내부 관행, 업계 지침 및 규정을 준수하는 정도를 평가하는 서비스입니다.• AWS Security Hub – 보안 업계 표준 및 모범 사례 규정 준수 여부를 확인하는 데 도움이 되는 AWS 내 보

안 상태에 대한 포괄적인 보기입니다.

116

Java용 AWS SDK 버전 2 개발자 안내서복원성

this AWS product or service에 대한 복원력Amazon Web Services(AWS) 글로벌 인프라는 AWS 리전 및 가용 영역을 중심으로 구축됩니다.

AWS 리전에서는 물리적으로 분리되고 격리된 다수의 가용 영역을 제공하며 이러한 가용 영역은 짧은 지연시간, 높은 처리량 및 높은 중복성을 갖춘 네트워크에 연결되어 있습니다.

가용 영역을 사용하면 중단 없이 가용 영역 간에 자동으로 장애 조치가 이루어지는 애플리케이션 및 데이터베이스를 설계하고 운영할 수 있습니다. 가용 영역은 기존의 단일 또는 다중 데이터 센터 인프라보다 가용성,내결함성, 확장성이 뛰어납니다.

AWS 리전 및 가용 영역에 대한 자세한 내용은 AWS 글로벌 인프라를 참조하십시오.

This AWS product or service에서는 지원하는 특정 Amazon Web Services(AWS) 서비스를 통해 공동 책임모델을 따릅니다. AWS 서비스 보안 정보는 AWS 서비스 보안 설명서 페이지 및 규정 준수 프로그램의 AWS규정 준수 업무 범위에 속하는 AWS 서비스를 참조하십시오.

this AWS product or service에 대한 인프라 보안This AWS product or service에서는 지원하는 특정 Amazon Web Services(AWS) 서비스를 통해 공동 책임모델을 따릅니다. AWS 서비스 보안 정보는 AWS 서비스 보안 설명서 페이지 및 규정 준수 프로그램의 AWS규정 준수 업무 범위에 속하는 AWS 서비스를 참조하십시오.

AWS 보안 프로세스에 대한 자세한 내용은 AWS: 보안 프로세스 개요 백서를 참조하십시오.

117

Java용 AWS SDK 버전 2 개발자 안내서

문서 기록이 주제에서는 지금까지 이루어진 AWS SDK for Java Developer Guide의 주요 변경 사항을 설명합니다.

이 문서의 작성일: 2020년 1월 28일

2018년 8월 2일

Kinesis 스트림 예제 추가.2018년 4월 5일

자동 페이지 매김 주제 추가.2017년 12월 29일

IAM, Amazon EC2, Cloudwatch 및 DynamoDB의 예제와 관련된 주제 추가2017년 8월 7일

S3용 getobjects 예제 추가.2017년 8월 4일

비동기식 관련 주제 추가.2017년 6월 28일

새 SDK 버전 2.0 릴리스.

118