

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

# 서버리스
<a name="serverless-pattern-list"></a>

**Topics**
+ [Amplify를 사용하여 서버리스 React Native 모바일 앱 구축](build-a-serverless-react-native-mobile-app-by-using-aws-amplify.md)
+ [단일 컨트롤 플레인에서 여러 SaaS 제품의 테넌트 관리](manage-tenants-across-multiple-saas-products-on-a-single-control-plane.md)
+ [정적 IP 주소와 연결된 엔드포인트를 사용하여 Amazon S3 미리 서명된 URL 생성 및 객체 다운로드 통합](consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses.md)
+ [조직에서 교차 계정 Amazon EventBridge 연결 생성](create-cross-account-amazon-eventbridge-connection-organization.md)
+ [에서 Kinesis Data Streams 및 Firehose를 사용하여 Amazon S3에 DynamoDB 레코드 전송 AWS CDK](deliver-dynamodb-records-to-amazon-s3-using-kinesis-data-streams-and-amazon-data-firehose-with-aws-cdk.md)
+ [Amazon API Gateway 버전 관리 구현](implement-path-based-api-versioning-by-using-custom-domains.md)
+ [PostgreSQL 데이터베이스와 상호 작용 AWS Lambda 하기 위해 로 psycopg2 라이브러리 가져오기](import-psycopg2-library-lambda.md)
+ [Amazon API Gateway를 Amazon SQS와 통합하여 비동기 REST API 처리](integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis.md)
+ [Amazon API Gateway 및 AWS Lambda와 비동기적으로 이벤트 처리](process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda.md)
+ [Amazon API Gateway 및 Amazon DynamoDB Streams와 비동기적으로 이벤트 처리](processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams.md)
+ [Amazon API Gateway, Amazon SQS 및 AWS Fargate와 비동기적으로 이벤트 처리](process-events-asynchronously-with-amazon-api-gateway-amazon-sqs-and-aws-fargate.md)
+ [AWS Step Functions에서 AWS Systems Manager Automation 작업을 동기적으로 실행](run-aws-systems-manager-automation-tasks-synchronously-from-aws-step-functions.md)
+ [AWS Lambda 함수에서 Python을 사용하여 S3 객체의 병렬 읽기 실행](run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function.md)
+ [실시간 분석 및 시각화 AWS Lambda 를 위해에서 OpenSearch로 원격 측정 데이터 전송](send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization.md)
+ [셀 기반 아키텍처를 위한 서버리스 셀 라우터 설정](serverless-cell-router-architecture.md)
+ [VPC 엔드포인트를 통해 Amazon S3 버킷에 대한 프라이빗 액세스 설정](set-up-private-access-to-an-amazon-s3-bucket-through-a-vpc-endpoint.md)
+ [Amazon Bedrock AWS Step Functions 을 사용하여의 상태 문제 해결](troubleshooting-states-in-aws-step-functions.md)
+ [패턴 더 보기](serverless-more-patterns-pattern-list.md)

# Amplify를 사용하여 서버리스 React Native 모바일 앱 구축
<a name="build-a-serverless-react-native-mobile-app-by-using-aws-amplify"></a>

*Deekshitulu Pentakota, Amazon Web Services*

## 요약
<a name="build-a-serverless-react-native-mobile-app-by-using-aws-amplify-summary"></a>

이 패턴은 Amplify 및 다음 서비스를 사용하여 React Native 모바일 앱을 위한 서버리스 백엔드를 생성하는 방법을 보여줍니다.
+ AppSync
+ Amazon Cognito
+ Amazon DynamoDB

Amplify를 사용하여 앱의 백엔드를 구성하고 배포한 후 Amazon Cognito는 앱 사용자를 인증하고 앱 액세스를 승인합니다. 그러면 AppSync가 프런트엔드 앱 및 백엔드 DynamoDB 테이블과 상호 작용하여 데이터를 생성하고 가져옵니다.

**참고**  
이 패턴은 간단한 “TodoList” 앱을 예로 사용하지만 비슷한 절차를 사용하여 모든 React Native 모바일 앱을 만들 수 있습니다.

## 사전 조건 및 제한 사항
<a name="build-a-serverless-react-native-mobile-app-by-using-aws-amplify-prereqs"></a>

**사전 조건 **
+ 활성 상태의 계정
+ [Amplify 명령줄 인터페이스(Amplify CLI](https://docs.amplify.aws/cli/start/install/)), 설치 및 구성
+ XCode(모든 버전)
+ Microsoft Visual Studio(모든 버전, 모든 코드 편집기, 모든 텍스트 편집기)
+ Amplify에 대한 지식
+ Amazon Cognito에 대한 지식
+ AppSync에 대한 지식
+ DynamoDB에 대한 지식
+ Node.js에 대한 지식
+ npm에 대한 지식
+ React 및 React Native에 대한 지식
+ JavaScript 및 ECMAScript 6(ES6) 에 대한 지식
+ GraphQL에 대한 지식

## 아키텍처
<a name="build-a-serverless-react-native-mobile-app-by-using-aws-amplify-architecture"></a>

다음 다이어그램은 클라우드에서 React Native 모바일 앱의 백엔드를 실행하기 위한 예제 아키텍처를 보여줍니다.

![\[AWS 서비스로 React Native 모바일 앱을 실행하기 위한 워크플로.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/c95e0150-5762-4c90-946c-efa3a22913e4/images/5beff5f9-9d14-49dc-a046-b74e5bfbd13f.png)


다이어그램은 다음 아키텍처를 보여줍니다:

1. Amazon Cognito는 앱 사용자를 인증하고 앱 액세스를 승인합니다.

1. 데이터를 생성하고 가져오기 위해 AppSync는 GraphQL API를 사용하여 프런트엔드 앱 및 백엔드 DynamoDB 테이블과 상호 작용합니다.

## 도구
<a name="build-a-serverless-react-native-mobile-app-by-using-aws-amplify-tools"></a>

**서비스**
+ [Amplify](https://docs.aws.amazon.com/amplify/latest/userguide/welcome.html)는 프런트엔드 웹 및 모바일 개발자가 에서 풀스택 애플리케이션을 빠르고 쉽게 구축할 수 있도록 특별히 제작된 도구 및 기능 세트입니다.
+ [AppSync](https://docs.aws.amazon.com/appsync/latest/devguide/what-is-appsync.html)는 애플리케이션 개발자가 Amazon DynamoDB, Lambda, HTTP API를 비롯한 여러 소스의 데이터를 결합할 수 있도록 확장 가능한 GraphQL 인터페이스를 제공합니다.
+ [Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html)는 웹 및 모바일 앱에 대한 인증, 권한 부여 및 사용자 관리를 제공합니다.
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html)는 빠르고 예측 가능하고 확장 가능한 성능을 제공하는 완전 관리형 NoSQL 데이터베이스 서비스입니다.

**코드**

이 패턴에 사용되는 샘플 애플리케이션의 코드는 GitHub [aws-amplify-react-native-ios-todo-app](https://github.com/aws-samples/aws-amplify-react-native-ios-todo-app) 리포지토리에서 확인할 수 있습니다. 샘플 파일을 사용하려면 이 패턴의 **에픽** 섹션에 있는 지침을 따르십시오.

## 에픽
<a name="build-a-serverless-react-native-mobile-app-by-using-aws-amplify-epics"></a>

### React Native 앱 생성 및 실행
<a name="create-and-run-your-react-native-app"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| React Native 개발 환경을 설정합니다. | 자세한 지침은 React Native 문서의 [개발 환경 설정](https://reactnative.dev/docs/next/environment-setup)을 참조하십시오. | 앱 개발자 | 
| iOS 시뮬레이터에서 TodoList React Native 모바일 앱을 만들고 실행합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/build-a-serverless-react-native-mobile-app-by-using-aws-amplify.html) | 앱 개발자 | 

### 앱의 새 백엔드 환경을 초기화합니다.
<a name="initialize-a-new-backend-environment-for-the-app"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| Amplify에서 앱을 지원하는 데 필요한 백엔드 서비스를 생성합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/build-a-serverless-react-native-mobile-app-by-using-aws-amplify.html)이 패턴에서 사용되는 TodoList 앱 설정의 경우 다음 예제 구성을 적용하십시오.**React Native Amplify 앱 구성 설정 예시**<pre>? Name: ToDoListAmplify<br /><br />? Environment: dev<br /><br />? Default editor: Visual Studio Code<br /><br />? App type: javascript<br /><br />? Javascript framework: react-native<br /><br />? Source Directory Path: src<br /><br />? Distribution Directory Path: /<br /><br />? Build Command: npm run-script build<br /><br />? Start Command: npm run-script start<br /><br />? Select the authentication method you want to use: AWS profile<br /><br />? Please choose the profile you want to use: default</pre>자세한 내용은 Amplify 개발 센터 설명서에서 [새 Amplify 백엔드 만들기](https://docs.amplify.aws/lib/project-setup/create-application/q/platform/js/#create-a-new-amplify-backend)를 참조하십시오.`amplify init` 명령은 [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)을 사용하여 다음 리소스를 프로비저닝합니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/build-a-serverless-react-native-mobile-app-by-using-aws-amplify.html) | 앱 개발자 | 

### Amplify React Native 앱에 Amazon Cognito 인증 추가
<a name="add-amazon-cognito-authentication-to-your-amplify-react-native-app"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| Amazon Cognito 인증 서비스를 생성합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/build-a-serverless-react-native-mobile-app-by-using-aws-amplify.html)이 패턴에서 사용되는 TodoList 앱 설정의 경우 다음 예제 구성을 적용하십시오.**인증 서비스 구성 설정 예시**<pre>? Do you want to use the default authentication and security configuration? \ <br />Default configuration<br /> <br />? How do you want users to be able to sign in? \ <br />Username <br /><br />? Do you want to configure advanced settings? \ <br />No, I am done</pre>`amplify add auth` 명령은 프로젝트의 루트 디렉터리 내 로컬 폴더(**amplify**)에 필요한 폴더, 파일 및 종속성 파일을 만듭니다. 이 패턴에서 사용되는 TodoList 앱 설정의 경우 이 용도로 **aws-exports.js** 파일이 생성됩니다. | 앱 개발자 | 
| Amazon Cognito 서비스를 클라우드에 배포합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/build-a-serverless-react-native-mobile-app-by-using-aws-amplify.html)프로젝트에 배포된 서비스를 보려면 다음 명령을 실행하여 Amplify 콘솔로 이동합니다.`amplify console` | 앱 개발자 | 
| React Native에 필요한 Amplify 라이브러리와 iOS용 CocoaPods 종속 프로그램을 설치합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/build-a-serverless-react-native-mobile-app-by-using-aws-amplify.html) | 앱 개발자 | 
| Amplify 서비스를 가져오고 구성합니다. | 앱의 진입점 파일(예: ** App.js**)에서 다음 코드 줄을 입력하여 Amplify 서비스의 구성 파일을 가져오고 로드합니다.<pre>import Amplify from 'aws-amplify'<br />import config from './src/aws-exports'<br />Amplify.configure(config)</pre>앱의 진입점 파일에서 Amplify 서비스를 가져온 후 오류가 발생하면 앱을 중지하십시오. 그런 다음 XCode를 열고 프로젝트의 iOS 폴더에서 **ToDoListAmplify.xcworkspace** 작업 영역을 선택하고 앱을 실행합니다. | 앱 개발자 | 
| withAuthenticator 고차 구성 요소(HOC)를 사용하도록 앱의 진입점 파일을 업데이트하십시오. | `withAuthenticator` HOC는 단 몇 줄의 코드만으로 앱의 로그인, 가입 및 비밀번호 분실 워크플로를 제공합니다. 자세한 내용은 Amplify Dev 센터의 [옵션 1: 사전 빌드 UI 구성 요소 사용](https://docs.amplify.aws/lib/auth/getting-started/q/platform/js/#option-1-use-pre-built-ui-components)을 참조하십시오. 또한 React 설명서에 있는 [고차 컴포넌트](https://reactjs.org/docs/higher-order-components.html)도 있습니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/build-a-serverless-react-native-mobile-app-by-using-aws-amplify.html)**withAuthenticator HOC 코드 예제**<pre>import Amplify from 'aws-amplify'<br />import config from './src/aws-exports'<br />Amplify.configure(config)<br />import { withAuthenticator } from 'aws-amplify-react-native';<br /><br /><br />const App = () => {<br />  return null;<br />};<br /><br /><br />export default withAuthenticator(App);</pre>iOS 시뮬레이터에서 앱은 Amazon Cognito 서비스에서 제공하는 로그인 화면을 표시합니다. | 앱 개발자 | 
| 인증 서비스 설정을 테스트하십시오. | iOS 시뮬레이터에서 다음을 수행합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/build-a-serverless-react-native-mobile-app-by-using-aws-amplify.html)[Amazon Cognito 콘솔](https://console.aws.amazon.com/cognito/)을 열고 **ID 풀**에 새 사용자가 생성되었는지 여부를 확인할 수도 있습니다. | 앱 개발자 | 

### AppSync API와 DynamoDB 데이터베이스를 앱에 연결
<a name="connect-an-aws-appsync-api-and-dynamodb-database-to-the-app"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| AppSync API 및 DynamoDB 데이터베이스를 생성합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/build-a-serverless-react-native-mobile-app-by-using-aws-amplify.html)이 패턴에서 사용되는 TodoList 앱 설정의 경우 다음 예제 구성을 적용하십시오.**API 및 데이터베이스 구성 설정 예시**<pre>? Please select from one of the below mentioned services: \ <br />GraphQL <br /><br />? Provide API name: todolistamplify<br /><br />? Choose the default authorization type for the API \ <br />Amazon Cognito User Pool<br /><br />Do you want to use the default authentication and security configuration<br /><br />? Default configuration How do you want users to be able to sign in? \ <br />Username<br /><br />Do you want to configure advanced settings? \ <br />No, I am done.<br /><br />? Do you want to configure advanced settings for the GraphQL API \ <br />No, I am done.<br /><br />? Do you have an annotated GraphQL schema? \ <br />No<br /><br />? Choose a schema template: \ <br />Single object with fields (e.g., "Todo" with ID, name, description)<br /><br />? Do you want to edit the schema now? \ <br />Yes</pre>**예제 GraphQL 스키마**<pre> type Todo @model {<br />   id: ID!<br />   name: String!<br />   description: String<br />}</pre> | 앱 개발자 | 
| AppSync API를 배포합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/build-a-serverless-react-native-mobile-app-by-using-aws-amplify.html)이 패턴에서 사용되는 TodoList 앱 설정의 경우 다음 예제 구성을 적용하십시오.**AppSync API 구성 설정의 예**다음 구성은 AppSync에 GraphQL API를 생성하고 Dynamo DB에 **Todo** 테이블을 생성합니다.<pre> ? Are you sure you want to continue? Yes<br />? Do you want to generate code for your newly created GraphQL API Yes<br />? Choose the code generation language target javascript<br />? Enter the file name pattern of graphql queries, mutations and subscriptions src/graphql/**/*.js<br />? Do you want to generate/update all possible GraphQL operations - \ <br />queries, mutations and subscriptions Yes<br />? Enter maximum statement depth \<br />[increase from default if your schema is deeply nested] 2</pre> | 앱 개발자 | 
| 앱의 프론트엔드를 AppSync API에 연결합니다. | 이 패턴으로 제공된 예제 TodoList 앱을 사용하려면 [aws-amplify-react-native-ios-todo-app](https://github.com/aws-samples/aws-amplify-react-native-ios-todo-app) GitHub 리포지토리의 **App.js** 파일에서 코드를 복사하십시오. 그런 다음 예제 코드를 로컬 환경에 통합하십시오.리포지토리의 **App.js** 파일에 제공된 예제 코드는 다음을 수행합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/build-a-serverless-react-native-mobile-app-by-using-aws-amplify.html) | 앱 개발자 | 

## 관련 리소스
<a name="build-a-serverless-react-native-mobile-app-by-using-aws-amplify-resources"></a>
+ [Amplify](https://aws.amazon.com/amplify/)
+ [Amazon Cognito](https://aws.amazon.com/cognito/)
+ [AppSync](https://aws.amazon.com/appsync/)
+ [Amazon DynamoDB](https://aws.amazon.com/dynamodb/)
+ [React](https://reactjs.org/) (React 문서) 

# 단일 컨트롤 플레인에서 여러 SaaS 제품의 테넌트 관리
<a name="manage-tenants-across-multiple-saas-products-on-a-single-control-plane"></a>

*Ramanna Avancha, Kishan Kavala, Anusha Mandava, Jenifer Pascal, Amazon Web Services*

## 요약
<a name="manage-tenants-across-multiple-saas-products-on-a-single-control-plane-summary"></a>

이 패턴은 AWS 클라우드의 단일 컨트롤 플레인에서 여러 서비스형 소프트웨어(SaaS) 제품의 테넌트 수명 주기를 관리하는 방법을 보여줍니다. 제공된 참조 아키텍처는 조직이 개별 SaaS 제품에서 중복 및 공유된 기능의 구현을 줄이고 규모에 맞는 거버넌스 효율성을 제공하는 데 도움이 될 수 있습니다.

대기업은 대체로 다양한 사업부에서 여러 SaaS 제품을 보유합니다. 이러한 제품은 외부 테넌트가 다양한 구독 수준에서 사용할 수 있도록 프로비저닝해야 하는 경우가 많습니다. 공통 테넌트 솔루션이 없으면 IT 관리자는 핵심 제품 기능 개발에 집중하는 대신 여러 SaaS API에서 차별화되지 않은 기능을 관리하는 데 시간을 할애해야 합니다.

이 패턴으로 제공되는 공통 테넌트 솔루션은 다음을 포함하여 조직의 여러 공유 SaaS 제품 기능을 중앙 집중식으로 관리하는 데 도움이 될 수 있습니다.
+ 보안
+ 테넌트 프로비저닝
+ 테넌트 데이터 스토리지
+ 테넌트 커뮤니케이션
+ 제품 관리
+ 지표 로깅 및 모니터링

## 사전 조건 및 제한 사항
<a name="manage-tenants-across-multiple-saas-products-on-a-single-control-plane-prereqs"></a>

**사전 조건 **
+ 활성 상태의 AWS 계정
+ Amazon Cognito 또는 타사 ID 제공업체(IdP)에 대한 지식
+ Amazon API Gateway에 대한 지식
+ AWS Lambda에 대한 지식
+ Amazon DynamoDB에 대한 지식
+ AWS Identity and Access Management(IAM)에 대한 지식
+ AWS Step Functions에 대한 지식
+ AWS CloudTrail 및 Amazon CloudWatch에 대한 지식
+ Python 라이브러리 및 코드에 대한 지식
+ 다양한 유형의 사용자(조직, 테넌트, 관리자, 애플리케이션 사용자), 구독 모델, 테넌트 격리 모델을 비롯한 SaaS API에 대한 지식
+ 조직의 다중 제품 SaaS 요구 사항 및 멀티테넌트 구독에 대한 지식

**제한 사항 **
+ 공통 테넌트 솔루션과 개별 SaaS 제품 간의 통합은 이 패턴에서 다루지 않습니다.
+ 이 패턴은 Amazon Cognito 서비스를 단일 AWS 리전에만 배포합니다.

## 아키텍처
<a name="manage-tenants-across-multiple-saas-products-on-a-single-control-plane-architecture"></a>

**대상 기술 스택  **
+ Amazon API Gateway
+ Amazon Cognito
+ AWS CloudTrail
+ Amazon CloudWatch
+ Amazon DynamoDB
+ IAM
+ AWS Lambda
+ Amazon Simple Storage Service (S3)
+ Amazon Simple Notification Service(SNS)
+ AWS Step Functions

**대상 아키텍처 **

다음 다이어그램은 AWS 클라우드의 단일 컨트롤 플레인에서 여러 SaaS 제품의 테넌트 수명 주기를 관리하는 워크플로 예제를 보여줍니다.

![\[단일 컨트롤 플레인에서 테넌트 수명 주기를 관리하기 위한 워크플로.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/4306bc76-22a7-45ca-a107-43df6c6f7ac8/images/700faf4d-c28f-4814-96aa-2d895cdcb518.png)


 이 다이어그램은 다음 워크플로를 보여줍니다.

1. AWS 사용자는 API Gateway 엔드포인트를 직접적으로 호출하여 테넌트 프로비저닝, 제품 프로비저닝 또는 관리 관련 작업을 시작합니다.

1. 이 사용자는 Amazon Cognito 사용자 풀 또는 다른 IdP에서 검색된 액세스 토큰으로 인증됩니다.

1. 개별 프로비저닝 또는 관리 작업은 API Gateway API 엔드포인트와 통합된 Lambda 함수에 의해 실행됩니다.

1. 일반 테넌트 솔루션용(테넌트, 제품 및 사용자용) 관리 API는 필요한 입력 파라미터, 헤더 및 토큰을 모두 수집합니다. 그런 다음 관리 API가 관련 Lambda 함수를 간접적으로 호출합니다.

1. 관리 API와 Lambda 함수 모두에 대한 IAM 권한은 IAM 서비스에 의해 검증됩니다.

1. Lambda 함수는 DynamoDB 및 Amazon S3의 카탈로그(테넌트, 제품 및 사용자용)를 저장하고 데이터를 검색합니다.

1. 권한이 검증되면 AWS Step Functions 워크플로가 간접적으로 호출되어 특정 업무를 수행합니다. 다이어그램의 예제는 테넌트 프로비저닝 워크플로를 보여줍니다.

1. 개별 AWS Step Functions 워크플로 업무는 미리 정해진 워크플로(상태 머신)에서 실행됩니다.

1. 각 워크플로 업무와 관련된 Lambda 함수를 실행하는 데 필요한 모든 필수 데이터는 DynamoDB 또는 Amazon S3에서 검색됩니다. 다른 AWS 리소스는 AWS CloudFormation 템플릿을 사용하여 프로비저닝되어야 할 수 있습니다.

1. 필요한 경우 워크플로는 특정 SaaS 제품에 대한 추가 AWS 리소스를 해당 제품의 AWS 계정에 프로비저닝하라는 요청을 보냅니다.

1. 이 요청이 성공하거나 실패하면 워크플로는 상태 업데이트를 Amazon SNS 주제에 메시지로 게시합니다.

1. Amazon SNS는 Step Functions 워크플로의 Amazon SNS 주제를 구독하고 있습니다.

1. 그러면 Amazon SNS에서는 AWS 사용자에게 워크플로 상태 업데이트를 다시 보냅니다.

1. API 직접 호출의 감사 추적을 포함하여 각 AWS 서비스의 작업 로그가 CloudWatch로 전송됩니다. CloudWatch에서 각 사용 사례에 대한 특정 규칙 및 경보를 구성할 수 있습니다.

1. 로그는 감사 목적으로 Amazon S3 버킷에 보관됩니다.

**자동화 및 규모 조정**

이 패턴은 공통 테넌트 솔루션의 배포를 자동화하기 위하여 CloudFormation 템플릿을 사용합니다. 또한 템플릿을 사용하면 관련 리소스를 빠르게 확장하거나 축소할 수 있습니다.

자세한 내용은 *AWS CloudFormation 사용 설명서*의 [AWS CloudFormation 템플릿 사용](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-guide.html)을 참조하세요.

## 도구
<a name="manage-tenants-across-multiple-saas-products-on-a-single-control-plane-tools"></a>

**서비스**
+ [Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html)는 규모와 관계없이 REST, HTTP 및 WebSocket API를 생성, 게시, 유지 관리, 모니터링 및 보호하는 것을 지원합니다.
+ [Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html)는 웹 및 모바일 앱에 대한 인증, 권한 부여 및 사용자 관리를 제공합니다.
+ [AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html)은 AWS 계정 의 거버넌스, 규정 준수, 운영 위험을 감사하는 데 도움이 됩니다.
+ [Amazon CloudWatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html)는 AWS 리소스의 지표와 AWS에서 실시간으로 실행되는 애플리케이션을 모니터링합니다.
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html)는 빠르고 예측 가능하고 확장 가능한 성능을 제공하는 완전 관리형 NoSQL 데이터베이스 서비스입니다.
+ [AWS Identity and Access Management(IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)를 사용하면 사용자에 대해 인증 및 권한 부여를 제어함으로써 AWS 리소스에 대한 액세스를 안전하게 관리할 수 있습니다.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)는 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행하는 데 도움이 되는 컴퓨팅 서비스입니다. 필요할 때만 코드를 실행하며 자동으로 확장이 가능하므로 사용한 컴퓨팅 시간만큼만 비용을 지불합니다.
+ [Amazon Simple Storage Service(Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)는 원하는 양의 데이터를 저장, 보호 및 검색하는 데 도움이 되는 클라우드 기반 객체 스토리지 서비스입니다.
+ [Amazon Simple Notification Service(Amazon SNS)](https://docs.aws.amazon.com/sns/latest/dg/welcome.html)를 사용하면 웹 서버 및 이메일 주소를 포함하여 게시자와 클라이언트 간의 메시지 교환을 조정하고 관리할 수 있습니다.
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html)는 AWS Lambda 함수와 기타 AWS 서비스를 결합할 수 있는 서버리스 오케스트레이션 서비스로, 비즈니스 크리티컬 애플리케이션을 구축합니다.

## 모범 사례
<a name="manage-tenants-across-multiple-saas-products-on-a-single-control-plane-best-practices"></a>

이 패턴의 솔루션은 단일 컨트롤 플레인을 사용하여 여러 테넌트의 온보딩을 관리하고, 여러 SaaS 제품에 대한 액세스를 프로비저닝합니다. 컨트롤 플레인은 관리 사용자가 다음 네 가지 기능별 영역을 관리하는 데 도움이 됩니다.
+ 보안 영역
+ 워크플로 영역
+ 통신 영역
+ 로깅 및 모니터링 영역

## 에픽
<a name="manage-tenants-across-multiple-saas-products-on-a-single-control-plane-epics"></a>

### 보안 플레인 구성
<a name="configure-the-security-plane"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 멀티테넌트 SaaS 플랫폼에 대한 요구 사항을 설정합니다. | 다음에 대한 세부 요구 사항을 설정하세요.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/manage-tenants-across-multiple-saas-products-on-a-single-control-plane.html) | 클라우드 아키텍트, AWS 시스템 관리자 | 
| Amazon Cognito 서비스를 설정합니다. | *Amazon Cognito 개발자 안내서*의 [Amazon Cognito 시작하기](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-getting-started.html)에 나와 있는 지침을 따르세요. | 클라우드 아키텍트 | 
| 필수 IAM 정책을 구성합니다. | 사용 사례에 필요한 IAM 정책을 생성합니다. 그런 다음 정책을 Amazon Cognito의 IAM 역할에 매핑합니다.자세한 내용은 *Amazon Cognito 개발자 안내서*의 [정책을 사용한 액세스 관리](https://docs.aws.amazon.com/cognito/latest/developerguide/security-iam.html#security_iam_access-manage)와 [역할 기반 액세스 제어](https://docs.aws.amazon.com/cognito/latest/developerguide/role-based-access-control.html)를 참조하세요. | 클라우드 관리자, 클라우드 아키텍트, AWS IAM 보안 | 
| 필요한 API 권한을 구성합니다. | IAM 역할 및 정책, Lambda 권한 부여자를 사용하여 API Gateway 액세스 권한을 설정합니다.지침은 *Amazon API Gateway 개발자 안내서*의 다음 섹션을 참조하세요.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/manage-tenants-across-multiple-saas-products-on-a-single-control-plane.html) | 클라우드 관리자, 클라우드 아키텍트 | 

### 데이터 영역 구성
<a name="configure-the-data-plane"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 필요한 데이터 카탈로그를 만드세요. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/manage-tenants-across-multiple-saas-products-on-a-single-control-plane.html)자세한 내용을 알아보려면 *Amazon DynamoDB 개발자 안내서*의 [DynamoDB란 무엇인가요?](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SettingUp.html)를 참조하세요. | DBA | 

### 컨트롤 플레인 설정
<a name="configure-the-control-plane"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| Lambda 함수 및 API Gateway API를 생성하여 필요한 컨트롤 플레인 작업을 실행합니다. | 별도의 Lambda 함수와 API Gateway API를 생성하여 다음을 추가, 삭제 및 관리합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/manage-tenants-across-multiple-saas-products-on-a-single-control-plane.html)자세한 내용은* AWS Lambda 개발자 안내서*의 [Amazon RDS와 함께 AWS Lambda 사용](https://docs.aws.amazon.com/lambda/latest/dg/services-apigateway.html)을 참조하세요. | 앱 개발자 | 

### 워크플로 영역 구성
<a name="configure-the-workflow-plane"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| AWS Step Functions 워크플로에서 실행해야 할 작업을 파악합니다. | 다음에 대한 AWS Step Functions 워크플로 요구 사항을 상세하게 파악하고 문서화하세요.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/manage-tenants-across-multiple-saas-products-on-a-single-control-plane.html)주요 이해 관계자가 요구 사항을 승인했는지 확인하세요. | 앱 소유자 | 
| 필요한 AWS Step Functions 워크플로를 생성합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/manage-tenants-across-multiple-saas-products-on-a-single-control-plane.html) | 앱 개발자, 빌드 리더 | 

### 통신 영역 구성
<a name="configure-the-communication-plane"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| Amazon SNS 주제를 생성합니다. | Amazon SNS 주제를 생성하여 다음에 대한 알림을 받아봅니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/manage-tenants-across-multiple-saas-products-on-a-single-control-plane.html)자세한 정보는 *Amazon SNS 개발자 안내서*의 [SNS 주제 생성](https://docs.aws.amazon.com/sns/latest/dg/sns-create-topic.html)을 참조하세요. | 앱 소유자, 클라우드 아키텍트 | 
| 각 Amazon SNS 주제에 엔드포인트 구독을 선택합니다. | Amazon SNS 주제에 게시된 메시지를 수신하려면 엔드포인트에서 해당 주제를 구독해야 합니다.자세한 정보는 *Amazon SNS 개발자 안내서*에서 [Amazon SNS 주제 구독](https://docs.aws.amazon.com/sns/latest/dg/sns-create-subscribe-endpoint-to-topic.html)을 참조하세요. | 앱 개발자, 클라우드 아키텍트 | 

### 로깅 및 모니터링 영역 구성
<a name="configure-the-logging-and-monitoring-plane"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 공통 테넌트 솔루션의 각 구성 요소에 대한 로깅을 활성화합니다. | 생성한 공통 테넌트 솔루션의 각 리소스에 대해 구성 요소 수준에서 로깅을 활성화합니다.지침은 다음을 참조하세요.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/manage-tenants-across-multiple-saas-products-on-a-single-control-plane.html)IAM 정책을 사용하여 각 리소스의 로그를 중앙 집중식 로깅 계정으로 통합할 수 있습니다. 자세한 내용은 [중앙 집중식 로깅 및 다중 계정 보안 가드레일](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/centralized-logging-and-multiple-account-security-guardrails.html)을 참조하세요. | AWS 시스템 관리자, 클라우드 관리자, DevOps 엔지니어 | 

### 공통 테넌트 솔루션 프로비저닝 및 배포
<a name="provision-and-deploy-the-common-tenant-solution"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| CloudFormation 템플릿을 생성합니다. | CloudFormation 템플릿을 사용하여 전체 공통 테넌트 솔루션과 모든 구성 요소의 배포 및 유지 관리를 자동화합니다.자세한 내용은 [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-guide.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-guide.html)를 참조하세요. | 앱 개발자, DevOps 엔지니어, CloudFormation 개발자 | 

## 관련 리소스
<a name="manage-tenants-across-multiple-saas-products-on-a-single-control-plane-resources"></a>
+ [Amazon Cognito 사용자 풀을 권한 부여자로 사용하여 REST API에 대한 액세스 제어](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-integrate-with-cognito.html)(*API Gateway 개발자 가이드*)
+ [API Gateway Lambda 권한 부여자 사용](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html)(*Amazon API Gateway 개발자 가이드*)
+ [Amazon Cognito 사용자 풀](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools.html)(*Amazon Cognito 개발자 안내서*)
+ [교차 계정 교차 리전 CloudWatch 콘솔](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Cross-Account-Cross-Region.html)(*Amazon CloudWatch 사용 설명서*)

# 정적 IP 주소와 연결된 엔드포인트를 사용하여 Amazon S3 미리 서명된 URL 생성 및 객체 다운로드 통합
<a name="consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses"></a>

*Amazon Web Services의 송진, 조은혜, 이준성*

## 요약
<a name="consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses-summary"></a>

이 패턴은 객체 다운로드를 위해 안전한 사용자 지정 미리 서명된 URL을 생성하여 Amazon Simple Storage Service(Amazon S3)에 대한 액세스를 간소화합니다. 솔루션은 고유한 도메인과 고정 IP 주소가 있는 단일 엔드포인트를 제공합니다. 정적 IP 주소가 있는 통합 도메인에서 API 및 Amazon S3 엔드포인트를 통합해야 하는 고객을 위해 조정되었습니다. 사용 사례에는 IP 및 도메인 허용 목록 방화벽 정책을 따르는 사용자가 포함되며, API 액세스를 특정 도메인 및 IP 주소로 제한합니다.

아키텍처는 Amazon API Gateway AWS Global Accelerator, AWS Lambda Application Load Balancer AWS PrivateLink및 Amazon S3를 AWS 서비스포함한 키를 사용합니다. 이 설계는 미리 서명된 URL과 정적 IP 주소 2개가 있는 액셀러레이터에 연결된 단일 도메인에서 Amazon S3 엔드포인트를 중앙 집중화합니다. 따라서 사용자는 미리 서명된 URL을 손쉽게 요청하고 정적 IP 주소가 있는 통합 도메인 엔드포인트를 통해 Amazon S3 객체를 다운로드할 수 있습니다.

이 아키텍처는 퍼블릭, 의료 및 금융 부문과 같은 엄격한 정책 또는 규정 준수 요구 사항이 있는 고객에게 특히 유용합니다.

## 사전 조건 및 제한 사항
<a name="consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses-prereqs"></a>

**사전 조건 **
+ 활성 AWS 계정
+ 사용자 지정 도메인의 퍼블릭 호스팅 영역 삭제
+  AWS 리전 선택한의 AWS Certificate Manager (ACM)에서 가져온 도메인

**제한 사항 **
+ 레코드의 이름은 Amazon S3 버킷의 이름과 일치해야 합니다. 이 요구 사항은 Amazon S3 엔드포인트가 단일 API 엔드포인트를 통해 제공될 수 있도록 하기 위한 것입니다.
+ API Gateway에 사용되는 사용자 지정 도메인 이름은 단일 API 엔드포인트의 도메인 이름과 일치해야 합니다.
+ 일부 AWS 서비스 는 전혀 사용할 수 없습니다 AWS 리전. 리전별 가용성은 [리전별AWS 서비스](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)를 참조하세요. 구체적인 엔드포인트는 [서비스 엔드포인트 및 할당량](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)을 참조하고 서비스 링크를 선택합니다.

## 아키텍처
<a name="consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses-architecture"></a>

다음 다이어그램은 이 패턴의 워크플로 및 구성 요소를 보여 줍니다.

![\[미리 서명된 URL 생성 및 객체 다운로드를 위한 구성 요소 및 워크플로입니다.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/e19ebcb5-2138-481e-952e-3cfee9ad9e97/images/effd197c-d4d7-4990-8b66-3eb1c64aab4c.png)


다이어그램은 다음 워크플로를 보여줍니다:

1. 사용자는 사용자 지정 도메인 이름 및 연결된 IP 주소를 사용하여 서비스되는 사용자 지정 엔드포인트를 AWS Global Accelerator사용하여 미리 서명된 URL을 생성하라는 요청을 시작합니다.

1. Lambda 함수는 사용자 지정 엔드포인트를 가리키는 미리 서명된 URL을 생성합니다. 미리 서명된 URL이 포함된 301 리디렉션으로 응답합니다. 미리 서명된 리디렉션 URL을 통해 사용자는 Global Accelerator를 통해 제공되는 사용자 지정 엔드포인트를 사용하여 객체를 자동으로 다운로드합니다.

미리 서명된 URL 생성 및 객체 다운로드 워크플로를 위한 전체 아키텍처의 구성 요소는 다음과 같습니다.
+ Global Accelerator에 의한 고정 IP 주소 프로비저닝.
+ 사용자 지정 도메인 이름을 사용하여 Amazon Route 53 퍼블릭 호스팅 영역에 액셀러레이터의 별칭을 A 레코드로 등록합니다.
+ 등록된 사용자 지정 도메인 이름과 일치하는 버킷 이름으로 Amazon S3 버킷 생성.
+ API Gateway 및 Amazon S3 서비스를 위한 VPC 엔드포인트 생성.
+ Global Accelerator에 연결하기 위한 내부 Application Load Balancer의 구성입니다.
+ ACM 인증서가 연결된 API Gateway에 대한 사용자 지정 도메인 이름 할당.
+ Lambda 함수와 통합된 프라이빗 API Gateway 배포.
+ Lambda 함수에는 AWS Identity and Access Management (IAM) 역할이 연결되어 있습니다([GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html) 권한 있음).

## 도구
<a name="consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses-tools"></a>

**AWS 서비스**
+ [Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html)는 규모와 관계없이 REST, HTTP 및 WebSocket API를 생성, 게시, 유지 관리, 모니터링 및 보호하는 것을 지원합니다.
+ [Application Load Balance](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/)는 여러 가용 영역에서 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스 같은 여러 대상에 수신 애플리케이션 트래픽을 분산합니다.
+ [AWS Certificate Manager (ACM)](https://docs.aws.amazon.com/acm/latest/userguide/acm-overview.html)을 사용하면 웹 AWS 사이트와 애플리케이션을 보호하는 퍼블릭 및 프라이빗 SSL/TLS X.509 인증서와 키를 생성, 저장 및 갱신할 수 있습니다.
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html)는 코드로 AWS 클라우드 인프라를 정의하고 프로비저닝하는 데 도움이 되는 소프트웨어 개발 프레임워크입니다.
+ Global Accelerator는 여러 의 엔드포인트를 지원하는 글로벌 서비스입니다. AWS 글로벌 네트워크를 통해 트래픽을 최적의 엔드포인트로 보내는 액셀러레이터를 생성할 수 있습니다. 이렇게 하면 전 세계 사용자가 이용하는 인터넷 애플리케이션의 가용성과 성능이 향상됩니다.
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)는 AWS 리소스에 대한 액세스를 인증하고 사용할 수 있는 권한을 부여받은 사용자를 제어하여 리소스에 대한 액세스를 안전하게 관리하는 데 도움이 됩니다.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)는 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행하는 데 도움이 되는 컴퓨팅 서비스입니다. 필요할 때만 코드를 실행하며 자동으로 확장이 가능하므로 사용한 컴퓨팅 시간만큼만 비용을 지불합니다.
+ [AWS PrivateLink](https://docs.aws.amazon.com/vpc/latest/privatelink/what-is-privatelink.html)는 Virtual Private Cloud(VPC)에서 VPC 외부 서비스로의 단방향 프라이빗 연결을 생성하는 데 도움이 됩니다.
+ [Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html)은 가용성과 확장성이 뛰어난 DNS 웹 서비스입니다.
+ [Amazon Simple Storage Service(S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)는 원하는 양의 데이터를 저장, 보호 및 검색하는 데 도움이 되는 클라우드 기반 객체 스토리지 서비스입니다.

**기타 도구**
+ [Terraform](https://www.terraform.io/)은 HashiCorp의 코드형 인프라(IaC) 도구로, 클라우드 및 온프레미스 리소스를 생성하고 관리하는 데 도움이 됩니다.

**코드 리포지토리**

기본 설정에 따라 AWS CDK 또는 Terraform을 사용하여이 패턴을 배포할 수 있습니다. [에픽](#consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses-epics) 섹션에는 두 배포 방법에 대한 지침이 포함되어 있습니다. 이 패턴의 코드는 GitHub unloaddb2 리포지토리에서 확인할 수 있습니다.
+ **AWS CDK** – [s3-presignedurl-staticips-endpoint-with-cdk](https://github.com/aws-samples/s3-presignedurl-staticips-endpoint-with-cdk)
+ **Terraform** – [s3-presignedurl-staticips-endpoint-with-terraform](https://github.com/aws-samples/s3-presignedurl-staticips-endpoint-with-terraform)

## 모범 사례
<a name="consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses-best-practices"></a>
+ 프로덕션 환경에서 보안을 강화하려면 [Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html)와 같은 권한 부여 메커니즘을 구현하여 `PresignedUrl` 생성 API에 대한 액세스를 제한하는 것이 중요합니다.
+ 최소 권한 원칙을 따르고 작업을 수행하는 데 필요한 최소 권한을 부여하세요. 자세한 내용은 IAM 설명서의 [최소 권한 부여](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#grant-least-priv) 및 [보안 모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)를 참조하세요.

## 에픽
<a name="consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses-epics"></a>

### 환경 준비
<a name="prepare-the-environment"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 도메인 이름을 결정합니다. | 통합 Amazon S3 엔드포인트의 퍼블릭 도메인 이름을 결정합니다. 도메인 이름은 Amazon S3 버킷 이름으로도 사용됩니다. | AWS 시스템 관리자, 네트워크 관리자 | 
| 퍼블릭 호스팅 영역을 만듭니다. | Route 53에서 퍼블릭 호스팅 영역을 생성합니다. 도메인 이름은 API Gateway에서 사용되는 도메인 이름과 일치해야 합니다. | AWS 시스템 관리자, 네트워크 관리자 | 
| SSL 인증서를 준비합니다. |  AWS Certificate Manager (ACM)을 사용하여 웹 애플리케이션 도메인에 대한 SSL 인증서를 [요청](https://docs.aws.amazon.com/acm/latest/userguide/acm-public-certificates.html)하거나 [가져옵니다](https://docs.aws.amazon.com/acm/latest/userguide/import-certificate.html). | AWS 시스템 관리자, 네트워크 관리자 | 

### Terraform을 사용하여 패턴 배포
<a name="deploy-the-pattern-with-terraform"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| .NET 개발 환경 설정 | 개발 환경을 설정하려면 다음을 수행합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses.html) | AWS 관리자, 클라우드 관리자 | 
| `.tfvars` 및 ** **`provider.tf` 파일을 수정합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses.html)**다음을 참조하세요.**[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses.html) | AWS 관리자, 클라우드 관리자 | 
| 네트워크 리소스를 프로비저닝합니다. | 네트워크 리소스를 프로비저닝하려면 다음 명령을 실행합니다.<pre>cd ./2.vpc_alb_ga<br />terraform init<br />terraform plan --var-file=apg.tfvars<br />terraform apply --var-file=apg.tfvars</pre>`apply `명령을 실행하는 동안 메시지가 표시되면 **yes**를 입력합니다. | AWS 관리자, 클라우드 관리자 | 
| API Gateway, Amazon S3 및 Lambda를 프로비저닝합니다. | 네트워크 리소스를 프로비저닝하려면 다음 명령을 사용합니다.<pre>cd ./2.apigw_s3_lambda<br />terraform init<br />terraform plan --var-file=apg.tfvars<br />terraform apply --var-file=apg.tfvars</pre> | AWS 관리자, 클라우드 관리자 | 

### 를 사용하여 패턴 배포 AWS CDK
<a name="deploy-the-pattern-with-cdk"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
|  AWS CDK 개발 환경을 설정합니다. | 개발 환경을 설정하려면 다음을 수행합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses.html) | AWS 관리자, 클라우드 관리자 | 
| `config/index.ts` 파일에서 도메인 설정을 구성합니다. | 상수 변수의 옵션을 편집하려면 다음 명령을 사용합니다.<pre>export const options = {<br />    certificateArn: '{arn of the acm which created before}',<br />    dnsAttr: {<br />        zoneName: '{public hosted zone name}',<br />        hostedZoneId: 'hosted zone Id',<br />    },<br />    domainNamePrefix: '{Prefix for the domain}',<br />    presignPath: 'presign',<br />    objectsPath: 'objects',<br />};</pre>다음 예시에서 각 자리 표시자를 자신의 정보로 바꿉니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses.html) | AWS 관리자, 클라우드 관리자 | 
| 스택을 배포합니다. | Virtual Private Cloud(VPC)용 스택과 애플리케이션용 스택의 두 스택을 배포하려면 다음 명령을 사용합니다.<pre>$ npm install <br />$ cdk synth <br />$ cdk deploy --all</pre> | AWS 관리자, 클라우드 관리자 | 

### 패턴 테스트
<a name="test-the-pattern"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 서버 엔드포인트의 IP 주소입니다. | 이 패턴의 도메인에 고정 IP 주소가 있는지 확인하려면 다음 명령을 사용합니다.<pre>nslookup ${s3-bucket-prefix}.${domain}</pre> | 네트워크 관리자 | 
| 나중에 다운로드할 수 있는 테스트 파일을 업로드합니다. | Amazon S3 버킷의 `'/objects'` 폴더에 테스트 파일을 업로드합니다. | AWS 관리자, 클라우드 관리자 | 
| 을 사용하여 미리 서명된 URL을 생성하려면 | 미리 서명된 URL을 생성하려면 다음 형식을 사용하여 브라우저 또는 API 클라이언트(예: [Postman](https://www.postman.com/product/what-is-postman/))에서 URL을 직접적으로 호출합니다.<pre>https://${s3-bucket-prefix}.${domain}/presign/objects/${uploaded-filename}</pre>`${s3-bucket-prefix}` 및의 자리 표시자 값을 이전 단계에서 설정한 `${domain}` 값으로 바꿉니다. | 앱 소유자 | 
| 결과를 확인합니다. | 예상되는 결과는 301(영구 이동됨) 리디렉션 상태 코드를 받아야 한다는 것입니다. 이 응답에는 테스트 파일 다운로드를 자동으로 시작하는 미리 서명된 URL이 포함됩니다. | 테스트 엔지니어 | 

### Terraform으로 정리
<a name="clean-up-with-terraform"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| API Gateway, Amazon S3 및 Lambda 리소스를 폐기합니다. | 다음 명령을 사용하여 리소스를 삭제합니다.<pre>cd ./2.apigw_s3_lambda<br />terraform init<br />terraform plan --destroy --var-file=apg.tfvars<br />terraform destroy --var-file=apg.tfvars<br /></pre> | AWS 관리자, 클라우드 관리자 | 
| 네트워크 리소스를 폐기합니다. | 다음 명령을 사용하여 리소스를 삭제합니다.<pre>cd ./1.vpc_alb_ga<br />terraform init<br />terraform plan --destroy --var-file=apg.tfvars<br />terraform destroy --var-file=apg.tfvars<br /></pre> | AWS 관리자, 클라우드 관리자 | 

### 를 사용하여 정리 AWS CDK
<a name="clean-up-with-cdk"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 스택을 폐기합니다. | VPC 스택과 애플리케이션 스택을 모두 삭제하려면 다음 명령을 사용합니다.<pre>$ cdk destroy --all</pre> | AWS 관리자, 클라우드 관리자 | 
| Amazon S3 버킷을 비우고 삭제하려면 | 기본적으로 [삭제](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-bucket.html)되지 않은 객체 Amazon S3 버킷과 로그 Amazon S3 버킷을 [비우](https://docs.aws.amazon.com/AmazonS3/latest/userguide/empty-bucket.html)고 삭제합니다.Amazon S3 버킷 이름은 `${s3-bucket-prefix}.${domain}` 및 입니다`${s3-bucket-prefix}.${domain}-logs`.[AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)를 사용하여 버킷을 삭제하려면 다음 명령을 사용합니다.<pre>$ aws s3 rm s3://${s3-bucket-prefix}.${domain} --recursive<br />$ aws s3 rb s3://${s3-bucket-prefix}.${domain} --force<br />$ aws s3 rm s3://${s3-bucket-prefix}.${domain}-logs --recursive<br />$ aws s3 rb s3://${s3-bucket-prefix}.${domain}-logs --force</pre>`${s3-bucket-prefix}` 및 `${domain}`를 이전 단계에서 반환된 값으로 바꿉니다. | AWS 관리자, 클라우드 관리자 | 

## 관련 리소스
<a name="consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses-resources"></a>

**AWS 블로그**
+ [에서 제공하는 고정 IP 주소를 통해 Amazon API Gateway에 액세스 AWS Global Accelerator](https://aws.amazon.com/blogs/networking-and-content-delivery/accessing-an-aws-api-gateway-via-static-ip-addresses-provided-by-aws-global-accelerator/) 
+ [JavaScript AWS CDK 용 모듈식으로 미리 서명된 URL 생성](https://aws.amazon.com/blogs/developer/generate-presigned-url-modular-aws-sdk-javascript/) 
+ [ALB, S3 및 PrivateLink를 사용하여 내부 HTTPS 정적 웹 사이트 호스팅](https://aws.amazon.com/blogs/networking-and-content-delivery/hosting-internal-https-static-websites-with-alb-s3-and-privatelink/) 

# 조직에서 교차 계정 Amazon EventBridge 연결 생성
<a name="create-cross-account-amazon-eventbridge-connection-organization"></a>

*Sam Wilson과 Robert Stone, Amazon Web Services*

## 요약
<a name="create-cross-account-amazon-eventbridge-connection-organization-summary"></a>

대규모 분산 시스템은 Amazon EventBridge를 사용하여 AWS Organizations 조직의 다양한 Amazon Web Services(AWS) 계정 간에 상태 변경을 전달합니다. 그러나 EventBridge는 일반적으로 동일한의 엔드포인트 또는 소비자만 대상으로 지정할 수 있습니다 AWS 계정. 다른 계정의 이벤트 버스는 예외입니다. 해당 이벤트 버스는 유효한 대상입니다. 다른 계정의 이벤트 버스에서 이벤트를 사용하려면 이벤트를 소스 계정의 이벤트 버스에서 대상 계정의 이벤트 버스로 푸시해야 합니다. 여러 내의 애플리케이션에서 중요한 이벤트를 관리할 때 발생하는 문제를 방지하려면이 패턴에 제시된 권장 접근 방식을 AWS 계정사용합니다.

이 패턴은 AWS Organizations 조직의 여러를 포함하는 EventBridge를 사용하여 이벤트 기반 아키텍처 AWS 계정 를 구현하는 방법을 보여줍니다. 패턴은 AWS Cloud Development Kit (AWS CDK) Toolkit 및를 사용합니다 AWS CloudFormation.

EventBridge는 이벤트를 수신, 필터링, 변환, 라우팅 및 전송하는 데 도움이 되는 서버리스 이벤트 버스를 제공합니다. 이벤트 기반 아키텍처의 중요한 구성 요소인 EventBridge는 메시지 생산자와 해당 메시지 소비자 간의 분리를 지원합니다. 단일 계정에서 이는 간단합니다. 다중 계정 구조를 사용하려면 한 계정의 이벤트 버스에서 이벤트를 동일한 조직 내의 다른 계정에서 사용하기 위한 추가 고려 사항이 필요합니다.

생산자 및 소비자의 계정별 고려 사항에 대한 자세한 내용은 [추가 정보](#create-cross-account-amazon-eventbridge-connection-organization-additional) 섹션을 참조하세요.

## 사전 조건 및 제한 사항
<a name="create-cross-account-amazon-eventbridge-connection-organization-prereqs"></a>

**사전 조건 **
+ 둘 이상의 연결된 AWS Organizations 조직이 있는 경우 AWS 계정
+ 를 AWS 계정 사용하여 두에서 인프라를 프로비저닝할 수 AWS 계정 있는 ( AWS Identity and Access Management IAM) 역할 AWS CloudFormation
+ [로컬에 설치된](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) Git
+ AWS Command Line Interface [로컬에 설치된](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) (AWS CLI)
+ AWS CDK [로컬에 설치](https://docs.aws.amazon.com/cdk/latest/guide/cli.html)되고 둘 다에 [부트스트래핑](https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping.html#bootstrapping-howto)됨 AWS 계정

**제품 버전**

이 패턴은 다음 도구 및 버전을 사용하여 구축 및 테스트되었습니다.
+ AWS CDK 도구 키트 2.126.0
+ Node.js 18.19.0
+ npm 10.2.3
+ Python 3.12

이 패턴은 모든 버전의 AWS CDK v2 또는 npm에서 작동해야 합니다. 참고로 Node.js 버전 13.0.0부터 13.6.0까지는 AWS CDK와 호환되지 않습니다.

## 아키텍처
<a name="create-cross-account-amazon-eventbridge-connection-organization-architecture"></a>

**대상 아키텍처**

다음 다이어그램은 한 계정에서 이벤트를 푸시하고 다른 계정에서 사용하기 위한 아키텍처 워크플로를 보여줍니다.

![\[소스 생산자 계정과 대상 소비자 계정을 연결하는 3단계 프로세스입니다.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/34a5f3ae-511d-4636-999f-c73396770117/images/ccc4878a-6281-4a77-a483-4e6f299d7807.png)


워크플로우는 다음 단계로 구성됩니다.

1. 소스 계정의 생산자 AWS Lambda 함수는 계정의 EventBridge 이벤트 버스에 이벤트를 배치합니다.

1. 교차 계정 EventBridge 규칙은 대상 계정의 EventBridge 이벤트 버스로 이벤트를 라우팅합니다.

1. 대상 계정의 EventBridge 이벤트 버스에는 소비자 Lambda 함수를 간접적으로 호출하는 대상 Lambda 규칙이 있습니다.

소비자 Lambda 함수의 실패한 간접 호출을 처리하기 위해 [DLQ(Dead Letter Queue)](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html)를 사용하는 것이 가장 좋습니다. 그러나 명확성을 위해 DLQ가이 솔루션에서 생략되었습니다. 워크플로에서 DLQ를 구현하고 실패로부터 복구하는 워크플로의 기능을 개선하는 방법에 대해 자세히 알아보려면 [AWS Lambda 오류 처리 패턴 구현](https://aws.amazon.com/blogs/compute/implementing-aws-lambda-error-handling-patterns/) 블로그 게시물을 참조하세요.

**자동화 및 규모 조정**

AWS CDK 는 필요한 아키텍처를 자동으로 프로비저닝합니다. EventBridge는에 따라 초당 수천 개의 레코드로 확장할 수 있습니다 AWS 리전. 자세한 내용은 [Amazon EventBridge 문서](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-quota.html)를 참조하십시오.

## 도구
<a name="create-cross-account-amazon-eventbridge-connection-organization-tools"></a>

**AWS 서비스**
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/home.html)는 코드로 AWS 클라우드 인프라를 정의하고 프로비저닝하는 데 도움이 되는 소프트웨어 개발 프레임워크입니다. 이 패턴은 AWS CDK 앱과 상호 작용하는 데 도움이 되는 명령줄 클라우드 개발 키트인 [AWS CDK 도구](https://docs.aws.amazon.com/cdk/latest/guide/cli.html) 키트를 사용합니다.
+ [Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html)는 애플리케이션을 다양한 소스의 실시간 데이터와 연결할 수 있는 서버리스 이벤트 버스 서비스입니다. 예를 들어 AWS Lambda 함수, API 대상을 사용하는 HTTP 호출 엔드포인트 또는 다른의 이벤트 버스 등이 있습니다 AWS 계정.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)는 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행하는 데 도움이 되는 컴퓨팅 서비스입니다. 필요할 때만 코드를 실행하며 자동으로 확장이 가능하므로 사용한 컴퓨팅 시간만큼만 비용을 지불합니다.
+ [AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html)는 여러을 생성하여 중앙에서 관리하는 조직 AWS 계정 으로 통합하는 데 도움이 되는 계정 관리 서비스입니다.

**기타 도구**
+ [Node.js](https://nodejs.org/en/docs/)는 확장 가능한 네트워크 애플리케이션 구축을 위해 설계된 이벤트 기반 JavaScript 런타임 환경입니다.
+ [npm](https://docs.npmjs.com/about-npm)은 Node.js 환경에서 실행되는 소프트웨어 레지스트리로, 패키지를 공유 또는 대여하고 개인 패키지의 배포를 관리하는 데 사용됩니다.
+ [Python](https://www.python.org/)은 범용 컴퓨터 프로그래밍 언어입니다.

**코드 리포지토리**

이 패턴의 코드는 GitHub [cross-account-eventbridge-in-organization](https://github.com/aws-samples/aws-cdk-examples/tree/main/python/cross-account-eventbridge-in-organization) 리포지토리에서 사용할 수 있습니다.

## 모범 사례
<a name="create-cross-account-amazon-eventbridge-connection-organization-best-practices"></a>

EventBridge 작업의 모범 사례는 다음 리소스를 참조하세요.
+ [Amazon EventBridge 이벤트 패턴 모범 사례](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-patterns-best-practices.html)
+ [Amazon EventBridge에서 규칙을 정의하는 모범 사례](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-rules-best-practices.html)

## 에픽
<a name="create-cross-account-amazon-eventbridge-connection-organization-epics"></a>

### 로컬 AWS CDK 배포 환경 준비
<a name="prepare-your-local-cdk-deployment-environment"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 소스 계정 및 대상 계정에 대한 로컬 자격 증명을 구성합니다. | [새 구성 및 자격 증명 설정을](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-quickstart.html#getting-started-quickstart-new) 검토하고 환경에 가장 적합한 인증 및 자격 증명 방법을 사용합니다.소스 계정 및 대상 계정 인증 모두에 AWS CLI 대해를 구성해야 합니다.이 지침에서는 `sourceAccount` 및 라는 두 개의 AWS 프로파일을 로컬로 구성했다고 가정합니다`destinationAccount`. | 앱 개발자 | 
| 둘 다 부트스트랩합니다 AWS 계정. | 계정을 부트스트랩하려면 다음 명령을 실행합니다.<pre>cdk bootstrap --profile sourceAccount<br />cdk bootstrap --profile destinationAccount</pre> | 앱 개발자 | 
| 패턴 코드를 복제합니다. | 리포지토리를 복제하려면 다음 명령을 실행합니다.<pre>git clone git@github.com:aws-samples/aws-cdk-examples.git</pre>그런 다음 디렉터리를 새로 복제된 프로젝트 폴더로 변경합니다.<pre>cd aws-cdk-examples/python/cross-account-eventbridge-in-organization</pre> | 앱 개발자 | 

### 소스 계정에 ProducerStack 배포
<a name="deploy-producerstack-to-the-source-account"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
|  AWS Organizations 및 계정 세부 정보로 `cdk.json`를 수정합니다. | 프로젝트의 루트 폴더에서를 `cdk.json`다음과 같이 변경합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/create-cross-account-amazon-eventbridge-connection-organization.html) | 앱 개발자 | 
| ProducerStack 리소스를 배포합니다. | 프로젝트의 루트 디렉터리에서 다음 Amplify CLI 명령을 실행합니다.<pre>cdk deploy ProducerStack --profile sourceAccount</pre>메시지가 표시되면를 통해 생성된 새 IAM 역할 및 기타 보안 관련 권한을 수락합니다 AWS CloudFormation. | 앱 개발자 | 
| ProducerStack 리소스가 배포되었는지 확인합니다. | 리소스를 확인하려면 다음을 수행합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/create-cross-account-amazon-eventbridge-connection-organization.html) | 앱 개발자 | 

### 대상 계정에 ConsumerStack 배포
<a name="deploy-consumerstack-to-the-destination-account"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| ConsumerStack 리소스를 배포합니다. | 프로젝트의 루트 디렉터리에서 다음 Amplify CLI 명령을 실행합니다.<pre>cdk deploy ConsumerStack --profile destinationAccount</pre>메시지가 표시되면를 통해 생성된 새 IAM 역할 및 기타 보안 관련 권한을 수락합니다 CloudFormation. | 앱 개발자 | 
| ConsumerStack 리소스가 배포되었는지 확인 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/create-cross-account-amazon-eventbridge-connection-organization.html) | 앱 개발자 | 

### 이벤트 생성 및 소비
<a name="produce-and-consume-events"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 생산자 Lambda 함수를 간접적으로 호출합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/create-cross-account-amazon-eventbridge-connection-organization.html) | 앱 개발자 | 
| 이벤트가 수신되었는지 확인합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/create-cross-account-amazon-eventbridge-connection-organization.html) | 앱 개발자 | 

### 정리
<a name="cleanup"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| ConsumerStack 리소스를 폐기합니다. | 이 패턴을 테스트로 사용하는 경우 추가 비용이 발생하지 않도록 배포된 리소스를 정리합니다.프로젝트의 루트 디렉터리에서 다음 Amplify CLI 명령을 실행합니다.<pre>cdk destroy ConsumerStack --profile destinationAccount</pre>삭제를 확인하는 메시지가 표시됩니다. | 앱 개발자 | 
| ProducerStack 리소스를 폐기합니다. | 프로젝트의 루트 디렉터리에서 다음 Amplify CLI 명령을 실행합니다.<pre>cdk destroy ProducerStack --profile sourceAccount</pre>삭제를 확인하는 메시지가 표시됩니다. | 앱 개발자 | 

## 문제 해결
<a name="create-cross-account-amazon-eventbridge-connection-organization-troubleshooting"></a>


| 문제 | Solution | 
| --- | --- | 
| 대상 계정에서 수신된 이벤트가 없습니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/create-cross-account-amazon-eventbridge-connection-organization.html) | 
| 콘솔에서 Lambda 함수를 간접적으로 호출하면 다음 오류가 반환됩니다.`User: arn:aws:iam::123456789012:user/XXXXX is not authorized to perform: lambda:Invoke` | `ProducerStack-ProducerLambdaXXXX` Lambda 함수에 대한 적절한 `lambda:Invoke` 작업 권한을 받으려면 AWS 계정 관리자에게 문의하세요. | 

## 관련 리소스
<a name="create-cross-account-amazon-eventbridge-connection-organization-resources"></a>

**참조**
+ [AWS Organizations 사용 설명서](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html)
+ [Amazon EventBridge 이벤트 패턴](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-event-patterns.html)
+ [Amazon EventBridge의 규칙](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-rules.html)

**자습서 및 동영상**
+ [자습서: 조직 생성 및 구성](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_tutorials_basic.html)
+ [AWS re:Invent 2023 - Amazon EventBridge(COM301-R)를 사용한 고급 이벤트 기반 패턴](https://www.youtube.com/watch?v=6X4lSPkn4ps)

## 추가 정보
<a name="create-cross-account-amazon-eventbridge-connection-organization-additional"></a>

**생산자 규칙**

소스 계정에서 생산자의 메시지를 수락하도록 EventBridge 이벤트 버스가 생성됩니다( *아키텍처* 섹션에 표시됨). 이 이벤트 버스에는 IAM 권한이 포함된 규칙이 생성됩니다. 규칙은 다음 `cdk.json` 구조를 기반으로 대상 계정의 EventBridge 이벤트 버스를 대상으로 합니다.

```
"rules": [
  {
    "id": "CrossAccount",
    "sources": ["Producer"],
    "detail_types": ["TestType"],
    "targets": [
      {
        "id": "ConsumerEventBus",
        "arn": "arn:aws:events:us-east-2:012345678901:event-bus/CrossAccount"
      }
    ]
  }
]
```

각 소비 이벤트 버스에 대해 이벤트 패턴과 대상 이벤트 버스가 포함되어야 합니다.

*이벤트 패턴*

[이벤트 패턴](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-event-patterns.html)은이 규칙이 적용될 이벤트를 필터링합니다. 이 예에서 이벤트 소스와 `detail_types` 레코드는 소스 계정의 이벤트 버스에서 대상 계정의 이벤트 버스로 전송할 이벤트를 식별합니다.

*대상 이벤트 버스*

이 규칙은 다른 계정에 있는 이벤트 버스를 대상으로 합니다. 대상 이벤트 버스를 고유하게 식별하려면 전체 `arn` (Amazon 리소스 이름)이 필요하며 `id`는에서 사용하는 [논리적 ID](https://docs.aws.amazon.com/cdk/v2/guide/identifiers.html#identifiers_logical_ids)입니다 AWS CloudFormation. 대상 규칙 생성 시 대상 이벤트 버스가 실제로 존재할 필요는 없습니다.

**대상 계정별 고려 사항**

대상 계정에서 EventBridge 이벤트 버스는 소스 계정의 이벤트 버스로부터 메시지를 수신하도록 생성됩니다. 소스 계정에서 이벤트를 게시하려면 [리소스 기반 정책을](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-use-resource-based.html) 생성해야 합니다.

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [{
    "Sid": "AllowOrgToPutEvents",
    "Effect": "Allow",
    "Principal": "*",
    "Action": "events:PutEvents",
    "Resource": "arn:aws:events:us-east-2:012345678901:event-bus/CrossAccount",
    "Condition": {
      "StringEquals": {
        "aws:PrincipalOrgID": "o-XXXXXXXXX"
      }
    }
  }]
}
```

동일한 조직의 다른 계정이이 이벤트 버스에 이벤트를 게시할 수 있도록 `events:PutEvents` 권한을 부여하는 것이 특히 중요합니다. 를 조직 ID`aws:PrincipalOrgId`로 설정하면 필요한 권한이 부여됩니다.

**이벤트 패턴**

포함된 이벤트 패턴을 사용 사례에 맞게 수정할 수 있습니다.

```
rule = events.Rule(
    self,
    self.id + 'Rule' + rule_definition['id'],
    event_bus=event_bus,
    event_pattern=events.EventPattern(
        source=rule_definition['sources'],
        detail_type=rule_definition['detail_types'],
    )
)
```

불필요한 처리를 줄이기 위해 이벤트 패턴은 대상 계정에서 처리할 이벤트만 대상 계정의 이벤트 버스로 전송되도록 지정해야 합니다.

*리소스 기반 정책*

이 예에서는 조직 ID를 사용하여 대상 계정의 이벤트 버스에 이벤트를 넣을 수 있는 계정을 제어합니다. 소스 계정 지정과 같은 보다 제한적인 정책을 사용하는 것이 좋습니다.

*EventBridge 할당량*

다음 사항에 유의하세요.
+ 이벤트 버스당 300개의 규칙이 기본 할당량입니다. 필요한 경우 확장할 수 있지만 대부분의 사용 사례에 적합해야 합니다.
+ 규칙당 최대 5개의 대상이 허용됩니다. 이벤트 패턴에 대한 세분화된 제어를 지원하려면 애플리케이션 아키텍트가 각 대상 계정에 대해 고유한 규칙을 사용하는 것이 좋습니다.

# 에서 Kinesis Data Streams 및 Firehose를 사용하여 Amazon S3에 DynamoDB 레코드 전송 AWS CDK
<a name="deliver-dynamodb-records-to-amazon-s3-using-kinesis-data-streams-and-amazon-data-firehose-with-aws-cdk"></a>

*Shashank Shrivastava와 Daniel Matuki da Cunha, Amazon Web Services*

## 요약
<a name="deliver-dynamodb-records-to-amazon-s3-using-kinesis-data-streams-and-amazon-data-firehose-with-aws-cdk-summary"></a>

이 패턴은 Amazon Kinesis Data Streams와 Amazon Kinesis Data Firehose를 사용하여 Amazon DynamoDB에서 Amazon Simple Storage Service(Amazon S3)로 레코드를 전송하기 위한 샘플 코드 및 애플리케이션을 제공합니다. 패턴의 접근 방식은 [AWS Cloud Development Kit (AWS CDK) L3 구문을](https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html) 사용하며 데이터가 Amazon Web Services(AWS) 클라우드의 대상 S3 버킷으로 전송 AWS Lambda 되기 전에를 사용하여 데이터 변환을 수행하는 방법의 예를 포함합니다.

Kinesis Data Streams는 DynamoDB 테이블에서 항목 수준 수정 사항을 기록하여 필수 Kinesis 데이터 스트림에 복제합니다. 애플리케이션에서는 Kinesis 데이터 스트림에 액세스하고 항목 수준 변경 사항을 거의 실시간으로 볼 수 있습니다. 또한 Kinesis Data Streams를 사용하면 Amazon Kinesis Data Firehose 및 Amazon Managed Service for Apache Flink와 같은 다른 Kinesis 서비스에 액세스할 수도 있습니다. 즉, 실시간 대시보드를 제공하고, 알림을 생성하고, 동적 요금 및 광고를 구현하고, 정교한 데이터 분석을 수행하는 애플리케이션을 빌드할 수 있습니다.

이 패턴을 데이터 통합 사용 사례에 사용할 수 있습니다. 예를 들어, 운송 차량 또는 산업용 장비가 대량의 데이터를 DynamoDB 테이블로 전송할 수 있습니다. 그런 다음 이 데이터를 변환하여 Amazon S3에 호스팅된 데이터 레이크에 저장할 수 있습니다. 그런 다음 Amazon Athena, Amazon Redshift Spectrum, Amazon Rekognition 및 AWS Glue와 같은 서버리스 서비스를 사용하여 데이터를 쿼리 및 처리하고 잠재적 결함을 예측할 수 있습니다.

## 사전 조건 및 제한 사항
<a name="deliver-dynamodb-records-to-amazon-s3-using-kinesis-data-streams-and-amazon-data-firehose-with-aws-cdk-prereqs"></a>

*사전 조건 *
+ 활성. AWS 계정
+ AWS Command Line Interface (AWS CLI), 설치 및 구성됨. 자세한 내용은 AWS CLI 설명서[의 시작하기 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)를 참조하세요.
+ Node.js(18.x\$1) 및 npm, 설치 및 구성됨. 자세한 내용은 `npm` 설명서의 [Node.js 및 npm 다운로드 및 설치](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm)를 참조하세요.
+ aws-cdk(2.x\$1) 설치 및 구성 자세한 내용은 AWS CDK 설명서[의 시작하기 AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html)를 참조하세요.
+ GitHub [aws-dynamodb-kinesisfirehose-s3-ingestion](https://github.com/aws-samples/aws-dynamodb-kinesisfirehose-s3-ingestion/) 리포지토리는 로컬 머신에 복제 및 구성됩니다.
+ DynamoDB 테이블의 기존 샘플 데이터입니다. 데이터는 `{"SourceDataId": {"S": "123"},"MessageData":{"S": "Hello World"}}` 형식을 사용해야 합니다.

## 아키텍처
<a name="deliver-dynamodb-records-to-amazon-s3-using-kinesis-data-streams-and-amazon-data-firehose-with-aws-cdk-architecture"></a>

다음 다이어그램은 Kinesis Data Streams와 Kinesis Data Firehose를 사용하여 DynamoDB에서 Amazon S3로 레코드를 전송하는 예제 워크플로우를 보여줍니다.

![\[다음 다이어그램은 Kinesis Data Streams와 Kinesis Data Firehose를 사용하여 DynamoDB에서 Amazon S3로 레코드를 전송하는 예제 워크플로우를 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/e2a9c412-312e-4900-9774-19a281c578e4/images/6e6df998-e6c2-4eaf-b263-ace752194689.png)


이 다이어그램은 다음 워크플로를 보여줍니다.

1. Amazon API Gateway를 사용하여 DynamoDB용 프록시로 데이터를 수집합니다. 다른 소스를 사용하여 DynamoDB로 데이터를 수집할 수도 있습니다. 

1. 항목 수준 변경은 Kinesis Data Streams에서 거의 실시간으로 생성되어 Amazon S3로 전송됩니다.

1. Kinesis Data Streams는 변환 및 제공을 위해 Kinesis Data Firehose에 레코드를 전송합니다. 

1. Lambda 함수는 DynamoDB 레코드 형식의 레코드를 레코드 항목 속성 이름 및 값만 포함하는 JSON 형식으로 변환합니다.

## 도구
<a name="deliver-dynamodb-records-to-amazon-s3-using-kinesis-data-streams-and-amazon-data-firehose-with-aws-cdk-tools"></a>

*AWS 서비스*
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html)는 AWS 클라우드 인프라를 코드로 정의하고 프로비저닝하는 데 도움이 되는 소프트웨어 개발 프레임워크입니다.
+ [AWS CDK 도구 키트](https://docs.aws.amazon.com/cdk/latest/guide/cli.html)는 AWS CDK 앱과 상호 작용하는 데 도움이 되는 명령줄 클라우드 개발 키트입니다.
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)는 명령줄 셸의 명령을 AWS 서비스 통해와 상호 작용하는 데 도움이 되는 오픈 소스 도구입니다.
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)를 사용하면 AWS 리소스를 설정하고, 빠르고 일관되게 프로비저닝하고, AWS 계정 및의 수명 주기 동안 리소스를 관리할 수 있습니다 AWS 리전.

*코드 리포지토리*

이 패턴의 코드는 GitHub [aws-dynamodb-kinesisfirehose-s3-ingestion](https://github.com/aws-samples/aws-dynamodb-kinesisfirehose-s3-ingestion/) 리포지토리에서 사용할 수 있습니다.

## 에픽
<a name="deliver-dynamodb-records-to-amazon-s3-using-kinesis-data-streams-and-amazon-data-firehose-with-aws-cdk-epics"></a>

### 샘플 코드 설정 및 구성
<a name="set-up-and-configure-the-sample-code"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 종속성을 설치합니다. | 로컬 시스템에서 다음 명령을 실행하여 `pattern/aws-dynamodb-kinesisstreams-s3` 및 `sample-application` 디렉터리의 `package.json` 파일에서 종속성을 설치합니다.<pre>cd <project_root>/pattern/aws-dynamodb-kinesisstreams-s3 </pre><pre>npm install && npm run build</pre><pre>cd <project_root>/sample-application/</pre><pre>npm install && npm run build</pre>  | 앱 개발자, 일반 AWS | 
| CloudFormation 템플릿을 생성합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/deliver-dynamodb-records-to-amazon-s3-using-kinesis-data-streams-and-amazon-data-firehose-with-aws-cdk.html) | 앱 개발자, 일반 AWS, AWS DevOps | 

### 리소스 배포
<a name="deploy-the-resources"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 리소스를 확인하고 배포하세요. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/deliver-dynamodb-records-to-amazon-s3-using-kinesis-data-streams-and-amazon-data-firehose-with-aws-cdk.html) | 앱 개발자, 일반 AWS, AWS DevOps | 

### DynamoDB 테이블로 데이터를 수집하여 솔루션 테스트
<a name="ingest-data-into-the-dynamodb-table-to-test-the-solution"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 샘플 데이터를 DynamoDB 테이블로 수집합니다. |  AWS CLI다음 명령을 실행하여 DynamoDB 테이블에 요청을 보냅니다.`aws dynamodb put-item --table-name <your_table_name> --item '{"<table_partition_key>": {"S": "<partition_key_ID>"},"MessageData":{"S": "<data>"}}'`예:`aws dynamodb put-item --table-name SourceData_table --item '{"SourceDataId": {"S": "123"},"MessageData":{"S": "Hello World"}}'`기본적으로 `put-item`은(는) 작업이 성공해도 출력으로 어떤 값도 반환하지 않습니다. 작업이 실패하면 오류가 반환됩니다. 데이터는 DynamoDB에 저장된 다음 Kinesis Data Streams 및 Kinesis Data Firehose로 전송됩니다. 참고: DynamoDB 테이블에 데이터를 추가할 때는 다양한 접근 방식을 사용합니다. 자세한 내용은 Amazon DynamoDB 설명서의 [테이블에 데이터 로드](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SampleData.LoadData.html)를 참조하세요. | 앱 개발자 | 
| S3 버킷에 새 객체가 생성되었는지 확인합니다. | 에 로그인 AWS Management Console 하고 S3 버킷을 모니터링하여 전송한 데이터로 새 객체가 생성되었는지 확인합니다. 자세한 내용은 Amazon S3 설명서의 [객체 업로드](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)를 참조하십시오. | 앱 개발자, 일반 AWS | 

### 리소스 정리
<a name="clean-up-resources"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 리소스를 정리합니다. | `cdk destroy` 명령을 실행하여 이 패턴에 사용되는 모든 리소스를 삭제합니다. | 앱 개발자, 일반 AWS | 

## 관련 리소스
<a name="deliver-dynamodb-records-to-amazon-s3-using-kinesis-data-streams-and-amazon-data-firehose-with-aws-cdk-resources"></a>
+ [s3-static-site-stack.ts](https://github.com/awslabs/aws-solutions-constructs/blob/main/source/use_cases/aws-s3-static-website/lib/s3-static-site-stack.ts#L25) (GitHub 리포지토리)
+ [aws-apigateway-dynamodb module](https://github.com/awslabs/aws-solutions-constructs/tree/main/source/patterns/%40aws-solutions-constructs/aws-apigateway-dynamodb) (GitHub 리포지토리)
+ [aws-kinesisstreams-kinesisfirehose-s3 module](https://github.com/awslabs/aws-solutions-constructs/tree/main/source/patterns/%40aws-solutions-constructs/aws-kinesisstreams-kinesisfirehose-s3) (GitHub 리포지토리)
+ [DynamoDB Streams에 대한 변경 데이터 캡처](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html) (Amazon DynamoDB 설명서)
+ [Kinesis Data Streams을 사용하여 DynamoDB에 대한 변경 사항 캡처](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/kds.html) (Amazon DynamoDB 설명서)

# Amazon API Gateway 버전 관리 구현
<a name="implement-path-based-api-versioning-by-using-custom-domains"></a>

*Corey Schnedl, Marcelo Barbosa, Mario Lopez Martinez, Anbazhagan Ponnuswamy, Gaurav Samudra, Abhilash Vinod, Amazon Web Services*

## 요약
<a name="implement-path-based-api-versioning-by-using-custom-domains-summary"></a>

이 패턴은 [사용자 지정 도메인](https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-custom-domains.html)의 [API 매핑](https://docs.aws.amazon.com/apigateway/latest/developerguide/rest-api-mappings.html) 기능을 사용하여 Amazon API Gateway용 경로 기반 API 버전 관리 솔루션을 구현하는 방법을 보여줍니다.

Amazon API Gateway는 어떤 규모에서든 API를 생성, 게시, 유지 관리, 모니터링 및 보호하기 위해 사용할 수 있는 완전관리형 서비스입니다. 서비스의 사용자 지정 도메인 기능을 사용하면 API 사용자에게 제공할 수 있는 보다 직관적인 URL을 사용하여 더 간단한 사용자 지정 도메인 이름을 생성할 수 있습니다. API 매핑을 사용하여 API 스테이지를 사용자 지정 도메인 이름에 연결할 수 있습니다. 도메인 이름을 생성하고 DNS 레코드를 구성한 후에는 API 매핑을 사용하여 사용자 지정 도메인 이름을 통해 API로 트래픽을 보냅니다.

API를 공개적으로 사용할 수 있게 되면 소비자는 API를 사용합니다. 퍼블릭 API가 발전함에 따라 서비스 계약도 새로운 기능을 반영하도록 발전합니다. 그러나 기존 기능을 변경하거나 제거하는 것은 현명하지 않습니다. 중단된 변경 사항은 소비자의 애플리케이션에 영향을 미치고 런타임에 중단될 수 있습니다. API 버전 관리는 이전 버전과의 호환성과 계약 위반을 방지하는 데 중요합니다.

소비자가 이를 채택할 수 있도록 API 버전 관리를 위한 명확한 전략이 필요합니다. 경로 기반 URL API를 사용한 버전 관리는 가장 간단하고 일반적으로 사용되는 접근 방식입니다. 이 유형의 버전 관리에서는 버전이 API URIs의 일부로 명시적으로 정의됩니다. 다음 예시 URL은 소비자가 URI를 사용하여 요청에 대한 API 버전을 지정하는 방법을 보여줍니다.

`https://api.example.com/api/v1/orders `

`https://api.example.com/api/v2/orders `

`https://api.example.com/api/vX/orders`

이 패턴은 AWS Cloud Development Kit (AWS CDK) 를 사용하여 API에 대한 확장 가능한 경로 기반 버전 관리 솔루션의 샘플 구현을 빌드, 배포 및 테스트합니다. AWS CDK 는 익숙한 프로그래밍 언어를 사용하여 클라우드 애플리케이션 리소스를 모델링하고 프로비저닝하는 오픈 소스 소프트웨어 개발 프레임워크입니다.

## 사전 조건 및 제한 사항
<a name="implement-path-based-api-versioning-by-using-custom-domains-prereqs"></a>

**사전 조건**
+ 활성. AWS 계정
+ 이 패턴의 샘플 리포지토리를 사용하고 Amazon API Gateway 사용자 지정 도메인 기능을 사용하려면 도메인 소유권이 필요합니다. Amazon Route 53를 사용하여 조직의 도메인을 생성하고 관리할 수 있습니다. Route 53에 도메인을 등록하거나 이전하는 방법에 대한 자세한 내용은 Route 53 설명서의 [새 도메인 등록](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/domain-register-update.html)을 참조하세요.
+ API에 대한 사용자 지정 도메인 이름을 설정하기 전에 에서 [SSL/TLS 인증서](https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-specify-certificate-for-custom-domain-name.html)를 준비해야 합니다.
+ DNS 공급자의 리소스 레코드를 생성하거나 업데이트하여 API 엔드포인트에 매핑해야 합니다. 이렇게 매핑하지 않으면 사용자 지정 도메인 이름이 목적지인 API 요청은 API Gateway에 도달할 수 없습니다.

**제한 사항**
+ 사용자 지정 도메인 이름은 AWS 리전 전체 내에서 고유해야 합니다 AWS 계정.
+ 여러 수준으로 API 매핑을 구성하려면 리전 사용자 지정 도메인 이름과 TLS 1.2 보안 정책을 사용해야 합니다.
+ API 매핑에서 사용자 지정 도메인 이름과 매핑된 API는 동일한 AWS 계정에 있어야 합니다.
+ API 매핑에는 문자, 숫자 및 문자 `$-_.+!*'()/`만 포함해야 합니다.
+ API 매핑에서 경로의 최대 길이는 300자입니다.
+ 각 도메인 이름에 대해 여러 수준의 API 매핑이 200개 있을 수 있습니다.
+ TLS 1.2 보안 정책을 사용하여 HTTP API를 리전별 사용자 지정 도메인 이름에만 매핑할 수 있습니다.
+ WebSocket API를 HTTP API 또는 REST API와 동일한 사용자 지정 도메인 이름에 매핑할 수 없습니다.
+ 일부 AWS 서비스 는 전혀 사용할 수 없습니다 AWS 리전. 리전별 가용성은 [리전별AWS 서비스](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)를 참조하세요. 구체적인 엔드포인트는 [서비스 엔드포인트 및 할당량](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)을 참조하고 서비스 링크를 선택합니다.

**제품 버전**
+ 이 샘플 구현은 [AWS CDK TypeScript 버전 2.149.0에서](https://docs.aws.amazon.com/cdk/v2/guide/work-with-cdk-typescript.html)를 사용합니다.

## 아키텍처
<a name="implement-path-based-api-versioning-by-using-custom-domains-architecture"></a>

다음 다이어그램은 이 아키텍처 워크플로를 보여줍니다.

![\[API 매핑 및 사용자 지정 도메인을 사용하여 경로 기반 API 버전 관리 솔루션을 구현하는 워크플로입니다.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/e1b32d2b-410f-4ace-967e-f0b8aaf0304c/images/fa9f04f1-efa6-4fb1-a541-ae3da4076b00.png)


다이어그램은 다음을 보여 줍니다.

1. API 사용자는 사용자 지정 도메인 이름을 사용하여 Amazon API Gateway에 요청을 보냅니다.

1. API Gateway는 요청의 URL에 표시된 경로를 기반으로 사용자의 요청을 API Gateway의 적절한 인스턴스 및 단계로 동적으로 라우팅합니다. 다음 표는 다양한 URL 기반 경로를 다양한 API Gateway 인스턴스의 특정 단계로 라우팅하는 방법의 예를 보여줍니다.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/implement-path-based-api-versioning-by-using-custom-domains.html)

1. 대상 API Gateway 인스턴스는 요청을 처리하고 결과를 사용자에게 반환합니다.

**자동화 및 규모 조정**

API의 각 버전에 대해 별도의 AWS CloudFormation 스택을 사용하는 것이 좋습니다. 이 접근 방식을 사용하면 사용자 지정 도메인 API 매핑 기능을 통해 라우팅할 수 있는 백엔드 API를 완전히 격리할 수 있습니다. 이 접근 방식의 장점은 다른 API를 수정할 리스크를 초래하지 않고 API의 여러 버전을 독립적으로 배포하거나 제거할 수 있다는 것입니다. 이 접근 방식은 CloudFormation 스택의 격리를 통해 복원력을 높입니다. 또한 HTTP 엔드포인트 AWS Lambda AWS Fargate및 작업과 같은 API에 대한 다양한 백엔드 옵션을 제공합니다 AWS 서비스.

[Gitflow와 같은 Git](https://docs.aws.amazon.com/prescriptive-guidance/latest/choosing-git-branch-approach/gitflow-branching-strategy.html) 분기 전략을 격리된 CloudFormation 스택과 함께 사용하여 API의 다른 버전에 배포된 소스 코드를 관리할 수 있습니다. 이 옵션을 사용하면 새 버전의 소스 코드를 복제할 필요 없이 다양한 버전의 API를 유지할 수 있습니다. Gitflow를 사용하면 릴리스가 수행될 때 git 리포지토리 내의 커밋에 태그를 추가할 수 있습니다. 따라서 특정 릴리스와 관련된 소스 코드의 전체 스냅샷이 생성됩니다. 업데이트를 수행해야 하므로 특정 릴리스의 코드를 확인하고 업데이트한 다음 해당 메이저 버전과 일치하는 CloudFormation 스택에 업데이트된 소스 코드를 배포할 수 있습니다. 이 접근 방식은 각 API 버전에 격리된 소스 코드가 있고 별도의 CloudFormation 스택에 배포되므로 다른 API 버전이 중단될 리스크를 줄입니다.

## 도구
<a name="implement-path-based-api-versioning-by-using-custom-domains-tools"></a>

**AWS 서비스**
+ [Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html)는 규모와 관계없이 REST, HTTP 및 WebSocket API를 생성, 게시, 유지 관리, 모니터링 및 보호하는 것을 지원합니다.
+ [AWS Certificate Manager (ACM)](https://docs.aws.amazon.com/acm/latest/userguide/acm-overview.html)을 사용하면 웹 AWS 사이트와 애플리케이션을 보호하는 퍼블릭 및 프라이빗 SSL/TLS X.509 인증서와 키를 생성, 저장 및 갱신할 수 있습니다.
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/home.html)는 코드로 클라우드 인프라를 정의하고 이를 프로비저닝하기 위한 오픈 소스 소프트웨어 개발 프레임워크입니다 CloudFormation. 이 패턴의 샘플 구현은 [AWS CDK TypeScript에서](https://docs.aws.amazon.com/cdk/v2/guide/work-with-cdk-typescript.html)를 사용합니다. TypeScript AWS CDK 에서를 사용하려면 Microsoft TypeScript 컴파일러(`tsc`), [Node.js](https://nodejs.org/) 및 노드 패키지 관리자()를 비롯한 친숙한 도구를 사용합니다`npm`. 원하는 경우 [Yarn](https://yarnpkg.com/)을 사용할 수 있지만 이 패턴의 예에서는 `npm`를 사용합니다.AWS Construct Library를 구성하는 모듈은 `npm ` 리포지토리인 [npmjs.org](https://docs.npmjs.com/)를 통해 배포됩니다.
+ [CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)를 사용하면 AWS 리소스를 설정하고, 빠르고 일관되게 프로비저닝하고, AWS 계정 및의 수명 주기 동안 리소스를 관리할 수 있습니다 AWS 리전.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)는 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행하는 데 도움이 되는 컴퓨팅 서비스입니다. 필요할 때만 코드를 실행하며 자동으로 확장이 가능하므로 사용한 컴퓨팅 시간만큼만 비용을 지불합니다.
+ [Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html)는 가용성과 확장성이 뛰어난 DNS 웹 서비스입니다.
+ [AWS WAF](https://docs.aws.amazon.com/waf/latest/developerguide/what-is-aws-waf.html)는 보호되는 웹 애플리케이션 리소스로 전달되는 HTTP 및 HTTPS 요청을 모니터링할 수 있게 해주는 웹 애플리케이션 방화벽입니다.

**기타 도구**
+ [Bruno](https://www.usebruno.com/)는 git 친화적인 오픈 소스 API 테스트 클라이언트입니다.
+ [cdk-nag](https://github.com/cdklabs/cdk-nag)는 규칙 팩을 사용하여 AWS CDK 애플리케이션의 모범 사례를 확인하는 오픈 소스 유틸리티입니다.

**코드 리포지토리**

이 패턴의 코드는 GitHub [path-based-versioning-with-api-gateway](https://github.com/aws-samples/path-based-versioning-with-api-gateway) 리포지토리에서 사용할 수 있습니다.

## 모범 사례
<a name="implement-path-based-api-versioning-by-using-custom-domains-best-practices"></a>
+ 강력한 지속적 통합 및 지속적 전달(CI/CD) 파이프라인을 사용하여 로 구축된 CloudFormation 스택의 테스트 및 배포를 자동화합니다 AWS CDK. 이 권장 사항과 관련된 자세한 내용은 [AWS Well-Architected DevOps 지침](https://docs.aws.amazon.com/wellarchitected/latest/devops-guidance/devops-guidance.html)을 참조하세요.
+ AWS WAF 는 Amazon API Gateway와 같은 서비스와 쉽게 통합되는 관리형 방화벽입니다. 이 버전 관리 패턴이 작동하는 데 AWS WAF 필요한 구성 요소는 아니지만 AWS WAF API Gateway에를 포함하는 보안 모범 사례로를 사용하는 것이 좋습니다.
+ API의 이전 버전을 더 이상 사용하지 않고 효율적으로 제거할 수 있도록 API 소비자가 API의 최신 버전으로 정기적으로 업그레이드하도록 장려합니다.
+ 프로덕션 설정에서이 접근 방식을 사용하기 전에 API에 대한 방화벽 및 권한 부여 전략을 구현합니다.
+ 최소 권한 액세스 모델을 AWS 계정 사용하여의 AWS 리소스 관리에 대한 액세스를 구현합니다. [https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege) 
+ 로 빌드된 애플리케이션에 모범 사례 및 보안 권장 사항을 적용하려면 [cdk-nag 유틸리티](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/check-aws-cdk-applications-or-cloudformation-templates-for-best-practices-by-using-cdk-nag-rule-packs.html)를 사용하는 AWS CDK것이 좋습니다.

## 에픽
<a name="implement-path-based-api-versioning-by-using-custom-domains-epics"></a>

### 로컬 환경 준비
<a name="prepare-your-local-environment"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 리포지토리를 복제합니다. | 샘플 애플리케이션의 리포지토리를 복제하려면 다음 명령을 실행합니다.<pre>git clone https://github.com/aws-samples/path-based-versioning-with-api-gateway</pre> | 앱 개발자 | 
| 복제된 리포지토리로 이동합니다. | 복제된 리포지토리 폴더 위치로 이동하려면 다음 명령을 입력합니다.<pre>cd api-gateway-custom-domain-versioning</pre> | 앱 개발자 | 
| 필요한 종속 항목을 설치합니다. | 필요한 종속성을 설치하려면 다음 명령을 실행합니다.<pre>npm install </pre> | 앱 개발자 | 

### CloudFormation 라우팅 스택을 배포합니다.
<a name="deploy-the-cfnshort-routing-stack"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 라우팅 스택의 배포를 시작합니다. | CloudFormation 라우팅 스택의 배포를 시작하려면 다음 명령을 `CustomDomainRouterStack`실행하여 `example.com`를 소유한 도메인의 이름으로 바꿉니다.<pre>npx cdk deploy CustomDomainRouterStack --parameters PrerequisiteDomainName=example.com</pre>스택 배포는 다음 도메인 DNS 검증 작업이 성공적으로 수행될 때까지 성공하지 못합니다. | 앱 개발자 | 

### 도메인 소유권 확인
<a name="verify-domain-ownership"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 도메인의 소유권을 확인합니다. | 인증서는 연결된 도메인의 소유권을 증명할 때까지 **검증 보류** 중 상태로 유지됩니다.소유권을 증명하려면 도메인과 연결된 호스팅 영역에 CNAME 레코드를 추가합니다. 자세한 내용은 AWS Certificate Manager 설명서의 [DNS 검증](https://docs.aws.amazon.com/acm/latest/userguide/dns-validation.html)을 참조하세요.적절한 레코드를 추가하면 `CustomDomainRouterStack` 배포가 성공할 수 있습니다. | 앱 개발자, AWS 시스템 관리자, 네트워크 관리자 | 
| API Gateway 사용자 지정 도메인을 가리키는 별칭 레코드를 생성합니다. | 인증서가 성공적으로 발급되고 검증되면 Amazon API Gateway 사용자 지정 도메인 URL을 가리키는 [DNS 레코드를 생성합니다](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-regional-api-custom-domain-create.html#apigateway-regional-api-custom-domain-dns-record).사용자 지정 도메인 URL은 사용자 지정 도메인의 프로비저닝에 의해 고유하게 생성되며 CloudFormation 출력 파라미터로 지정됩니다. 다음은 [레코드의 예](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resource-record-sets-values-basic.html)입니다.**라우팅 정책**:단순 라우팅**레코드 이름**: `demo.api-gateway-custom-domain-versioning.example.com`**별칭**]: 예**레코드 유형**: AWS 리소스를 가리키는 "A" 유형의 DNS 레코드**값**: `d-xxxxxxxxxx.execute-api.xx-xxxx-x.amazonaws.com`**TTL(초)**: 300 | 앱 개발자, AWS 시스템 관리자, 네트워크 관리자 | 

### CloudFormation 스택 배포 및 API 간접 호출
<a name="deploy-cfnshort-stacks-and-invoke-the-api"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| `ApiStackV1` 스택을 배포합니다. | `ApiStackV1` 스택을 배포하려면 다음 명령을 사용합니다.<pre>npm run deploy-v1</pre>다음 CDK 코드는 API 매핑을 추가합니다.<pre>var apiMapping = new CfnApiMapping(this, "ApiMapping", {<br />      apiId: this.lambdaRestApi.restApiId,<br />      domainName: props.customDomainName.domainName,<br />      stage: "api",<br />      apiMappingKey: "api/v1",<br />    });</pre> | 앱 개발자 | 
| `ApiStackV2` 스택을 배포합니다. | `ApiStackV2` 스택을 배포하려면 다음 명령을 사용합니다.<pre>npm run deploy-v2</pre> | 앱 개발자 | 
|  API를 호출합니다. | API를 간접적으로 호출하고 Bruno를 사용하여 API 엔드포인트를 테스트하려면 [추가 정보](#implement-path-based-api-versioning-by-using-custom-domains-additional)의 지침을 참조하세요. | 앱 개발자 | 

### 리소스 정리
<a name="clean-up-resources"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 리소스를 정리하십시오. | 이 샘플 애플리케이션과 연결된 리소스를 삭제하려면 다음 명령을 사용합니다.<pre>npx cdk destroy --all</pre>도메인 소유권 확인 프로세스를 위해 수동으로 추가된 Route 53 DNS 레코드를 모두 정리해야 합니다. | 앱 개발자 | 

## 문제 해결
<a name="implement-path-based-api-versioning-by-using-custom-domains-troubleshooting"></a>


| 문제 | Solution | 
| --- | --- | 
| 인증서를 검증할 수 없기 때문에 배포 시간이 `CustomDomainRouterStack` 초과되었습니다. | 이전 작업에서 설명한 대로 적절한 DNS 검증 CNAME 레코드를 추가했는지 확인합니다. DNS 검증 레코드를 추가한 후 새 인증서의 상태가 최대 30분 동안 계속 **검증 보류 중**으로 표시될 수 있습니다. 자세한 내용은 AWS Certificate Manager 설명서의 [DNS 검증](https://docs.aws.amazon.com/acm/latest/userguide/dns-validation.html)을 참조하세요. | 

## 관련 리소스
<a name="implement-path-based-api-versioning-by-using-custom-domains-resources"></a>
+ [Amazon CloudFront를 사용한 헤더 기반 API Gateway 버전 관리 구현](https://aws.amazon.com/blogs/compute/implementing-header-based-api-gateway-versioning-with-amazon-cloudfront/) -이 AWS 컴퓨팅 블로그 게시물은이 패턴에 설명된 경로 기반 버전 관리 전략의 대안으로 헤더 기반 버전 관리 전략을 제공합니다.
+ [AWS CDK 워크숍](https://cdkworkshop.com/20-typescript.html) -이 입문 워크숍은 AWS 를 사용하여에서 애플리케이션을 구축하고 배포하는 데 중점을 둡니다 AWS Cloud Development Kit (AWS CDK). 이 워크숍은 Go, Python 및 TypeScript를 지원합니다.

## 추가 정보
<a name="implement-path-based-api-versioning-by-using-custom-domains-additional"></a>

**Bruno로 API 테스트**

샘플 애플리케이션에 경로 기반 라우팅이 제대로 작동하는지 확인하려면 오픈 소스 API 테스트 도구인 [Bruno](https://www.usebruno.com/)를 사용하는 것이 좋습니다. 이 패턴은 샘플 API를 쉽게 테스트할 수 있는 샘플 컬렉션을 제공합니다.

API를 간접적으로 호출하고 테스트하려면 다음 명령을 사용합니다.

1. [Bruno를 설치합니다.](https://www.usebruno.com/downloads)

1. Bruno를 엽니다.

1. 이 패턴의 [코드 리포지토리](https://github.com/aws-samples/path-based-versioning-with-api-gateway)에서 **Bruno/Sample-API-Gateway-Custom-Domain-Versioning**을 선택하고 컬렉션을 엽니다.

1. 사용자 인터페이스(UI) 오른쪽 상단의 **환경** 드롭다운을 보려면 컬렉션에서 요청을 선택합니다.

1. **환경** 드롭다운에서 **구성을** 선택합니다.

1. `REPLACE_ME_WITH_YOUR_DOMAIN` 값을 사용자 지정 도메인으로 바꿉니다.

1. **저장**을 선택한 다음 **구성** 섹션을 닫습니다.

1. **샌드박스 환경에서** **활성** 옵션이 선택되어 있는지** **확인합니다.

1. 선택한 요청에 대해 **->** 버튼을 사용하여 API를 간접적으로 호출합니다.

1. V2와 비교하여 V1에서 검증(숫자가 아닌 값 전달)이 처리되는 방식에 유의하세요. V2

예시 API 호출 및 V1 및 V2 검증 비교의 스크린샷을 보려면 이 패턴의 [코드 리포지토리](https://github.com/aws-samples/path-based-versioning-with-api-gateway)에 있는 `README.md` 파일에서 **샘플 API 테스트**를 참조하세요.

# PostgreSQL 데이터베이스와 상호 작용 AWS Lambda 하기 위해 로 psycopg2 라이브러리 가져오기
<a name="import-psycopg2-library-lambda"></a>

*Louis Hourcade, Amazon Web Services*

## 요약
<a name="import-psycopg2-library-lambda-summary"></a>

[Psycopg](https://www.psycopg.org/docs/)는 Python용 PostgresSQL 데이터베이스 어댑터입니다. 개발자는 `psycopg2` 라이브러리를 사용하여 PostgreSQL 데이터베이스와 상호 작용하는 Python 애플리케이션을 작성합니다.

Amazon Web Services(AWS)에서 개발자는 [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)를 사용하여 애플리케이션 또는 백엔드 서비스에 대한 코드를 실행합니다. Lambda는 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행하는 서버리스 이벤트 기반 컴퓨팅 서비스입니다.

기본적으로 [Lambda에서 지원하는 Python 런타임](https://docs.aws.amazon.com/lambda/latest/dg/lambda-python.html)을 사용하는 새 함수를 생성하면에서 제공하는 Lambda[용 기본 이미지에서 Lambda](https://github.com/aws/aws-lambda-base-images) 런타임 환경이 생성됩니다 AWS. `pandas` 또는와 같은 라이브러리`psycopg2`는 기본 이미지에 포함되지 않습니다. 라이브러리를 사용하려면 사용자 지정 패키지에 번들링하여 Lambda에 연결해야 합니다.

라이브러리를 번들링하고 연결하는 방법은 다음과 같이 여러 가지가 있습니다.
+ [.zip 파일 아카이브](https://docs.aws.amazon.com/lambda/latest/dg/configuration-function-zip.html)에서 Lambda 함수를 배포합니다.
+ 사용자 지정 컨테이너 이미지에서 Lambda 함수를 배포합니다.
+ [Lambda 계층](https://docs.aws.amazon.com/lambda/latest/dg/chapter-layers.html#lambda-layer-versions)을 생성하여 Lambda 함수에 연결합니다.

이 패턴은 처음 두 가지 옵션을 보여줍니다.

.zip 배포 패키지를 사용하면 `pandas` 라이브러리를 Lambda 함수에 추가하는 것이 비교적 간단합니다. Linux 시스템에서 폴더를 생성하고, `pandas` 라이브러리 및 라이브러리의 종속성과 함께 Lambda 스크립트를 폴더에 추가하고, 폴더를 압축하고, Lambda 함수의 소스로 제공합니다.

.zip 배포 패키지를 사용하는 것은 일반적인 방법이지만 `psycopg2` 라이브러리에서는 이러한 접근 방식이 작동하지 않습니다. 이 패턴은 먼저 .zip 배포 패키지를 사용하여 `psycopg2` 라이브러리를 Lambda 함수에 추가하는 경우 발생하는 오류를 보여줍니다. 그런 다음이 패턴은 Dockerfile에서 Lambda를 배포하고 `psycopg2` 라이브러리가 작동하도록 Lambda 이미지를 편집하는 방법을 보여줍니다.

패턴이 배포하는 세 가지 리소스에 대한 자세한 내용은 [추가 정보](#import-psycopg2-library-lambda-additional) 섹션을 참조하세요.

## 사전 조건 및 제한 사항
<a name="import-psycopg2-library-lambda-prereqs"></a>

**사전 조건**
+ 이 패턴에서 사용하는 AWS 리소스를 배포할 수 있는 충분한 권한이 AWS 계정 있는 활성
+ AWS Cloud Development Kit (AWS CDK) 를 실행하여 전역적으로 설치됨 `npm install -g aws-cdk`
+ Git 클라이언트.
+ Python
+ Docker

**제한 사항**
+ 일부 AWS 서비스 는 전혀 사용할 수 없습니다 AWS 리전. 리전 가용성은 [리전별AWS 서비스](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/) 섹션을 참조하세요. 구체적인 엔드포인트는 [서비스 엔드포인트 및 할당량](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html) 페이지를 참조하고 서비스 링크를 선택합니다.

**제품 버전**
+ [Lambda에서 지원하는](https://docs.aws.amazon.com/lambda/latest/dg/lambda-python.html) Python 런타임 버전
+ Psycopg2 버전 2.9.3
+ Pandas 버전 1.5.2

## 아키텍처
<a name="import-psycopg2-library-lambda-architecture"></a>

**솔루션 개요**

Lambda에서 `psycopg2` 라이브러리를 사용할 때 직면할 수 있는 문제를 설명하기 위해 패턴은 두 개의 Lambda 함수를 배포합니다.
+ .zip 파일에서 생성된 Python 런타임이 있는 Lambda 함수 1개. `psycopg2` 및 `pandas` 라이브러리는 [pip](https://pypi.org/project/pip/)를 사용하여이 .zip 배포 패키지에 설치됩니다.
+ Dockerfile에서 생성된 Python 런타임이 있는 Lambda 함수 1개. Dockerfile은 Lambda 컨테이너 이미지에 `psycopg2` 및 `pandas` 라이브러리를 설치합니다.

첫 번째 Lambda 함수는 .zip 파일에 `pandas` 라이브러리와 해당 종속성을 설치하고 Lambda는 해당 라이브러리를 사용할 수 있습니다.

두 번째 Lambda 함수는 Lambda 함수에 대한 컨테이너 이미지를 빌드하여 Lambda에서 및 `psycopg2` 라이브러리를`pandas` 실행할 수 있음을 보여줍니다.

## 도구
<a name="import-psycopg2-library-lambda-tools"></a>

**AWS 서비스**
+ AWS Cloud Development Kit(AWS CDK)는 AWS 클라우드 인프라를 코드로 정의하고 프로비저닝하는 데 도움이 되는 소프트웨어 개발 프레임워크입니다.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)는 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행하는 데 도움이 되는 컴퓨팅 서비스입니다. 필요할 때만 코드를 실행하며 자동으로 확장이 가능하므로 사용한 컴퓨팅 시간만큼만 비용을 지불합니다.

**기타 도구**
+ [Docker](https://www.docker.com/)는 운영 체제 수준의 가상화를 사용하여 컨테이너에 소프트웨어를 제공하는 서비스형 플랫폼(PaaS) 제품 세트입니다.
+ [pandas](https://pandas.pydata.org/)는 데이터 분석 및 조작을 위한 Python 기반 오픈 소스 도구입니다.
+ [Psycopg](https://www.psycopg.org/docs/)는 다중 스레드 애플리케이션용으로 설계된 Python 언어용 PostgreSQL 데이터베이스 어댑터입니다. 이 패턴은 Psycopg 2를 사용합니다.
+ [Python](https://www.python.org/)은 범용 컴퓨터 프로그래밍 언어입니다.

**코드 리포지토리**

이 패턴의 코드는 GitHub의 [import-psycopg2-in-lambda-to-interact-with-postgres-database](https://github.com/aws-samples/import-psycopg2-in-lambda-to-interact-with-postgres-database) 리포지토리에서 사용할 수 있습니다.

## 모범 사례
<a name="import-psycopg2-library-lambda-best-practices"></a>

이 패턴은를 사용하여 Dockerfile에서 Lambda 함수를 AWS CDK 생성하는 작업 예제를 제공합니다. 애플리케이션에서이 코드를 재사용하는 경우 배포된 리소스가 모든 보안 요구 사항을 충족하는지 확인합니다. 인프라를 배포하기 전에 클라우드 인프라 구성을 스캔하여 잘못된 구성을 찾는 [Checkov](https://www.checkov.io/)와 같은 도구를 사용합니다.

## 에픽
<a name="import-psycopg2-library-lambda-epics"></a>

### 리포지토리 복제 및 배포 구성
<a name="clone-the-repository-and-configure-the-deployment"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 리포지토리를 복제합니다. | 다음 명령을 실행하여 GitHub 리포지토리를 복제합니다.<pre>git clone https://github.com/aws-samples/import-psycopg2-in-lambda-to-interact-with-postgres-database.git<br />cd AWS-lambda-psycopg2</pre> | 일반 AWS | 
| 배포를 구성합니다. |  AWS 계정다음에 대한 정보로 `app.py` 파일을 편집합니다.<pre>aws_acccount = "AWS_ACCOUNT_ID"<br />region = "AWS_REGION"<br /># Select the CPU architecture you are using to build the image (ARM or X86)<br />architecture = "ARM"</pre> | 일반 AWS | 

### AWS 계정 부트스트랩 및 애플리케이션 배포
<a name="bootstrap-your-aws-account-and-deploy-the-application"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 를 부트스트랩합니다 AWS 계정. | [AWS 환경을 아직 부트스트래핑](https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping.html)하지 않은 경우 AWS 계정의 AWS 자격 증명으로 다음 명령을 실행합니다.<pre>cdk bootstrap aws://<tooling-account-id>/<aws-region></pre> | 일반 AWS | 
| 모델 배포 |  AWS CDK 애플리케이션을 배포하려면 다음 명령을 실행합니다.<pre>cdk deploy AWSLambdaPyscopg2</pre> | 일반 AWS | 

### AWS Management Console에서 Lambda 함수 테스트
<a name="test-the-lambda-functions-from-the-aws-management-console"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| .zip 파일에서 생성된 Lambda 함수를 테스트합니다. | .zip 파일에서 생성된 Lambda 함수를 테스트하려면 다음을 수행합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/import-psycopg2-library-lambda.html)Lambda는 기본 이미지에서 필요한 PostgreSQL 라이브러리를 찾지 못하므로 `psycopg2` 라이브러리를 사용할 수 없습니다. | 일반 AWS | 
| Dockerfile에서 생성된 Lambda 함수를 테스트합니다. | Lambda 함수 내에서 `psycopg2` 라이브러리를 사용하려면 Lambda Amazon Machine Image(AMI)를 편집해야 합니다.Dockerfile에서 생성된 Lambda 함수를 테스트하려면 다음을 수행합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/import-psycopg2-library-lambda.html)다음 코드는 AWS CDK 템플릿이 생성하는 Dockerfile을 보여줍니다.<pre># Start from lambda Python3.13 image<br />FROM public.ecr.aws/lambda/python:3.13<br /><br /># Copy the lambda code, together with its requirements<br />COPY lambda/requirements.txt ${LAMBDA_TASK_ROOT}<br />COPY lambda/lambda_code.py ${LAMBDA_TASK_ROOT}<br /><br /># Install postgresql-devel in your image<br />RUN yum install -y gcc postgresql-devel<br /><br /># install the requirements for the Lambda code<br />RUN pip3 install -r requirements.txt --target "${LAMBDA_TASK_ROOT}"<br /><br /># Command can be overwritten by providing a different command in the template directly.<br />CMD ["lambda_code.handler"]</pre>Dockerfile은 Python 런타임을 위해 AWS 제공된 Lambda 이미지를 가져와 [PostgreSQL 관리 서버와 직접 상호 작용하는 애플리케이션을 컴파일하는 데 필요한 라이브러리가 포함된 postgresql-devel](https://yum-info.contradodigital.com/view-package/updates/postgresql-devel/)을 설치합니다. PostgreSQL Dockerfile은 `requirements.txt` 파일에 표시된 `pandas` 및 `psycopg2` 라이브러리도 설치합니다. | 일반 AWS | 

## 관련 리소스
<a name="import-psycopg2-library-lambda-resources"></a>
+ [AWS CDK 설명서](https://docs.aws.amazon.com/cdk/v2/guide/home.html)
+ [AWS Lambda 설명서](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)

## 추가 정보
<a name="import-psycopg2-library-lambda-additional"></a>

이 패턴에서 AWS CDK 템플릿은 다음 세 가지 리소스가 있는 AWS 스택을 제공합니다.
+ Lambda 변환 함수를 위한 IAM 역할
+ Python 런타임이 있는 Lambda 함수입니다. 함수는 배포 패키지에서 `Constructs/lambda/lambda_deploy.zip` 배포됩니다.
+ Python 런타임이 있는 Lambda 함수입니다. 함수는 `Constructs` 폴더 아래의 Dockerfile에서 배포됩니다.

두 Lambda 함수의 스크립트는 `pandas` 및 `psycopg2` 라이브러리를 성공적으로 가져오는지 확인합니다.

```
import pandas
print("pandas successfully imported")

import psycopg2
print("psycopg2 successfully imported")

def handler(event, context):
    """Function that checks whether psycopg2  and pandas are successfully imported or not"""
    return {"Status": "psycopg2 and pandas successfully imported"}
```

`lambda_deploy.zip` 배포 패키지는 `Constructs/lambda/build.sh` bash 스크립트로 빌드됩니다. 이 스크립트는 폴더를 생성하고, Lambda 스크립트를 복사하고, `pandas` 및 `psycopg2` 라이브러리를 설치하고, .zip 파일을 생성합니다. .zip 파일을 직접 생성하려면이 bash 스크립트를 실행하고 AWS CDK 스택을 재배포합니다.

Dockerfile은 Python 런타임이 있는 Lambda에 대해 AWS 제공된 기본 이미지로 시작합니다. Dockerfile은 기본 이미지 위에 `pandas` 및 `psycopg2` 라이브러리를 설치합니다.

# Amazon API Gateway를 Amazon SQS와 통합하여 비동기 REST API 처리
<a name="integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis"></a>

*Natalia Colantonio Favero 및 Gustavo Martim, Amazon Web Services*

## 요약
<a name="integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis-summary"></a>

REST API를 배포할 때 클라이언트 애플리케이션이 게시할 수 있는 메시지 대기열을 공개해야 하는 경우가 있습니다. 예를 들어, 서드 파티 API의 지연이나 응답 지연 문제가 있을 수 있으며, 데이터베이스 쿼리의 응답 시간 문제를 방지하기를 원하거나, 대량의 동시 API 요청이 있을 때 서버 확장을 피하고 싶은 경우가 있습니다. 이러한 시나리오에서 대기열에 게시하는 클라이언트 애플리케이션은 API가 데이터를 수신했음을 알기만 하면 됩니다. 데이터가 수신된 후에는 어떤 일이 발생하는지 알 수 없습니다.

이 패턴은 [Amazon API Gateway](https://aws.amazon.com/api-gateway/) 엔드포인트를 생성합니다. [Amazon SQS](https://aws.amazon.com/sqs/) SQS 대기열에 직접 액세스하지 못하도록 두 서비스 간에 easy-to-implement 통합을 생성합니다.

## 사전 조건 및 제한 사항
<a name="integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis-prereqs"></a>
+ [활성 AWS 계정](https://portal.aws.amazon.com/billing/signup/iam)

## 아키텍처
<a name="integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis-architecture"></a>

![\[API Gateway를 Amazon SQS와 통합하기 위한 아키텍처\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/70984dee-e49f-4446-9d52-49ce826c3909/images/737ba0b2-da8f-4478-8c54-0a4835fd69f9.png)


이 다이어그램은 다음 단계들을 보여줍니다.

1. Postman, 다른 API 또는 기타 기술과 같은 도구를 사용하여 POST REST API 엔드포인트를 요청합니다.

1. API Gateway는 요청 본문에서 수신된 메시지를 대기열에 게시합니다.

1. Amazon SQS는 메시지를 수신하고 성공 또는 실패 코드와 함께 API Gateway에 답변을 보냅니다.

## 도구
<a name="integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis-tools"></a>
+ [Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html)는 규모와 관계없이 REST, HTTP 및 WebSocket API를 생성, 게시, 유지 관리, 모니터링 및 보호하는 것을 지원합니다.
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)는 AWS 리소스에 대한 액세스를 인증하고 사용할 수 있는 권한을 부여받은 사용자를 제어하여 리소스에 대한 액세스를 안전하게 관리하는 데 도움이 됩니다.
+ [Amazon Simple Queue Service(Amazon SQS)](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html)는 분산 소프트웨어 시스템과 구성 요소를 통합하고 분리하는 데 도움이 되는 안전하고 내구성이 뛰어나며 가용성이 높은 호스팅 대기열을 제공합니다.  

## 에픽
<a name="integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis-epics"></a>

### SQS 대기열 생성
<a name="create-an-sqs-queue"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 대기열을 생성합니다. | REST API에서 메시지를 수신하는 SQS 대기열을 생성하려면[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis.html) | 앱 개발자 | 

### Amazon SQS에 대한 액세스 권한 제공
<a name="provide-access-to-sqs"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| IAM 역할을 생성합니다. | 이 IAM 역할은 API Gateway 리소스에 Amazon SQS에 대한 모든 액세스 권한을 부여합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis.html) | 앱 개발자, AWS 관리자 | 

### REST API를 생성
<a name="create-a-rest-api"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| REST API를 생성합니다. | HTTP 요청이 전송되는 REST API입니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis.html) | 앱 개발자 | 
| API Gateway를 Amazon SQS에 연결합니다. | 이 단계를 통해 메시지는 HTTP 요청 본문 내에서 Amazon SQS로 흐를 수 있습니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis.html) | 앱 개발자 | 

### REST API 테스트
<a name="test-the-rest-api"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| REST API를 테스트합니다. | 테스트를 실행하여 구성 누락 여부를 확인합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis.html) | 앱 개발자 | 
| API 통합을 변경하여 Amazon SQS에 요청을 올바르게 전달합니다. | 구성을 완료하여 통합 오류를 수정합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis.html) | 앱 개발자 | 
| Amazon SQS에서 메시지를 테스트하고 검증합니다. | 테스트를 실행하여 테스트가 성공적으로 완료되었는지 확인합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis.html) | 앱 개발자 | 
| 특수 문자로 API Gateway를 테스트합니다. | 메시지에서 허용되지 않는 특수 문자(예: &)가 포함된 테스트를 실행합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis.html)이는 메시지 본문에서 기본적으로 특수 문자가 지원되지 않기 때문입니다. 다음 단계에서는 특수 문자를 지원하도록 API Gateway를 구성합니다. 콘텐츠 유형 변환에 대한 자세한 내용은 [API Gateway 설명서를](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-payload-encodings-workflow.html) 참조하세요. | 앱 개발자 | 
| 특수 문자를 지원하도록 API 구성을 변경합니다. | 메시지에 특수 문자를 허용하도록 구성을 조정합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis.html)새 메시지에는 특수 문자가 포함되어야 합니다. | 앱 개발자 | 

### REST API 배포
<a name="deploy-the-rest-api"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| API를 배포합니다. |  REST API를 배포하려면:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis.html) | 앱 개발자 | 
| 외부 도구를 사용하여 테스트합니다. | 외부 도구를 사용하여 테스트를 실행하여 메시지가 성공적으로 수신되었는지 확인합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis.html) | 앱 개발자 | 

### 정리
<a name="clean-up"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| API를 삭제합니다. | [API Gateway 콘솔](https://console.aws.amazon.com/apigateway/)에서 생성한 API를 선택한 다음 **삭제**를 선택합니다. | 앱 개발자 | 
| IAM 역할을 삭제합니다. | [IAM 콘솔](https://console.aws.amazon.com/iam/)의 **역할** 창에서 **AWSGatewayRoleForSQS**를 선택한 다음 **삭제**를 선택합니다. | 앱 개발자 | 
| SQS 대기열을 삭제합니다. | [Amazon SQS 콘솔](https://console.aws.amazon.com/sqs/)의 **대기열** 창에서 생성한 SQS 대기열을 선택한 다음 **삭제**를 선택합니다. | 앱 개발자 | 

## 관련 리소스
<a name="integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis-resources"></a>
+ [SQS-SendMessage](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-aws-services-reference.html#SQS-SendMessage)(API Gateway 설명서)
+ [API Gateway의 콘텐츠 유형 변환](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-payload-encodings-workflow.html)(API Gateway 설명서)
+ [\$1util 변수](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html#util-template-reference)(API Gateway 설명서)
+ [API Gateway REST API를 Amazon SQS와 통합하고 일반적인 오류를 해결하려면 어떻게 해야 합니까?](https://repost.aws/knowledge-center/api-gateway-rest-api-sqs-errors)(AWS re:Post 문서)

# Amazon API Gateway 및 AWS Lambda와 비동기적으로 이벤트 처리
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda"></a>

*Andrea Meroni, Mariem Kthiri, Nadim Majed, Michael Wallner, Amazon Web Services*

## 요약
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-summary"></a>

Amazon API Gateway는 개발자가 어떤 규모에서든 API를 생성, 게시, 유지 관리, 모니터링 및 보호하기 위해 사용할 수 있는 완전 관리형 서비스입니다. API Gateway는 최대 수십만 개의 동시 API 호출 허용 및 처리에 관련된 모든 작업을 다룹니다.

API Gateway의 중요한 Service Quotas는 통합 제한 시간입니다. 제한 시간은 REST API가 오류를 반환하기 전에 백엔드 서비스가 응답을 반환해야 하는 최대 시간입니다. 동기식 워크로드에는 일반적으로 29초의 하드 제한이 허용됩니다. 그러나이 제한은 API Gateway를 비동기 워크로드와 함께 사용하려는 개발자에게 어려운 점을 나타냅니다.

이 패턴은 API Gateway 및를 사용하여 이벤트를 비동기적으로 처리하는 예제 아키텍처를 보여줍니다 AWS Lambda. 아키텍처는 최대 15분의 기간 동안 처리 작업 실행을 지원하며 기본 REST API를 인터페이스로 사용합니다.

[Projen](https://pypi.org/project/projen/)은 로컬 개발 환경을 설정하고 [AWS Cloud Development Kit (AWS CDK) Toolkit](https://docs.aws.amazon.com/cdk/v2/guide/cli.html) AWS 계정, [Docker](https://docs.docker.com/get-docker/) 및 [Node.js](https://nodejs.org/en/download/)와 함께 예제 아키텍처를 대상에 배포하는 데 사용됩니다. Projen은 [사전 커밋](https://pre-commit.com/)과 코드 품질 보증, 보안 스캔 및 단위 테스트에 사용되는 도구를 사용하여 [Python](https://www.python.org/downloads/) 가상 환경을 자동으로 설정합니다. 자세한 정보는 [의 ](#process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-tools) 섹션을 참조하세요.

## 사전 조건 및 제한 사항
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-prereqs"></a>

**사전 조건**
+ 활성 AWS 계정
+ 워크스테이션에 설치된 도구는 다음과 같습니다.
  + [AWS Cloud Development Kit (AWS CDK) 도구 키트](https://docs.aws.amazon.com/cdk/v2/guide/cli.html) 버전 2.85.0
  + [Docker](https://docs.docker.com/get-docker/) 버전 20.10.21
  + [Node.js](https://nodejs.org/en/download/) 버전 18.13.0
  + [Projen](https://pypi.org/project/projen/) 버전 0.71.111
  + [Python](https://www.python.org/downloads/) 버전 3.9.16

**제한 사항**
+ 작업의 최대 런타임은 Lambda 함수의 최대 런타임(15분)으로 제한됩니다.
+ 동시 작업 요청의 최대 수는 Lambda 함수의 예약된 동시성에 의해 제한됩니다.

## 아키텍처
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-architecture"></a>

다음 다이어그램은 작업 API와 이벤트 처리 및 오류 처리 Lambda 함수와 Amazon EventBridge 이벤트 아카이브에 저장된 이벤트의 상호 작용을 보여줍니다.

![\[AWS 클라우드 architecture showing user interaction with jobs API, Lambda functions, and EventBridge.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/e027130c-44c1-41ab-bbe9-f196a49bd9ac/images/3c437b65-48e3-477d-aeea-6ff938cc3285.png)


일반적인 워크플로에는 다음 단계가 포함됩니다.

1.  AWS Identity and Access Management (IAM)에 대해 인증하고 보안 자격 증명을 얻습니다.

1. `/jobs` 작업 API 엔드포인트에 HTTP `POST` 요청을 전송하여 요청 본문에 작업 파라미터를 지정합니다.

1. API Gateway REST API인 작업 API는 작업 식별자가 포함된 HTTP 응답을 반환합니다.

1. 작업 API는 이벤트 처리 Lambda 함수를 비동기적으로 간접 호출합니다.

1. 이벤트 처리 함수는 이벤트를 처리한 다음 작업 결과를 Amazon DynamoDB 테이블에 넣습니다.

1. 3단계의 `/jobs/{jobId}` 작업 식별자를 로 사용하여 작업 API 엔드포인트에 HTTP `GET` 요청을 보냅니다`{jobId}`.

1. 작업 API는 `jobs` DynamoDB 테이블을 쿼리하여 작업 결과를 검색합니다.

1. 작업 API는 작업 결과가 포함된 HTTP 응답을 반환합니다.

1. 이벤트 처리가 실패하면 이벤트 처리 함수는 이벤트를 오류 처리 함수로 보냅니다.

1. 오류 처리 함수는 `jobs` DynamoDB 테이블에 작업 파라미터를 넣습니다.

1. 작업 API 엔드포인트에 HTTP `GET` 요청을 전송하여 `/jobs/{jobId}` 작업 파라미터를 검색할 수 있습니다.

1. 오류 처리가 실패하면 오류 처리 함수는 이벤트를 EventBridge 이벤트 아카이브로 보냅니다.

   EventBridge를 사용하여 아카이브된 이벤트를 재생할 수 있습니다.

## 도구
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-tools"></a>

**서비스**
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html)는 코드로 AWS 클라우드 인프라를 정의하고 프로비저닝하는 데 도움이 되는 소프트웨어 개발 프레임워크입니다.
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)는 명령줄 셸의 명령을 통해 AWS 서비스와 상호 작용하는 데 도움이 되는 오픈 소스 도구입니다.
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html)는 빠르고 예측 가능하고 확장 가능한 성능을 제공하는 완전 관리형 NoSQL 데이터베이스 서비스입니다.
+ [Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html)는 애플리케이션을 다양한 소스의 실시간 데이터와 연결할 수 있는 서버리스 이벤트 버스 서비스입니다. 예를 들어 함수, API 대상을 사용하는 HTTP 호출 엔드포인트, 다른 의 이벤트 버스입니다.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)는 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행하는 데 도움이 되는 컴퓨팅 서비스입니다. 필요할 때만 코드를 실행하며 자동으로 확장이 가능하므로 사용한 컴퓨팅 시간만큼만 비용을 지불합니다.

**기타 도구**
+ [autopep8](https://github.com/hhatto/autopep8)은 Python 개선 제안(PEP) 8 스타일 가이드를 기반으로 Python 코드의 형식을 자동으로 지정합니다.
+ [Bandit](https://bandit.readthedocs.io/en/latest/)은 Python 코드를 스캔하여 일반적인 보안 문제를 찾습니다.
+ [커미티브](https://commitizen-tools.github.io/commitizen/)는 Git 커밋 검사기 및 `CHANGELOG` 생성기입니다.
+ [cfn-lint](https://github.com/aws-cloudformation/cfn-lint)는 AWS CloudFormation 린터입니다.
+ [BridgeCrew Checkov](https://github.com/bridgecrewio/checkov)는 코드형 인프라(IaC) 파일을 스캔하여 보안 또는 규정 준수 문제로 이어질 수 있는 구성 오류를 찾기 위한 정적 코드 분석 도구입니다.
+ [jq](https://stedolan.github.io/jq/download/)는 JSON을 파싱하기 위한 명령줄 도구입니다.
+ [Postman](https://www.postman.com/)은 API 플랫폼입니다.
+ [사전 커밋](https://pre-commit.com/)은 Git 후크 관리자입니다.
+ [Projen](https://github.com/projen/projen)은 프로젝트 생성기입니다.
+ [pytest](https://docs.pytest.org/en/7.2.x/index.html)는 작고 읽기 쉬운 테스트를 작성하기 위한 Python 프레임워크입니다.

**코드 리포지토리**

이 예시 아키텍처 코드는 [API Gateway 및 Lambda 리포지토리를 사용한 GitHub 비동기 이벤트 처리](https://github.com/aws-samples/asynchronous-event-processing-api-gateway-lambda-cdk)에서 확인할 수 있습니다.

## 모범 사례
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-best-practices"></a>
+ 이 예시 아키텍처에는 배포된 인프라에 대한 모니터링이 포함되지 않습니다. 사용 사례에 모니터링이 필요한 경우 [CDK Monitoring Constructs](https://constructs.dev/packages/cdk-monitoring-constructs) 또는 다른 모니터링 솔루션 추가를 평가합니다.
+ 이 예시 아키텍처는 [IAM 권한](https://docs.aws.amazon.com/apigateway/latest/developerguide/permissions.html)을 사용하여 작업 API에 대한 액세스를 제어합니다. `JobsAPIInvokeRole`를 수임할 권한이 있는 사람은 누구나 작업 API를 간접적으로 호출할 수 있습니다. 따라서 액세스 제어 메커니즘은 바이너리입니다. 사용 사례에 더 복잡한 권한 부여 모델이 필요한 경우 다른 [액세스 제어 메커니즘](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-to-api.html)을 사용하여를 평가합니다.
+ 사용자가 `/jobs` 작업 API 엔드포인트에 HTTP `POST` 요청을 보내면 입력 데이터가 두 가지 수준에서 검증됩니다.
  + Amazon API Gateway는 첫 번째 [요청 검증](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-method-request-validation.html)을 담당합니다.
  + 이벤트 처리 함수는 두 번째 요청을 수행합니다.

    사용자가 `/jobs/{jobId}` 작업 API 엔드포인트에 대한 HTTP `GET` 요청을 수행할 때는 검증이 수행되지 않습니다. 사용 사례에 추가 입력 검증과 보안 강화가 필요한 경우 [AWS WAF를 사용하여 API를 보호](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-aws-waf.html)하는 방안을 평가합니다.

## 에픽
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-epics"></a>

### 환경 설정
<a name="set-up-the-environment"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 리포지토리를 복제합니다. | 리포지토리를 복제하려면 다음 명령을 실행합니다.<pre>git clone https://github.com/aws-samples/asynchronous-event-processing-api-gateway-lambda-cdk.git</pre> | DevOps 엔지니어 | 
| 프로젝트를 설정합니다. | 디렉터리를 리포지토리 루트로 변경하고 [Projen](https://github.com/projen/projen)을 사용하여 Python 가상 환경과 모든 도구를 설정합니다.<pre>cd asynchronous-event-processing-api-gateway-api-gateway-lambda-cdk<br />npx projen</pre> | DevOps 엔지니어 | 
| 커밋 전 후크를 설치합니다. | 커밋 전 후크를 설치하려면 다음을 수행합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda.html) | DevOps 엔지니어 | 

### 예시 아키텍처 배포
<a name="deploy-the-example-architecture"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 부트스트랩 AWS CDK. |  AWS CDK 에서 부트스트랩하려면 다음 명령을 AWS 계정실행합니다.<pre>AWS_PROFILE=$YOUR_AWS_PROFILE npx projen bootstrap</pre> | DevOps | 
| 예시 아키텍처를 배포합니다. | 에 예제 아키텍처를 배포하려면 다음 명령을 AWS 계정실행합니다.<pre>AWS_PROFILE=$YOUR_AWS_PROFILE npx projen deploy</pre> | DevOps | 

### 아키텍처 테스트
<a name="test-the-architecture"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 사전 조건을 설치합니다. | 워크스테이션에 [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html), [Postman](https://www.postman.com/downloads/) 및 [jq](https://jqlang.github.io/jq/)를 설치합니다.[Postman](https://www.postman.com/downloads/)을 사용하여 이 예시 아키텍처를 테스트하는 것이 좋지만 필수는 아닙니다. 대체 API 테스트 도구를 선택하는 경우 [AWS 서명 버전 4 인증을](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html) 지원하는지 확인하고 [REST API를 내보내 검사할 수 있는 노출된 API 엔드포인트를](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-export-api.html) 참조하세요. | DevOps 엔지니어 | 
| 를 가정합니다`JobsAPIInvokeRole`. | 배포 명령에서 출력으로 `JobsAPIInvokeRole` 인쇄된를 [가정](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sts/assume-role.html)합니다.<pre>CREDENTIALS=$(AWS_PROFILE=$<YOUR_AWS_PROFILE> aws sts assume-role \<br />--no-cli-pager \<br />--role-arn $<JOBS_API_INVOKE_ROLE_ARN> \<br />--role-session-name JobsAPIInvoke)<br />export AWS_ACCESS_KEY_ID=$(cat $CREDENTIALS | jq ‘.Credentials’’.AccessKeyId’)<br />export AWS_SECRET_ACCESS_KEY=$(cat $CREDENTIALS | jq ‘.Credentials’’.SecretAccessKey’)<br />export AWS_SESSION_TOKEN==$(cat $CREDENTIALS | jq ‘.Credentials’’.SessionToken’)</pre> | DevOps | 
| Postman을 구성합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda.html) | DevOps | 
| 예시 아키텍처를 테스트합니다. | 예시 아키텍처를 테스트하려면 작업 API로 요청을 보냅니다. 자세한 내용은 [Python 설명서](https://learning.postman.com/docs/getting-started/first-steps/sending-the-first-request/#send-an-api-request)를 참조하세요. | DevOps 엔지니어 | 

## 문제 해결
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-troubleshooting"></a>


| 문제 | Solution | 
| --- | --- | 
| [Amazon CloudWatch Logs 로그 그룹](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) `/aws/apigateway/JobsAPIAccessLogs`가 이미 존재하므로 예제 아키텍처의 폐기 및 후속 재배포가 실패합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda.html) | 

## 관련 리소스
<a name="process-events-asynchronously-with-amazon-api-gateway-and-aws-lambda-resources"></a>
+ [API Gateway 매핑 템플릿 및 액세스 로깅 변수 참조](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html)
+ [백엔드 Lambda 함수의 비동기 호출 설정](https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-integration-async.html)

# Amazon API Gateway 및 Amazon DynamoDB Streams와 비동기적으로 이벤트 처리
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams"></a>

*Andrea Meroni, Mariem Kthiri, Nadim Majed, Alessandro Trisolini, Michael Wallner, Amazon Web Services*

## 요약
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-summary"></a>

Amazon API Gateway는 개발자가 어떤 규모에서든 API를 생성, 게시, 유지 관리, 모니터링 및 보호하기 위해 사용할 수 있는 완전 관리형 서비스입니다. API Gateway는 최대 수십만 개의 동시 API 호출 허용 및 처리에 관련된 모든 작업을 다룹니다.

API Gateway의 중요한 Service Quotas는 통합 제한 시간입니다. 제한 시간은 REST API가 오류를 반환하기 전에 백엔드 서비스가 응답을 반환해야 하는 최대 시간입니다. 동기식 워크로드에는 일반적으로 29초의 하드 제한이 허용됩니다. 그러나이 제한은 API Gateway를 비동기 워크로드와 함께 사용하려는 개발자에게 어려운 점을 나타냅니다.

이 패턴은 API Gateway, Amazon DynamoDB Streams 및를 사용하여 이벤트를 비동기적으로 처리하기 위한 예제 아키텍처를 보여줍니다 AWS Lambda. 아키텍처는 동일한 입력 파라미터로 병렬 처리 작업 실행을 지원하며 기본 REST API를 인터페이스로 사용합니다. 이 예에서는 Lambda를 백엔드로 사용하여 작업 기간을 15분으로 제한합니다. 대체 서비스를 사용하여 수신 이벤트(예: )를 처리하면이 제한을 피할 수 있습니다 AWS Fargate.

[Projen](https://pypi.org/project/projen/)은 로컬 개발 환경을 설정하고 [AWS Cloud Development Kit (AWS CDK) Toolkit](https://docs.aws.amazon.com/cdk/v2/guide/cli.html) AWS 계정, [Docker](https://docs.docker.com/get-docker/) 및 [Node.js](https://nodejs.org/en/download/)와 함께 예제 아키텍처를 대상에 배포하는 데 사용됩니다. Projen은 [사전 커밋](https://pre-commit.com/)과 코드 품질 보증, 보안 스캔 및 단위 테스트에 사용되는 도구를 사용하여 [Python](https://www.python.org/downloads/) 가상 환경을 자동으로 설정합니다. 자세한 정보는 [의 ](#processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-tools) 섹션을 참조하세요.

## 사전 조건 및 제한 사항
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-prereqs"></a>

**사전 조건**
+ 활성 AWS 계정
+ 워크스테이션에 설치된 도구는 다음과 같습니다.
  + [AWS Cloud Development Kit (AWS CDK) 도구 키트](https://docs.aws.amazon.com/cdk/v2/guide/cli.html) 버전 2.85.0 이상
  + [Docker](https://docs.docker.com/get-docker/) 버전 20.10.21 이상
  + Node.js 버전 18 이상
  + [Projen](https://pypi.org/project/projen/) 버전 0.71.111 이상
  + Python 버전 3.9.16 이상

**제한 사항**
+ 제한을 방지하기 위해 DynamoDB Streams에 권장되는 최대 리더 수는 2개입니다.
+ 작업의 최대 런타임은 Lambda 함수의 최대 런타임(15분)으로 제한됩니다.
+ 동시 작업 요청의 최대 수는 Lambda 함수의 예약된 동시성에 의해 제한됩니다.

## 아키텍처
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-architecture"></a>

**아키텍처**

다음 다이어그램은 작업 API와 DynamoDB Streams의 상호 작용과 이벤트 처리 및 오류 처리 Lambda 함수와 Amazon EventBridge 이벤트 아카이브에 저장된 이벤트를 보여줍니다.

![\[아키텍처 및 프로세스 다이어그램, 다이어그램 뒤에 나열된 단계.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/68a46501-16e5-48e4-99c6-fc67a8b4133a/images/29fe6982-ad81-4099-9c65-08b17c96e78f.png)


일반적인 워크플로에는 다음 단계가 포함됩니다.

1.  AWS Identity and Access Management (IAM)에 대해 인증하고 보안 자격 증명을 얻습니다.

1. `POST` 요청 본문에 `/jobs` 작업 파라미터를 지정하여 작업 API 엔드포인트에 HTTP 요청을 보냅니다.

1. 작업 API는 작업 식별자가 포함된 HTTP 응답을 반환합니다.

1. 작업 API는 `jobs_table` Amazon DynamoDB 테이블에 작업 파라미터를 저장합니다.

1. `jobs_table` DynamoDB 테이블 DynamoDB 스트림은 이벤트 처리 Lambda 함수를 간접적으로 호출합니다.

1. 이벤트 처리 Lambda 함수는 이벤트를 처리한 다음 `jobs_table` DynamoDB 테이블에 작업 결과를 넣습니다. 일관된 결과를 보장하기 위해 이벤트 처리 함수는 [낙관적 잠금](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.OptimisticLocking.html) 메커니즘을 구현합니다.

1. 3단계의 `/jobs/{jobId}` 작업 식별자를 로 사용하여 작업 API 엔드포인트에 HTTP `GET` 요청을 보냅니다`{jobId}`.

1. 작업 API는 `jobs_table` DynamoDB 테이블을 쿼리하여 작업 결과를 검색합니다.

1. 작업 API는 작업 결과가 포함된 HTTP 응답을 반환합니다.

1. 이벤트 처리가 실패하면 이벤트 처리 함수의 소스 매핑이 이벤트를 오류 처리 Amazon Simple Notification Service(Amazon SNS) 주제로 보냅니다.

1. 오류 처리 SNS 주제는 이벤트를 오류 처리 함수로 비동기적으로 푸시합니다.

1. 오류 처리 함수는 `jobs_table` DynamoDB 테이블에 작업 파라미터를 저장합니다.

   작업 API 엔드포인트에 HTTP `GET` 요청을 전송하여 `/jobs/{jobId}` 작업 파라미터를 검색할 수 있습니다.

1. 오류 처리가 실패하면 오류 처리 함수가 이벤트를 Amazon EventBridge 아카이브로 보냅니다.

   EventBridge를 사용하여 아카이브된 이벤트를 재생할 수 있습니다.

## 도구
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-tools"></a>

**서비스**
+ AWS Cloud Development Kit(AWS CDK)는 AWS 클라우드 인프라를 코드로 정의하고 프로비저닝하는 데 도움이 되는 소프트웨어 개발 프레임워크입니다.
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html)는 빠르고 예측 가능하고 확장 가능한 성능을 제공하는 완전 관리형 NoSQL 데이터베이스 서비스입니다.
+ [Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html)는 애플리케이션을 다양한 소스의 실시간 데이터와 연결할 수 있는 서버리스 이벤트 버스 서비스입니다. AWS Lambda 함수, API 대상을 사용하는 HTTP 간접 호출 엔드포인트 또는 다른 AWS 계정의 이벤트 버스를 예로 들 수 있습니다.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)는 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행하는 데 도움이 되는 컴퓨팅 서비스입니다. 필요할 때만 코드를 실행하며 자동으로 확장이 가능하므로 사용한 컴퓨팅 시간만큼만 비용을 지불합니다.
+ [Amazon Simple Notification Service(Amazon SNS)](https://docs.aws.amazon.com/sns/latest/dg/welcome.html)를 사용하면 웹 서버 및 이메일 주소를 포함하여 게시자와 클라이언트 간의 메시지 교환을 조정하고 관리할 수 있습니다.

**기타 도구**
+ [autopep8](https://github.com/hhatto/autopep8)은 Python 개선 제안(PEP) 8 스타일 가이드를 기반으로 Python 코드의 형식을 자동으로 지정합니다.
+ [Bandit](https://bandit.readthedocs.io/en/latest/)은 Python 코드를 스캔하여 일반적인 보안 문제를 찾습니다.
+ [커미티브](https://commitizen-tools.github.io/commitizen/)는 Git 커밋 검사기 및 `CHANGELOG` 생성기입니다.
+ [cfn-lint](https://github.com/aws-cloudformation/cfn-lint)는 AWS CloudFormation 린터입니다.
+ [BridgeCrew Checkov](https://github.com/bridgecrewio/checkov)는 코드형 인프라(IaC) 파일을 스캔하여 보안 또는 규정 준수 문제로 이어질 수 있는 구성 오류를 찾기 위한 정적 코드 분석 도구입니다.
+ [jq](https://stedolan.github.io/jq/download/)는 JSON을 파싱하기 위한 명령줄 도구입니다.
+ [Postman](https://www.postman.com/)은 API 플랫폼입니다.
+ [사전 커밋](https://pre-commit.com/)은 Git 후크 관리자입니다.
+ [Projen](https://github.com/projen/projen)은 프로젝트 생성기입니다.
+ [pytest](https://docs.pytest.org/en/7.2.x/index.html)는 작고 읽기 쉬운 테스트를 작성하기 위한 Python 프레임워크입니다.

**코드 리포지토리**

이 예시 아키텍처 코드는 [API Gateway 및 DynamoDB Streams를 사용한 GitHub 비동기 처리](https://github.com/aws-samples/asynchronous-event-processing-api-gateway-dynamodb-streams-cdk) 리포지토리에서 찾을 수 있습니다.

## 모범 사례
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-best-practices"></a>
+ 이 예시 아키텍처에는 배포된 인프라에 대한 모니터링이 포함되지 않습니다. 사용 사례에 모니터링이 필요한 경우 [CDK Monitoring Constructs](https://constructs.dev/packages/cdk-monitoring-constructs) 또는 다른 모니터링 솔루션 추가를 평가합니다.
+ 이 예시 아키텍처는 [IAM 권한](https://docs.aws.amazon.com/apigateway/latest/developerguide/permissions.html)을 사용하여 작업 API에 대한 액세스를 제어합니다. `JobsAPIInvokeRole`를 수임할 권한이 있는 사람은 누구나 작업 API를 간접적으로 호출할 수 있습니다. 따라서 액세스 제어 메커니즘은 바이너리입니다. 사용 사례에 더 복잡한 권한 부여 모델이 필요한 경우 다른 [액세스 제어 메커니즘](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-to-api.html)을 사용하여를 평가합니다.
+ 사용자가 `/jobs` 작업 API 엔드포인트에 HTTP `POST` 요청을 보내면 입력 데이터는 두 가지 수준에서 검증됩니다.
  + API Gateway는 첫 번째 [요청 검증](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-method-request-validation.html)을 담당합니다.
  + 이벤트 처리 함수는 두 번째 요청을 수행합니다.

    사용자가 `/jobs/{jobId}` 작업 API 엔드포인트에 대한 HTTP `GET` 요청을 수행할 때는 검증이 수행되지 않습니다. 사용 사례에 추가 입력 검증과 보안 강화가 필요한 경우를 [사용하여 API를 보호 AWS WAF 하십시오](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-aws-waf.html).
+ 제한을 방지하기 위해 [DynamoDB Streams 설명서](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html#Streams.Processing)는 사용자가 동일한 스트림의 샤드에서 두 명 이상의 소비자와 함께 읽지 않도록 합니다. 소비자 수를 확장하려면 [Amazon Kinesis Data Streams](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/kds.html)를 사용하는 것이 좋습니다.
+ 이 예에서는 `jobs_table` DynamoDB 테이블의 항목을 일관되게 업데이트하기 위해 [낙관적 잠금](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.OptimisticLocking.html)이 사용되었습니다. 사용 사례 요구 사항에 따라 비관적 잠금과 같은 보다 안정적인 잠금 메커니즘을 구현해야 할 수 있습니다.

## 에픽
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-epics"></a>

### 환경 설정
<a name="set-up-the-environment"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 리포지토리를 복제합니다. | 리포지토리를 복제하려면 다음 명령을 실행합니다.<pre>git clone https://github.com/aws-samples/asynchronous-event-processing-api-gateway-dynamodb-streams-cdk.git</pre> | DevOps 엔지니어 | 
| 프로젝트를 설정합니다. | 디렉터리를 리포지토리 루트로 변경하고 [Projen](https://github.com/projen/projen)을 사용하여 Python 가상 환경과 모든 도구를 설정합니다.<pre>cd asynchronous-event-processing-api-gateway-api-gateway-dynamodb-streams-cdk<br />npx projen</pre> | DevOps 엔지니어 | 
| 커밋 전 후크를 설치합니다. | 커밋 전 후크를 설치하려면 다음을 수행합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams.html) | DevOps 엔지니어 | 

### 예시 아키텍처 배포
<a name="deploy-the-example-architecture"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 부트스트랩 AWS CDK. | [AWS CDK](https://aws.amazon.com/cdk/)에서 부트스트랩하려면 다음 명령을 AWS 계정실행합니다.<pre>AWS_PROFILE=$YOUR_AWS_PROFILE npx projen bootstrap</pre> | DevOps | 
| 예시 아키텍처를 배포합니다. | 에 예제 아키텍처를 배포하려면 다음 명령을 AWS 계정실행합니다.<pre>AWS_PROFILE=$YOUR_AWS_PROFILE npx projen deploy</pre> | DevOps | 

### 아키텍처 테스트
<a name="test-the-architecture"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 사전 조건을 설치합니다. | 워크스테이션에 [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html), [Postman](https://www.postman.com/downloads/) 및 [jq](https://jqlang.github.io/jq/)를 설치합니다.[Postman](https://www.postman.com/downloads/)을 사용하여 이 예시 아키텍처를 테스트하는 것이 좋지만 필수는 아닙니다. 대체 API 테스트 도구를 선택하는 경우 [AWS 서명 버전 4 인증을](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html) 지원하는지 확인하고 [REST API를 내보내 검사할 수 있는 노출된 API 엔드포인트를](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-export-api.html) 참조하세요. | DevOps 엔지니어 | 
| 를 가정합니다`JobsAPIInvokeRole`. | `deploy` 명령에서 출력으로 `JobsAPIInvokeRole` 인쇄된 [를 가정](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sts/assume-role.html)합니다.<pre>CREDENTIALS=$(AWS_PROFILE=$<YOUR_AWS_PROFILE> aws sts assume-role \<br />--no-cli-pager \<br />--role-arn $<JOBS_API_INVOKE_ROLE_ARN> \<br />--role-session-name JobsAPIInvoke)<br />export AWS_ACCESS_KEY_ID=$(cat $CREDENTIALS | jq ‘.Credentials’’.AccessKeyId’)<br />export AWS_SECRET_ACCESS_KEY=$(cat $CREDENTIALS | jq ‘.Credentials’’.SecretAccessKey’)<br />export AWS_SESSION_TOKEN==$(cat $CREDENTIALS | jq ‘.Credentials’’.SessionToken’)</pre> | DevOps | 
| Postman을 구성합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams.html) | DevOps | 
| 예시 아키텍처를 테스트합니다. | 예시 아키텍처를 테스트하려면 작업 API로 요청을 보냅니다. 자세한 내용은 [Python 설명서](https://learning.postman.com/docs/getting-started/first-steps/sending-the-first-request/#send-an-api-request)를 참조하세요. | DevOps 엔지니어 | 

## 문제 해결
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-troubleshooting"></a>


| 문제 | Solution | 
| --- | --- | 
| [Amazon CloudWatch Logs 로그 그룹](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) `/aws/apigateway/JobsAPIAccessLogs`가 이미 존재하므로 예제 아키텍처의 폐기 및 후속 재배포가 실패합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams.html) | 

## 관련 리소스
<a name="processing-events-asynchronously-with-amazon-api-gateway-and-amazon-dynamodb-streams-resources"></a>
+ [API Gateway 매핑 템플릿 및 액세스 로깅 변수 참조](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html)
+ [DynamoDB Streams의 데이터 캡처 변경](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html)
+ [버전 번호를 사용한 낙관적 잠금](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.OptimisticLocking.html)
+ [Kinesis Data Streams를 사용하여 DynamoDB 변경 사항 캡처](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/kds.html)

# Amazon API Gateway, Amazon SQS 및 AWS Fargate와 비동기적으로 이벤트 처리
<a name="process-events-asynchronously-with-amazon-api-gateway-amazon-sqs-and-aws-fargate"></a>

*Andrea Meroni, Mariem Kthiri, Nadim Majed, Alessandro Trisolini, Michael Wallner, Amazon Web Services*

## 요약
<a name="process-events-asynchronously-with-amazon-api-gateway-amazon-sqs-and-aws-fargate-summary"></a>

Amazon API Gateway는 개발자가 어떤 규모에서든 API를 생성, 게시, 유지 관리, 모니터링 및 보호하기 위해 사용할 수 있는 완전 관리형 서비스입니다. API Gateway는 최대 수십만 개의 동시 API 호출 허용 및 처리에 관련된 모든 작업을 다룹니다.

API Gateway의 중요한 Service Quotas는 통합 제한 시간입니다. 제한 시간은 REST API가 오류를 반환하기 전에 백엔드 서비스가 응답을 반환해야 하는 최대 시간입니다. 동기식 워크로드에는 일반적으로 29초의 하드 제한이 허용됩니다. 그러나이 제한은 API Gateway를 비동기 워크로드와 함께 사용하려는 개발자에게 어려운 점을 나타냅니다.

이 패턴은 API Gateway, Amazon Simple Queue Service(Amazon SQS) 및를 사용하여 이벤트를 비동기적으로 처리하는 예제 아키텍처를 보여줍니다 AWS Fargate. 아키텍처는 기간 제한 없이 처리 작업 실행을 지원하며 기본 REST API를 인터페이스로 사용합니다.

[Projen](https://pypi.org/project/projen/)은 로컬 개발 환경을 설정하고 AWS 계정, [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/cli.html) [Docker](https://docs.docker.com/get-docker/) 및 [Node.js](https://nodejs.org/en/download/)와 함께 예제 아키텍처를 대상에 배포하는 데 사용됩니다. Projen은 [사전 커밋](https://pre-commit.com/)과 코드 품질 보증, 보안 스캔 및 단위 테스트에 사용되는 도구를 사용하여 [Python](https://www.python.org/downloads/) 가상 환경을 자동으로 설정합니다. 자세한 정보는 [의 ](#process-events-asynchronously-with-amazon-api-gateway-amazon-sqs-and-aws-fargate-tools) 섹션을 참조하세요.

## 사전 조건 및 제한 사항
<a name="process-events-asynchronously-with-amazon-api-gateway-amazon-sqs-and-aws-fargate-prereqs"></a>

**사전 조건 **
+ 활성 AWS 계정
+ 워크스테이션에 설치된 도구는 다음과 같습니다.
  + [AWS Cloud Development Kit (AWS CDK) 도구 키트](https://docs.aws.amazon.com/cdk/v2/guide/cli.html) 버전 2.85.0 이상
  + [Docker](https://docs.docker.com/get-docker/) 버전 20.10.21 이상
  + Node.js 버전 18 이상
  + [Projen](https://pypi.org/project/projen/) 버전 0.71.111 이상
  + Python 버전 3.9.16 이상

**제한 사항 **
+ 동시 작업은 분당 500개의 작업으로 제한되며, 이는 Fargate가 프로비저닝할 수 있는 최대 작업 수입니다.

## 아키텍처
<a name="process-events-asynchronously-with-amazon-api-gateway-amazon-sqs-and-aws-fargate-architecture"></a>

다음 다이어그램은 작업 API와 `jobs` Amazon DynamoDB 테이블, 이벤트 처리 Fargate 서비스 및 오류 처리 AWS Lambda 함수의 상호 작용을 보여줍니다. 이벤트는 Amazon EventBridge 이벤트 아카이브에 저장됩니다.

![\[다이어그램 다음에 설명이 있는 아키텍처 다이어그램입니다.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/8a03149c-8f34-4593-84d5-accc1800a0a2/images/5e1071aa-4fbc-495c-bc22-8e62a32a136b.png)


일반적인 워크플로에는 다음 단계가 포함됩니다.

1.  AWS Identity and Access Management (IAM)에 대해 인증하고 보안 자격 증명을 얻습니다.

1. `/jobs` 작업 API 엔드포인트에 HTTP `POST` 요청을 전송하여 요청 본문에 작업 파라미터를 지정합니다.

1. API Gateway REST API인 작업 API는 작업 식별자가 포함된 HTTP 응답을 반환합니다.

1. 작업 API는 SQS 대기열에 메시지를 보냅니다.

1. Fargate는 SQS 대기열에서 메시지를 가져와 이벤트를 처리한 다음 `jobs` DynamoDB 테이블에 작업 결과를 넣습니다.

1. 3단계의 `/jobs/{jobId}` 작업 식별자를 로 사용하여 작업 API 엔드포인트에 HTTP `GET` 요청을 보냅니다`{jobId}`.

1. 작업 API는 `jobs` DynamoDB 테이블을 쿼리하여 작업 결과를 검색합니다.

1. 작업 API는 작업 결과가 포함된 HTTP 응답을 반환합니다.

1. 이벤트 처리가 실패하면 SQS 대기열은 이벤트를 DLQ(Dead Letter Queue)로 보냅니다.

1. EventBridge 이벤트는 오류 처리 함수를 시작합니다.

1. 오류 처리 함수는 `jobs` DynamoDB 테이블에 작업 파라미터를 넣습니다.

1. 작업 API 엔드포인트에 HTTP `GET` 요청을 전송하여 `/jobs/{jobId}` 작업 파라미터를 검색할 수 있습니다.

1. 오류 처리가 실패하면 오류 처리 함수는 이벤트를 EventBridge 아카이브로 보냅니다.

   EventBridge를 사용하여 아카이브된 이벤트를 재생할 수 있습니다.

## 도구
<a name="process-events-asynchronously-with-amazon-api-gateway-amazon-sqs-and-aws-fargate-tools"></a>

**서비스**
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/home.html)는 코드로 AWS 클라우드 인프라를 정의하고 프로비저닝하는 데 도움이 되는 소프트웨어 개발 프레임워크입니다.
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html)는 빠르고 예측 가능하고 확장 가능한 성능을 제공하는 완전 관리형 NoSQL 데이터베이스 서비스입니다.
+ AWS Fargate를 사용하면 서버 또는 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스를 관리할 필요 없이 컨테이너를 실행할 수 있습니다. Amazon Elastic Container Service(Amazon ECS)와 함께 사용합니다.
+ [Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html)는 애플리케이션을 다양한 소스의 실시간 데이터와 연결할 수 있는 서버리스 이벤트 버스 서비스입니다. 예를 들어 함수, API 대상을 사용하는 HTTP 호출 엔드포인트, 다른 의 이벤트 버스입니다.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)는 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행하는 데 도움이 되는 컴퓨팅 서비스입니다. 필요할 때만 코드를 실행하며 자동으로 확장이 가능하므로 사용한 컴퓨팅 시간만큼만 비용을 지불합니다.
+ [Amazon Simple Queue Service(Amazon SQS)](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html)는 내구력 있고 가용성이 뛰어난 보안 호스팅 대기열을 제공하며 이를 통해 분산 소프트웨어 시스템과 구성 요소를 통합 및 분리할 수 있습니다.

**기타 도구**
+ [autopep8](https://github.com/hhatto/autopep8)은 Python 개선 제안(PEP) 8 스타일 가이드를 기반으로 Python 코드의 형식을 자동으로 지정합니다.
+ [Bandit](https://bandit.readthedocs.io/en/latest/)은 Python 코드를 스캔하여 일반적인 보안 문제를 찾습니다.
+ [커미티브](https://commitizen-tools.github.io/commitizen/)는 Git 커밋 검사기 및 `CHANGELOG` 생성기입니다.
+ [cfn-lint](https://github.com/aws-cloudformation/cfn-lint)는 AWS CloudFormation 린터입니다.
+ [BridgeCrew Checkov](https://github.com/bridgecrewio/checkov)는 코드형 인프라(IaC) 파일을 스캔하여 보안 또는 규정 준수 문제로 이어질 수 있는 구성 오류를 찾기 위한 정적 코드 분석 도구입니다.
+ [jq](https://stedolan.github.io/jq/download/)는 JSON을 파싱하기 위한 명령줄 도구입니다.
+ [Postman](https://www.postman.com/)은 API 플랫폼입니다.
+ [사전 커밋](https://pre-commit.com/)은 Git 후크 관리자입니다.
+ [Projen](https://github.com/projen/projen)은 프로젝트 생성기입니다.
+ [pytest](https://docs.pytest.org/en/7.2.x/index.html)는 작고 읽기 쉬운 테스트를 작성하기 위한 Python 프레임워크입니다.

**코드 리포지토리**

이 예시 아키텍처 코드는 API Gateway 및 SQS 리포지토리를 사용한 GitHub 비동기 처리에서 찾을 수 있습니다. 

## 모범 사례
<a name="process-events-asynchronously-with-amazon-api-gateway-amazon-sqs-and-aws-fargate-best-practices"></a>
+ 이 예시 아키텍처에는 배포된 인프라에 대한 모니터링이 포함되지 않습니다. 사용 사례에 모니터링이 필요한 경우 [CDK Monitoring Constructs](https://constructs.dev/packages/cdk-monitoring-constructs) 또는 다른 모니터링 솔루션 추가를 평가합니다.
+ 이 예시 아키텍처는 [IAM 권한](https://docs.aws.amazon.com/apigateway/latest/developerguide/permissions.html)을 사용하여 작업 API에 대한 액세스를 제어합니다. `JobsAPIInvokeRole`를 수임할 권한이 있는 사람은 누구나 작업 API를 간접적으로 호출할 수 있습니다. 따라서 액세스 제어 메커니즘은 바이너리입니다. 사용 사례에 더 복잡한 권한 부여 모델이 필요한 경우 다른 [액세스 제어 메커니즘](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-to-api.html)을 사용하여를 평가합니다.
+ 사용자가 `/jobs` 작업 API 엔드포인트에 HTTP `POST` 요청을 보내면 입력 데이터는 두 가지 수준에서 검증됩니다.
  + API Gateway는 첫 번째 [요청 검증](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-method-request-validation.html)을 담당합니다.
  + 이벤트 처리 함수는 두 번째 요청을 수행합니다.

    사용자가 `/jobs/{jobId}` 작업 API 엔드포인트에 대한 HTTP `GET` 요청을 수행할 때는 검증이 수행되지 않습니다. 사용 사례에 추가 입력 검증과 보안 강화가 필요한 경우를 [사용하여 API를 보호 AWS WAF 하십시오](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-aws-waf.html).

## 에픽
<a name="process-events-asynchronously-with-amazon-api-gateway-amazon-sqs-and-aws-fargate-epics"></a>

### 환경 설정
<a name="set-up-the-environment"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 리포지토리를 복제합니다. | 리포지토리를 복제하려면 다음 명령을 실행합니다.<pre>git clone https://github.com/aws-samples/asynchronous-event-processing-api-gateway-sqs-cdk.git</pre> | DevOps 엔지니어 | 
| 프로젝트를 설정합니다. | 디렉터리를 리포지토리 루트로 변경하고 [Projen](https://github.com/projen/projen)을 사용하여 Python 가상 환경과 모든 도구를 설정합니다.<pre>cd asynchronous-event-processing-api-gateway-api-gateway-sqs-cdk<br />npx projen</pre> | DevOps 엔지니어 | 
| 커밋 전 후크를 설치합니다. | 커밋 전 후크를 설치하려면 다음을 수행합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/process-events-asynchronously-with-amazon-api-gateway-amazon-sqs-and-aws-fargate.html) | DevOps 엔지니어 | 

### 예시 아키텍처 배포
<a name="deploy-the-example-architecture"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 부트스트랩 AWS CDK. | [AWS CDK](https://aws.amazon.com/cdk/)에서 부트스트랩하려면 다음 명령을 AWS 계정실행합니다.<pre>AWS_PROFILE=$YOUR_AWS_PROFILE npx projen bootstrap</pre> | DevOps | 
| 예시 아키텍처를 배포합니다. | 에 예제 아키텍처를 배포하려면 다음 명령을 AWS 계정실행합니다.<pre>AWS_PROFILE=$YOUR_AWS_PROFILE npx projen deploy</pre> | DevOps | 

### 아키텍처 테스트
<a name="test-the-architecture"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 사전 조건을 설치합니다. | 워크스테이션에 [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html), [Postman](https://www.postman.com/downloads/) 및 [jq](https://jqlang.github.io/jq/)를 설치합니다.[Postman](https://www.postman.com/downloads/)을 사용하여 이 예시 아키텍처를 테스트하는 것이 좋지만 필수는 아닙니다. 대체 API 테스트 도구를 선택하는 경우 [AWS 서명 버전 4 인증을](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html) 지원하는지 확인하고 [REST API를 내보내 검사할 수 있는 노출된 API 엔드포인트를](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-export-api.html) 참조하세요. | DevOps 엔지니어 | 
| 를 가정합니다`JobsAPIInvokeRole`. | `deploy` 명령에서 출력으로 `JobsAPIInvokeRole` 인쇄된 [를 가정](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sts/assume-role.html)합니다.<pre>CREDENTIALS=$(AWS_PROFILE=$<YOUR_AWS_PROFILE> aws sts assume-role \<br />--no-cli-pager \<br />--role-arn $<JOBS_API_INVOKE_ROLE_ARN> \<br />--role-session-name JobsAPIInvoke)<br />export AWS_ACCESS_KEY_ID=$(cat $CREDENTIALS | jq ‘.Credentials’’.AccessKeyId’)<br />export AWS_SECRET_ACCESS_KEY=$(cat $CREDENTIALS | jq ‘.Credentials’’.SecretAccessKey’)<br />export AWS_SESSION_TOKEN==$(cat $CREDENTIALS | jq ‘.Credentials’’.SessionToken’)</pre> | DevOps | 
| Postman을 구성합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/process-events-asynchronously-with-amazon-api-gateway-amazon-sqs-and-aws-fargate.html) | DevOps | 
| 예시 아키텍처를 테스트합니다. | 예시 아키텍처를 테스트하려면 작업 API로 요청을 보냅니다. 자세한 내용은 [Python 설명서](https://learning.postman.com/docs/getting-started/first-steps/sending-the-first-request/#send-an-api-request)를 참조하세요. | DevOps 엔지니어 | 

## 문제 해결
<a name="process-events-asynchronously-with-amazon-api-gateway-amazon-sqs-and-aws-fargate-troubleshooting"></a>


| 문제 | Solution | 
| --- | --- | 
| [Amazon CloudWatch Logs 로그 그룹](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) `/aws/apigateway/JobsAPIAccessLogs`가 이미 존재하므로 예제 아키텍처의 폐기 및 후속 재배포가 실패합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/process-events-asynchronously-with-amazon-api-gateway-amazon-sqs-and-aws-fargate.html) | 
| [CloudWatch Logs 로그 그룹](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) `/aws/ecs/EventProcessingServiceLogs`가 이미 존재하므로 예제 아키텍처의 폐기 및 후속 재배포가 실패합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/process-events-asynchronously-with-amazon-api-gateway-amazon-sqs-and-aws-fargate.html) | 

## 관련 리소스
<a name="process-events-asynchronously-with-amazon-api-gateway-amazon-sqs-and-aws-fargate-resources"></a>
+ [API Gateway 매핑 템플릿 및 액세스 로깅 변수 참조](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html)
+ [API Gateway REST API를 Amazon SQS하고 일반적인 오류를 해결하려면 어떻게 해야 하나요?](https://aws.amazon.com/premiumsupport/knowledge-center/api-gateway-rest-api-sqs-errors/)

# AWS Step Functions에서 AWS Systems Manager Automation 작업을 동기적으로 실행
<a name="run-aws-systems-manager-automation-tasks-synchronously-from-aws-step-functions"></a>

*Elie El khoury, Amazon Web Services*

## 요약
<a name="run-aws-systems-manager-automation-tasks-synchronously-from-aws-step-functions-summary"></a>

이 패턴은 AWS Step Functions 와를 통합하는 방법을 설명합니다 AWS Systems Manager. AWS SDK 서비스 통합을 사용하여 상태 시스템 워크플로의 작업 토큰으로 Systems Manager **startAutomationExecution** API를 호출하고 토큰이 성공 또는 실패 호출로 반환될 때까지 일시 중지합니다. 통합을 시연하기 위해 이 패턴은 `AWS-RunShellScript` 문서 주변에 자동화 문서(런북) 래퍼를 구현하고 `AWS-RunPowerShellScript`을 사용하여 를 동기적으로 직접 호출합니다. Step Functions의 AWS SDK 서비스 통합에 대한 자세한 내용은 [AWS Step Functions 개발자 안내서](https://docs.aws.amazon.com/step-functions/latest/dg/supported-services-awssdk.html)를 참조하세요.

Step Functions****는 분산 애플리케이션을 구축하고, IT 및 비즈니스 프로세스를 자동화하고, 서비스를 사용하여 데이터 및 기계 학습 파이프라인을 구축하는 데 사용할 수 있는 로우코드 시각적 워크플로 AWS 서비스입니다. 워크플로는 장애, 재시도, 병렬화, 서비스 통합 및 관찰성을 관리하므로 더 중요한 비즈니스 로직에 집중할 수 있습니다.

의 기능인 Automation은 Amazon Elastic Compute Cloud(Amazon EC2), Amazon Relational Database Service(Amazon RDS), Amazon Redshift 및 Amazon Simple Storage Service(Amazon S3) AWS 서비스 와 같은에 대한 일반적인 유지 관리, 배포 및 문제 해결 작업을 AWS Systems Manager간소화합니다. Automation을 사용하면 자동화의 동시성을 세부적으로 제어할 수 있습니다. 예를 들어 동시에 대상으로 지정할 리소스 수와 자동화가 중지되기 전에 발생할 수 있는 오류 수를 지정할 수 있습니다.

런북 단계, 파라미터 및 예제를 포함한 구현 세부 정보는 [추가 정보](#run-aws-systems-manager-automation-tasks-synchronously-from-aws-step-functions-additional) 섹션을 참조하십시오.

## 사전 조건 및 제한 사항
<a name="run-aws-systems-manager-automation-tasks-synchronously-from-aws-step-functions-prereqs"></a>

**사전 조건 **
+ 활성 AWS 계정
+ AWS Identity and Access Management Step Functions 및 Systems Manager에 액세스할 수 있는 (IAM) 권한
+ 인스턴스에 AWS Systems Manager Agent(SSM Agent)가 [설치](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-install-ssm-agent.html)된 EC2 인스턴스
+ 런북을 실행하려는 인스턴스에 연결된 [Systems Manager용 IAM 인스턴스 프로파일](https://docs.aws.amazon.com/systems-manager/latest/userguide/setup-instance-profile.html)
+ 다음과 같은 IAM 권한을 가진 Step Functions 역할(최소 권한 원칙 준수).

```
{
             "Effect": "Allow",
             "Action": "ssm:StartAutomationExecution",
             "Resource": "*"
 }
```

**제품 버전**
+ SSM 문서 스키마 버전 0.3 이상
+ SSM Agent 버전 2.3.672.0 이상

## 아키텍처
<a name="run-aws-systems-manager-automation-tasks-synchronously-from-aws-step-functions-architecture"></a>

**대상 기술 스택  **
+ AWS Step Functions
+ AWS Systems Manager 자동화

**대상 아키텍처 **

![\[Step Functions에서 Systems Manager 자동화 작업을 동기적으로 실행하기 위한 아키텍처\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/47c19e4f-d68d-4f91-bb68-202098757529/images/2d248aae-d858-4565-8af2-593cde0da780.png)


**자동화 및 규모 조정**
+ 이 패턴은 여러 인스턴스에 실행서를 배포하는 데 사용할 수 있는 AWS CloudFormation 템플릿을 제공합니다. (GitHub [Step Functions 및 Systems Manager 구현](https://github.com/aws-samples/amazon-stepfunctions-ssm-waitfortasktoken) 리포지토리를 참조하십시오.)

## 도구
<a name="run-aws-systems-manager-automation-tasks-synchronously-from-aws-step-functions-tools"></a>

**AWS 서비스**
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)를 사용하면 AWS 리소스를 설정하고, 빠르고 일관되게 프로비저닝하고, AWS 계정 및 리전의 수명 주기 동안 리소스를 관리할 수 있습니다.
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)는 AWS 리소스에 대한 액세스를 인증하고 사용할 수 있는 권한을 부여받은 사용자를 제어하여 리소스에 대한 액세스를 안전하게 관리하는 데 도움이 됩니다.
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html)는 AWS Lambda 함수 및 기타를 결합하여 비즈니스 크리티컬 애플리케이션을 구축하는 AWS 서비스 데 도움이 되는 서버리스 오케스트레이션 서비스입니다.
+ [AWS Systems Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/what-is-systems-manager.html)은 AWS 클라우드에서 실행되는 애플리케이션 및 인프라를 관리하는 데 도움을 줍니다. 애플리케이션 및 리소스 관리를 간소화하고, 운영 문제를 감지 및 해결하는 시간을 단축하며, AWS 리소스를 대규모로 안전하게 관리하는 데 도움이 됩니다.

**코드 **

이 패턴의 코드는 GitHub [Step Functions 및 Systems Manager 구현](https://github.com/aws-samples/amazon-stepfunctions-ssm-waitfortasktoken) 리포지토리에서 사용할 수 있습니다. 

## 에픽
<a name="run-aws-systems-manager-automation-tasks-synchronously-from-aws-step-functions-epics"></a>

### 런북 생성
<a name="create-runbooks"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| CloudFormation 템플릿 파일을 다운로드하십시오. | GitHub 리포지토리의 `cloudformation ` 폴더에서 `ssm-automation-documents.cfn.json` 템플릿을 다운로드합니다. | AWS DevOps | 
| 런북을 생성하십시오. | 에 로그인하고 [CloudFormation 콘솔](https://console.aws.amazon.com/cloudformation/)을 AWS Management Console연 다음 템플릿을 배포합니다. CloudFormation 템플릿 배포에 대한 자세한 내용은 CloudFormation 설명서의 [CloudFormation 콘솔에서 스택 생성을](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-create-stack.html) 참조하세요. CloudFormation 템플릿은 세 가지 리소스를 배포합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/run-aws-systems-manager-automation-tasks-synchronously-from-aws-step-functions.html) | DevOps | 

### 샘플 상태 머신 생성
<a name="create-a-sample-state-machine"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 테스트 상태 머신을 생성하십시오. | [AWS Step Functions AWS Step Functions 개발자 안내서](https://docs.aws.amazon.com/step-functions/latest/dg/getting-started-with-sfn.html)의 지침에 따라 상태 머신을 생성하고 실행하십시오. 정의를 위해 다음 코드를 사용하십시오. 계정에 있는 유효한 Systems Manager 활성화 인스턴스의 ID로 `InstanceIds` 값을 업데이트해야 합니다.<pre>{<br />  "Comment": "A description of my state machine",<br />  "StartAt": "StartAutomationWaitForCallBack",<br />  "States": {<br />    "StartAutomationWaitForCallBack": {<br />      "Type": "Task",<br />      "Resource": "arn:aws:states:::aws-sdk:ssm:startAutomationExecution.waitForTaskToken",<br />      "Parameters": {<br />        "DocumentName": "SfnRunCommandByInstanceIds",<br />        "Parameters": {<br />          "InstanceIds": [<br />            "i-1234567890abcdef0"<br />          ],<br />          "taskToken.$": "States.Array($$.Task.Token)",<br />          "workingDirectory": [<br />            "/home/ssm-user/"<br />          ],<br />          "Commands": [<br />            "echo \"This is a test running automation waitForTaskToken\" >> automation.log",<br />            "sleep 100"<br />          ],<br />          "executionTimeout": [<br />              "10800"<br />          ],<br />          "deliveryTimeout": [<br />              "30"<br />          ],<br />          "shell": [<br />              "Shell"<br />          ]<br />            }<br />      },<br />      "End": true<br />    }<br />  }<br />}</pre>이 코드는 런북을 직접 호출하여 Systems Manager Automation에 대한 `waitForTaskToken` 직접 호출을 보여주는 두 개의 명령을 실행합니다.`shell` 파라미터 값(`Shell` 또는 `PowerShell`)은 자동화 문서가 `AWS-RunShellScript` 또는를 실행할지 여부를 결정합니다`AWS-RunPowerShellScript`.작업은 `/home/ssm-user/automation.log` 파일에 “이것은 자동화 WaitForTaskToken을 실행하는 테스트입니다”라고 쓴 다음, 100초 동안 휴면 상태로 있다가 작업 토큰으로 응답하여 워크플로에서 다음 작업을 릴리스합니다.대신 `SfnRunCommandByTargets` 런북을 직접 호출하려면 이전 코드의 `Parameters` 섹션을 다음과 같이 바꾸십시오.<pre>"Parameters": {<br />          "Targets": [<br />            {<br />              "Key": "InstanceIds",<br />              "Values": [<br />                "i-02573cafcfEXAMPLE",<br />                "i-0471e04240EXAMPLE"<br />              ]<br />            }<br />          ],</pre> | AWS DevOps | 
| 상태 머신의 IAM 역할을 업데이트합니다. | 이전 단계에서는 상태 머신을 위한 전용 IAM 역할을 자동으로 생성합니다. 하지만 런북 직접 호출 권한은 부여하지 않습니다. 다음 권한을 추가하여 역할을 업데이트합니다.<pre>{<br />      "Effect": "Allow",<br />      "Action": "ssm:StartAutomationExecution",<br />      "Resource": "*"<br /> }</pre> | AWS DevOps | 
| 동기 직접 호출을 검증합니다. | 상태 머신을 실행하여 Step Functions와 Systems Manager Automation 간의 동기 직접 호출을 검증합니다. 샘플 출력은 [추가 정보](#run-aws-systems-manager-automation-tasks-synchronously-from-aws-step-functions-additional) 섹션을 참조하십시오.  | AWS DevOps | 

## 관련 리소스
<a name="run-aws-systems-manager-automation-tasks-synchronously-from-aws-step-functions-resources"></a>
+ [시작하기 AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/getting-started-with-sfn.html)(*AWS Step Functions 개발자 안내서*)
+ [작업 토큰을 사용하여 콜백 대기](https://docs.aws.amazon.com/step-functions/latest/dg/connect-to-resource.html#connect-wait-token)(*AWS Step Functions 개발자 안내서*, 서비스 통합 패턴)
+ [send\$1task\$1success](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/stepfunctions/client/send_task_success.html) 및 [send\$1task\$1failure](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/stepfunctions/client/send_task_failure.html) API 직접 호출(Boto3 설명서) 
+ [AWS Systems Manager 자동화](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-automation.html)(*AWS Systems Manager 사용 설명서*)

## 추가 정보
<a name="run-aws-systems-manager-automation-tasks-synchronously-from-aws-step-functions-additional"></a>

**구현 세부 정보**

이 패턴은 두 개의 Systems Manager 런북을 배포하는 AWS CloudFormation 템플릿을 제공합니다.
+ `SfnRunCommandByInstanceIds`가 인스턴스 ID를 사용하여 명령을 실행합니다.
+ `SfnRunCommandByTargets`이 대상을 사용하여 명령을 실행합니다.

각 런북은 Step Functions의 `.waitForTaskToken` 옵션을 사용할 때 동기 직접 호출을 달성하기 위한 세 단계를 구현합니다.


| 
| 
| 단계 | 작업 | 설명 | 
| --- |--- |--- |
| **1** | `Branch` | `shell` 파라미터 값(`Shell` 또는 `PowerShell`)을 확인하여 Linux`AWS-RunShellScript`용 또는 Windows`AWS-RunPowerShellScript`용를 실행할지 결정합니다. | 
| **2** | `RunCommand_Shell` 또는 `RunCommand_PowerShell` | 여러 입력을 가져와`RunShellScript`서 또는 `RunPowerShellScript` 명령을 실행합니다. 자세한 내용은 Systems Manager 콘솔에서 세부 **정보** 탭에서 `RunCommand_Shell` 또는 `RunCommand_PowerShell` 자동화 문서를 확인하세요. | 
| **3** | `SendTaskFailure` | 2단계가 중단되거나 취소될 때 실행됩니다. Step Functions [send\$1task\$1failure](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/stepfunctions/client/send_task_failure.html) API를 직접 호출하며, 이 API는 상태 머신이 전달한 토큰, 실패 오류, 실패 원인에 대한 설명이라는 세 가지 파라미터를 입력으로 받아들입니다. | 
| **4** | `SendTaskSuccess` | 2단계가 성공하면 실행됩니다. 상태 머신이 전달한 토큰을 입력으로 받아들이는 Step Functions [send\$1task\$1success](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/stepfunctions/client/send_task_success.html) API를 직접 호출합니다. | 

**런북 파라미터**

`SfnRunCommandByInstanceIds` 런북


| 
| 
| 파라미터 이름 | Type | 선택 또는 필수 | 설명 | 
| --- |--- |--- |--- |
| `shell` | 문자열 | 필수 | 인스턴스 쉘은 Linux`AWS-RunShellScript`용 또는 Windows`AWS-RunPowerShellScript`용를 실행할지 여부를 결정합니다. | 
| `deliveryTimeout` | Integer | 선택 사항 | 명령이 인스턴스의 에 전송될 때까지 대기하는 시간(초)입니다. 이 파라미터의 최소값은 30(0.5분)이고 최대값은 2592000(720시간)입니다. | 
| `executionTimeout` | 문자열 | 선택 사항 | 명령이 실패로 간주되기 전에 완료해야 할 시간(초). 기본값은 1시간입니다. 최댓값은 172,800(48시간)입니다. | 
| `workingDirectory` | 문자열 | 선택 사항 | 인스턴스 상의 작업 디렉터리에 대한 경로. | 
| `Commands` | StringList | 필수 | 실행할 쉘 스크립트 또는 명령. | 
| `InstanceIds` | StringList | 필수 | 명령을 실행하려고 하는 인스턴스의 ID. | 
| `taskToken` | 문자열 | 필수 | 콜백 응답에 사용할 작업 토토큰. | 

`SfnRunCommandByTargets` 런북


| 
| 
| 이름 | Type | 선택 또는 필수 | 설명 | 
| --- |--- |--- |--- |
| `shell` | 문자열 | 필수 | 인스턴스 쉘은 Linux`AWS-RunShellScript`용 또는 Windows`AWS-RunPowerShellScript`용를 실행할지 여부를 결정합니다. | 
| `deliveryTimeout` | Integer | 선택 사항 | 명령이 인스턴스의 에 전송될 때까지 대기하는 시간(초)입니다. 이 파라미터의 최소값은 30(0.5분)이고 최대값은 2592000(720시간)입니다. | 
| `executionTimeout` | Integer | 선택 사항 | 명령이 실패로 간주되기 전에 완료해야 할 시간(초). 기본값은 1시간입니다. 최댓값은 172,800(48시간)입니다. | 
| `workingDirectory` | 문자열 | 선택 사항 | 인스턴스 상의 작업 디렉터리에 대한 경로. | 
| `Commands` | StringList | 필수 | 실행할 쉘 스크립트 또는 명령. | 
| `Targets` | MapList | 필수 | 지정한 키,값 쌍을 사용하여 인스턴스를 식별하는 검색 기준 배열. 예: `[{"Key":"InstanceIds","Values":["i-02573cafcfEXAMPLE","i-0471e04240EXAMPLE"]}]` | 
| `taskToken` | 문자열 | 필수 | 콜백 응답에 사용할 작업 토토큰. | 

**샘플 출력**

다음 테이블에는 step 함수의 샘플 출력이 나와 있습니다. 이는 5단계(`TaskSubmitted`)와 6단계(`TaskSucceeded`) 사이의 총 실행 시간이 100초 이상임을 보여줍니다. 이는 step 함수가 워크플로의 다음 작업으로 이동하기 전에 ‘sleep 100’ 명령이 완료될 때까지 기다렸다는 것을 보여줍니다.


| 
| 
| ID | Type | 단계 | Resource | 경과 시간(밀리 초) | 타임스탬프 | 
| --- |--- |--- |--- |--- |--- |
| **1** | `ExecutionStarted` |  | - | 0 | 2022년 3월 11일 오후 02:50:34. 303 | 
| **2** | `TaskStateEntered` | `StartAutomationWaitForCallBack` | - | 40 | 2022년 3월 11일 오후 02:50:34. 343 | 
| **3** | `TaskScheduled` | `StartAutomationWaitForCallBack` | - | 40 | 2022년 3월 11일 오후 02:50:34. 343 | 
| **4** | `TaskStarted` | `StartAutomationWaitForCallBack` | - | 154 | 2022년 3월 11일 오후 02:50:34. 457 | 
| **5** | `TaskSubmitted` | `StartAutomationWaitForCallBack` | - | 657 | 2022년 3월 11일 오후 02:50:34. 960 | 
| **6** | `TaskSucceeded` | `StartAutomationWaitForCallBack` | - | 103835 | 2022년 3월 11일 오후 02:52:18. 138 | 
| **7** | `TaskStateExited` | `StartAutomationWaitForCallBack` | - | 103860 | 2022년 3월 11일 오후 02:52:18. 163 | 
| **8** | `ExecutionSucceeded` |  | - | 103897 | 2022년 3월 11일 오후 02:52:18. 200 | 

# AWS Lambda 함수에서 Python을 사용하여 S3 객체의 병렬 읽기 실행
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function"></a>

*Eduardo Bortoluzzi, Amazon Web Services*

## 요약
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-summary"></a>

이 패턴을 사용하여 Amazon Simple Storage Service(Amazon S3) 버킷에서 문서 목록을 실시간으로 검색하고 요약할 수 있습니다. 이 패턴은 Amazon Web Services(AWS)의 S3 버킷에서 객체를 병렬로 읽는 예시 코드를 제공합니다. 이 패턴은 Python을 사용하여 AWS Lambda 함수로 I/O 바인딩 작업을 효율적으로 실행하는 방법을 보여줍니다.

금융 회사는 대화형 솔루션에서이 패턴을 사용하여 상관관계가 있는 금융 거래를 실시간으로 수동으로 승인하거나 거부했습니다. 금융 거래 문서는 시장과 관련된 S3 버킷에 저장되었습니다. 운영자는 S3 버킷의 문서 목록을 선택하고 솔루션이 계산한 트랜잭션의 총 값을 분석한 다음 선택한 배치를 승인하거나 거부하기로 결정했습니다.

I/O 바인딩 태스크는 여러 스레드를 지원합니다. 이 예시 코드에서 [concurrent.futures.ThreadPoolExecutor](https://docs.python.org/3.13/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor)는 Lambda 함수가 최대 1,024개의 스레드를 지원하더라도 최대 30개의 동시 스레드와 함께 사용됩니다(해당 스레드 중 하나가 기본 프로세스임). 이 제한은 스레드가 너무 많으면 컨텍스트 전환 및 컴퓨팅 리소스 사용률로 인해 지연 시간 문제가 발생하기 때문입니다. 또한 모든 스레드가 S3 객체 다운로드를 동시에 수행할 수 `botocore` 있도록에서 최대 풀 연결을 늘려야 합니다.

이 예시 코드는 S3 버킷에서 JSON 데이터와 함께 8.3KB 객체 하나를 사용합니다. 객체는 여러 번 읽습니다. Lambda 함수가 객체를 읽으면 JSON 데이터가 Python 객체로 디코딩됩니다. 2024년 12월에이 예제를 실행한 후의 결과는 메모리 2,304MB로 구성된 Lambda 함수를 사용하여 2.3초 내에 처리된 읽기 1,000개와 27초 내에 처리된 읽기 10,000개였습니다.는 메모리 구성을 128MB에서 10,240MB(10GB)로 AWS Lambda 지원하지만 Lambdamemory를 2,304MB 이상으로 늘리면이 특정 I/O 바운드 작업을 실행하는 시간을 줄이는 데 도움이 되지 않았습니다.

[AWS Lambda Power Tuning](https://github.com/alexcasalboni/aws-lambda-power-tuning) 도구는 다양한 Lambda 메모리 구성을 테스트하고 작업에 가장 적합한 performance-to-cost 비율을 확인하는 데 사용되었습니다. 테스트 결과는 [추가 정보](#run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-additional) 섹션을 참조하십시오.

## 사전 조건 및 제한 사항
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-prereqs"></a>

**사전 조건 **
+ 활성 AWS 계정
+ Python 개발 숙련도

**제한 사항 **
+ Lambda 함수는 최대 [1,024개의 실행 프로세스 또는 스레드를 가질 수 있습니다](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html#function-configuration-deployment-and-execution).
+ 새의 Lambda 메모리 제한 AWS 계정 은 3,008MB입니다. 그에 따라 AWS Lambda Power Tuning 도구를 조정합니다. 자세한 내용은 [문제 해결](#run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-troubleshooting) 섹션을 참조하세요.
+ Amazon S3는 [분할된 접두사당 초당 5,500개의 GET/HEAD 요청](https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance.html)으로 제한됩니다.

**제품 버전**
+ Python 3.9 이상
+ AWS Cloud Development Kit (AWS CDK) v2
+ AWS Command Line Interface (AWS CLI) 버전 2
+ AWS Lambda Power Tuning 4.3.6(선택 사항)

## 아키텍처
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-architecture"></a>

**대상 기술 스택 **
+ AWS Lambda
+ Amazon S3
+ AWS Step Functions ( AWS Lambda Power Tuning이 배포된 경우)

**대상 아키텍처 **

다음 다이어그램은 S3 버킷에서 객체를 병렬로 읽는 Lambda 함수를 보여줍니다. 다이어그램에는 Lambda 함수 메모리를 미세 조정하기 위한 AWS Lambda Power Tuning 도구에 대한 Step Functions 워크플로도 있습니다. 이 미세 조정은 비용과 성능 간의 균형을 유지하는 데 도움이 됩니다.

![\[Lambda 함수, S3 버킷 및 AWS Step Functions를 보여주는 다이어그램입니다.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/b46e9b16-9842-4291-adfa-3ef012b89aec/images/828696e2-6df7-4536-9205-951c99449f4e.png)


**자동화 및 규모 조정**

Lambda 함수는 필요한 경우 빠르게 확장됩니다. 수요가 많은 동안 Amazon S3의 503 속도 저하 오류를 방지하려면 조정에 몇 가지 제한을 두는 것이 좋습니다.

## 도구
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-tools"></a>

**서비스**
+ [AWS Cloud Development Kit (AWS CDK) v2](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html)는 코드로 AWS 클라우드 인프라를 정의하고 프로비저닝하는 데 도움이 되는 소프트웨어 개발 프레임워크입니다. 배포할 인프라 예제가 생성되었습니다 AWS CDK.
+ [AWS Command Line InterfaceAWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)는 명령줄 셸의 명령을 AWS 서비스 통해와 상호 작용하는 데 도움이 되는 오픈 소스 도구입니다. 이 패턴에서 AWS CLI 버전 2는 예제 JSON 파일을 업로드하는 데 사용됩니다.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)는 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행하는 데 도움이 되는 컴퓨팅 서비스입니다. 필요할 때만 코드를 실행하며 자동으로 확장이 가능하므로 사용한 컴퓨팅 시간만큼만 비용을 지불합니다.
+ [Amazon Simple Storage Service(Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)는 원하는 양의 데이터를 저장, 보호 및 검색하는 데 도움이 되는 클라우드 기반 객체 스토리지 서비스입니다.
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html)는 AWS Lambda 함수와 기타 AWS 서비스를 결합하여 비즈니스 크리티컬 애플리케이션을 구축하는 데 도움이 되는 서버리스 오케스트레이션 서비스입니다.

**기타 도구**
+ [Python](https://www.python.org/)은 범용 컴퓨터 프로그래밍 언어입니다. 유[휴 작업자 스레드의 재사용](https://docs.python.org/3.8/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor)은 Python 버전 3.8에 도입되었으며,이 패턴의 Lambda 함수 코드는 Python 버전 3.9 이상에 대해 생성되었습니다.

**코드 리포지토리**

이 패턴의 코드는 [aws-lambda-parallel-download](https://github.com/aws-samples/aws-lambda-parallel-download) GitHub 리포지토리에서 사용할 수 있습니다.

## 모범 사례
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-best-practices"></a>
+ 이 AWS CDK 구문은 인프라를 배포할 AWS 계정수 있는 사용자 권한에 의존합니다. AWS CDK 파이프라인 또는 교차 계정 배포를 사용하려는 경우 [스택 신디](https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping.html#bootstrapping-synthesizers)사이저를 참조하세요.
+ 이 예시 애플리케이션에는 S3 버킷에서 액세스 로그가 활성화되어 있지 않습니다. 프로덕션 코드에서 액세스 로그를 활성화하는 것이 가장 좋습니다.

## 에픽
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-epics"></a>

### 개발 환경 준비
<a name="prepare-the-development-environment"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| Python 설치 버전을 확인합니다. | 이 코드는 Python 3.9 및 Python 3.13에서 특별히 테스트되었으며 이러한 릴리스 사이의 모든 버전에서 작동해야 합니다. Python 버전을 확인하려면 터미널`python3 -V`에서를 실행하고 필요한 경우 최신 버전을 설치합니다.필요한 모듈이 설치되었는지 확인하려면를 실행합니다`python3 -c "import pip, venv"`. 오류 메시지가 없으면 모듈이 제대로 설치되었으며 이 예를 실행할 준비가 되었음을 의미합니다. | 클라우드 아키텍트 | 
| 를 설치합니다 AWS CDK. | 아직 설치되지 않은 AWS CDK 경우를 설치하려면 [시작하기 AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html)의 지침을 따릅니다. 설치된 AWS CDK 버전이 2.0 이상인지 확인하려면를 실행합니다`cdk –version`. | 클라우드 아키텍트 | 
|  환경 부트스트랩. | 환경을 부트스트랩하려면 환경 [부트스트랩의 지침에 따라와 함께 사용합니다 AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping-env.html). | 클라우드 아키텍트 | 

### 샘플 리포지토리 복제
<a name="clone-the-example-repository"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 리포지토리를 복제합니다. | 리포지토리의 최신 버전을 복제하려면 다음 명령을 실행합니다.<pre>git clone --depth 1 --branch v1.2.0 \<br />git@github.com:aws-samples/aws-lambda-parallel-download.git</pre> | 클라우드 아키텍트 | 
| 작업 디렉터리를 복제된 리포지토리로 변경합니다. | 다음 명령을 실행합니다.<pre>cd aws-lambda-parallel-download</pre> | 클라우드 아키텍트 | 
| Python 가상 환경을 생성합니다. | Python 가상 환경을 생성하려면 다음 명령을 실행합니다.<pre>python3 -m venv .venv</pre> | 클라우드 아키텍트 | 
| 가상 환경을 활성화합니다. | 가상 환경을 활성화하려면 다음 명령을 실행합니다.<pre>source .venv/bin/activate</pre> | 클라우드 아키텍트 | 
| 종속성을 설치합니다. | `pip` 명령을 실행하여 Python 종속 항목을 설치합니다.<pre>pip install -r requirements.txt</pre> | 클라우드 아키텍트 | 
| 코드를 찾습니다. | (선택 사항) S3 버킷에서 객체를 다운로드하는 예시 코드는 `resources/parallel.py`에 있습니다.인프라 코드는 `parallel_download` 폴더에 있습니다. | 클라우드 아키텍트 | 

### 앱 배포 및 테스트
<a name="deploy-and-test-the-app"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 앱을 배포합니다. | `cdk deploy`를 실행합니다. AWS CDK 출력을 기록합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function.html) | 클라우드 아키텍트 | 
| 예시 JSON 파일을 업로드합니다. | 리포지토리에는 약 9KB의 예시 JSON 파일이 포함되어 있습니다. 생성된 스택의 S3 버킷에 파일을 업로드하려면 다음 명령을 실행합니다.<pre>aws s3 cp sample.json s3://<ParallelDownloadStack.SampleS3BucketName></pre>`<ParallelDownloadStack.SampleS3BucketName>`를 AWS CDK 출력의 해당 값으로 바꿉니다. | 클라우드 아키텍트 | 
| 앱을 실행합니다. | 앱을 실행하려면 다음을 수행합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function.html) | 클라우드 아키텍트 | 
| 다운로드 수를 추가합니다. | (선택 사항) 1,500개의 객체 가져오기 직접 호출을 실행하려면 `Test` 파라미터의 **이벤트 JSON에서 다음 JSON**을 사용합니다.<pre>{"repeat": 1500, "objectKey": "sample.json"}</pre> | 클라우드 아키텍트 | 

### 선택 사항: AWS Lambda 파워 튜닝 실행
<a name="optional-run-lamlong-power-tuning"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
|  AWS Lambda Power Tuning 도구를 실행합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function.html)실행이 끝나면 **실행 입력 및 출력** 탭에 결과가 표시됩니다. | 클라우드 아키텍트 | 
| 그래프에서 AWS Lambda Power Tuning 결과를 봅니다. | **실행 입력 및 출력** 탭에서 `visualization` 속성 링크를 복사하여 새 브라우저 탭에 붙여 넣습니다. | 클라우드 아키텍트 | 

### 정리
<a name="clean-up"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| S3 버킷에서 객체를 제거합니다. | 배포된 리소스를 삭제하기 전에 S3 버킷에서 모든 객체를 제거합니다.<pre>aws s3 rm s3://<ParallelDownloadStack.SampleS3BucketName> \<br />--recursive</pre>를 AWS CDK 출력의 값으로 `<ParallelDownloadStack.SampleS3BucketName>` 바꿔야 합니다. | 클라우드 아키텍트 | 
| 리소스를 폐기합니다. | 이 파일럿을 위해 생성된 모든 리소스를 삭제하려면 다음 명령을 실행합니다.<pre>cdk destroy</pre> | 클라우드 아키텍트 | 

## 문제 해결
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-troubleshooting"></a>


| 문제 | Solution | 
| --- | --- | 
| `'MemorySize' value failed to satisfy constraint: Member must have value less than or equal to 3008` | 새 계정의 경우 Lambda 함수에서 3,008MB 이상을 구성하지 못할 수 있습니다. AWS Lambda 파워 튜닝을 사용하여 테스트하려면 Step Functions 실행을 시작할 때 입력 JSON에 다음 속성을 추가합니다.<pre>"powerValues": [<br />    512,<br />    1024,<br />    1536,<br />    2048,<br />    2560,<br />    3008<br />  ]</pre> | 

## 관련 리소스
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-resources"></a>
+ [Python – concurrent.futures.ThreadPoolExecutor](https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor)
+ [Lambda 할당량 - 함수 구성, 배포 및 실행](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html#function-configuration-deployment-and-execution)
+ [Python AWS CDK 에서 작업](https://docs.aws.amazon.com/cdk/v2/guide/work-with-cdk-python.html)
+ [AWS Lambda Power Tuning을 사용하여 함수 프로파일링](https://docs.aws.amazon.com/lambda/latest/operatorguide/profile-functions.html)

## 추가 정보
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-additional"></a>

**코드**

다음 코드 조각은 병렬 I/O 처리를 수행합니다.

```
with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor:
  for result in executor.map(a_function, (the_arguments)):
    ...
```

는 스레드를 사용할 수 있게 되면 `ThreadPoolExecutor` 재사용합니다.

**테스트 및 결과**

이러한 테스트는 2024년 12월에 수행되었습니다.

첫 번째 테스트는 다음 결과와 함께 2,500개의 객체 읽기를 처리했습니다.

![\[메모리가 증가함에 따라 간접 호출 시간이 줄어들고 간접 호출 비용이 증가합니다.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/b46e9b16-9842-4291-adfa-3ef012b89aec/images/f6743412-1e52-4c4c-a51c-ac0f75b3b998.png)


3,009MB부터 모든 메모리 증가에 대해 처리 시간 수준은 거의 동일하게 유지되었지만 메모리 크기가 증가함에 따라 비용이 증가했습니다.

또 다른 테스트에서는 256MB의 배수인 값을 사용하고 10,000개의 객체 읽기를 처리하여 1,536MB에서 3,072MB 사이의 메모리 범위를 조사했으며, 그 결과는 다음과 같습니다.

![\[간접 호출 시간 감소와 간접 호출 비용 증가 간의 차이가 감소했습니다.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/b46e9b16-9842-4291-adfa-3ef012b89aec/images/c75d4443-74d8-4b93-9b4d-b2640869381e.png)


최상의 performance-to-cost 비율은 2,304MB 메모리 Lambda 구성이었습니다.

비교하자면 2,500개의 객체 읽기를 순차적으로 처리하는 데 47초가 걸렸습니다. 2,304MB Lambda 구성을 사용하는 병렬 프로세스는 7초가 걸렸으며, 이는 85% 더 짧습니다.

![\[순차 처리에서 병렬 처리로 전환할 때의 시간 감소를 보여주는 차트입니다.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/b46e9b16-9842-4291-adfa-3ef012b89aec/images/f3dcc44d-ac20-4b75-897d-1d71f0d59781.png)


# 실시간 분석 및 시각화 AWS Lambda 를 위해에서 OpenSearch로 원격 측정 데이터 전송
<a name="send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization"></a>

*Tabby Ward, Guy Bachar, David Kilzer, Amazon Web Services*

## 요약
<a name="send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization-summary"></a>

최신 애플리케이션은 점점 더 분산되고 이벤트 중심이 되어 실시간 모니터링 및 관찰성의 필요성을 강화합니다. AWS Lambda 는 확장 가능한 이벤트 중심 아키텍처를 구축하는 데 중요한 역할을 하는 서버리스 컴퓨팅 서비스입니다. 하지만 Amazon CloudWatch Logs에만 의존하면 Lambda 함수를 모니터링하고 문제를 해결하는 것이 어려울 수 있으며, 이로 인해 지연 시간과 제한된 보존 기간이 발생할 수 있습니다.

이 문제를 해결하기 위해 Lambda 함수가 서드 파티 모니터링 및 관찰성 도구로 직접 원격 측정 데이터를 전송할 수 있는 Lambda 원격 측정 API를 AWS 도입했습니다. 이 API는 로그, 지표 및 추적의 실시간 스트리밍을 지원하며 Lambda 함수의 성능 및 상태에 대한 포괄적이고 시기적절한 보기를 제공합니다.

이 패턴은 Lambda Telemetry API를 오픈 소스, 분산 검색 및 분석 엔진인 [OpenSearch](https://opensearch.org/docs/latest/)와 통합하는 방법을 설명합니다. OpenSearch는 대량의 데이터를 수집, 저장 및 분석하기 위한 강력하고 확장 가능한 플랫폼을 제공하므로 Lambda 원격 측정 데이터에 이상적인 선택입니다. 특히이 패턴은에서 제공하는 Lambda 확장을 사용하여 Python으로 작성된 Lambda 함수의 로그를 OpenSearch 클러스터로 직접 전송하는 방법을 보여줍니다 AWS. 이 솔루션은 유연하고 사용자 지정할 수 있으므로 자체 Lambda 확장을 생성하거나 샘플 소스 코드를 변경하여 출력 형식을 원하는 대로 변경할 수 있습니다.

이 패턴은 OpenSearch와의 Lambda Telemetry API 통합을 설정하고 구성하는 방법을 설명하고 보안, 비용 최적화 및 확장성에 대한 모범 사례를 포함합니다. 목표는 Lambda 함수에 대한 심층적인 인사이트를 얻고 서버리스 애플리케이션의 전반적인 관찰성을 개선하는 데 도움이 됩니다.


| 
| 
| 참고:이 패턴은 Lambda Telemetry API를 관리형 OpenSearch와 통합하는 데 중점을 둡니다. 그러나 논의된 원칙과 기법은 자체 관리형 OpenSearch 및 Elasticsearch에도 적용됩니다. | 
| --- |

## 사전 조건 및 제한 사항
<a name="send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization-prereqs"></a>

통합 프로세스를 시작하기 전에 다음과 같은 사전 요구 사항이 있는지 확인합니다.

**AWS 계정**: 다음 AWS 리소스를 생성하고 관리할 수 있는 적절한 권한이 AWS 계정 있는 활성 :
+ AWS Lambda
+ AWS Identity and Access Management (IAM)
+ Amazon OpenSearch Service(관리형 OpenSearch 클러스터를 사용하는 경우)

**OpenSearch 클러스터**:
+ 기존 자체 관리형 OpenSearch 클러스터 또는 OpenSearch Service와 같은 관리형 서비스를 사용할 수 있습니다.
+ OpenSearch Service를 사용하는 경우 OpenSearch Service 설명서의 [Amazon OpenSearch Service 시작하기](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/gsg.html)의 지침에 따라 OpenSearch 클러스터를 설정합니다.
+ OpenSearch 클러스터가 Lambda 함수에서 액세스할 수 있고 액세스 정책, 암호화 및 인증과 같은 필수 보안 설정으로 구성되어 있는지 확인합니다.
+ Lambda 원격 측정 데이터를 수집하는 데 필요한 인덱스 매핑 및 설정으로 OpenSearch 클러스터를 구성합니다. 자세한 내용은 OpenSearch Service 설명서의 [Amazon OpenSearch Service로 스트리밍 데이터 로드](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/integrations.html)를 참조하십시오.

**네트워크 연결**:
+ Lambda 함수에 OpenSearch 클러스터에 액세스하는 데 필요한 네트워크 연결이 있는지 확인합니다. Virtual Private Cloud(VPC) 설정을 구성하는 방법에 대한 지침은 [ OpenSearch Service 설명서의 VPC 내에서 Amazon OpenSearch Service 도메인 시작](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/vpc.html)을 참조하세요. OpenSearch 

**IAM 역할 및 정책**:
+ Lambda 함수가 OpenSearch 클러스터에 액세스하고에 저장된 자격 증명에 액세스하는 데 필요한 권한을 가진 IAM 역할을 생성합니다 AWS Secrets Manager.
+ OpenSearch와 상호 작용하는 데 필요한 정책 및 추가 권한과 같은 적절한 IAM `AWSLambdaBasicExecutionRole` 정책을 역할에 연결합니다.
+ Lambda 함수에 부여된 IAM 권한이 OpenSearch 클러스터에 데이터를 쓸 수 있도록 허용하는지 확인합니다. IAM 권한 관리에 대한 자세한 내용은 [Lambda 설명서의 실행 역할을 사용하여 Lambda 함수 권한 정의를](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html) 참조하세요.

**프로그래밍 언어 지식**:
+ Lambda 함수 및 Lambda 확장의 샘플 코드를 이해하고 수정하려면 Python(또는 원하는 프로그래밍 언어)에 대한 기본 지식이 필요합니다.

**개발 환경**:
+ Lambda 함수 및 확장을 빌드하고 배포하는 데 필요한 도구와 종속성을 사용하여 로컬 개발 환경을 설정합니다.

**AWS CLI 또는 AWS Management Console**:
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)를 설치 및 구성하거나 적절한 자격 증명과 AWS Management Console 함께를 사용하여 필요한와 상호 작용합니다 AWS 서비스.

**모니터링 및 로깅**:
+ 모니터링 및 감사 목적으로 Amazon CloudWatch와 같은 서비스를 AWS포함하여에 AWS CloudTrail 대한 모니터링 및 로깅 모범 사례를 숙지합니다.
+ Lambda 함수의 CloudWatch Logs를 확인하여 Lambda Telemetry API 통합과 관련된 오류 또는 예외를 식별합니다. 문제 해결 지침은 [Lambda Telemetry API 설명서를](https://docs.aws.amazon.com/lambda/latest/dg/telemetry-api.html) 참조하세요.

## 아키텍처
<a name="send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization-architecture"></a>

이 패턴은 OpenSearch Service를 사용하여 Lambda 함수에서 생성된 로그 및 원격 측정 데이터를 저장합니다. 이 접근 방식을 사용하면 로그를 OpenSearch 클러스터로 직접 빠르게 스트리밍할 수 있으므로 CloudWatch Logs를 중개자로 사용할 때 발생하는 지연 시간과 비용을 줄일 수 있습니다.


| 
| 
| Lambda 확장 코드는 OpenSearch API를 직접 사용하거나 OpenSearch [OpenSearch 클라이언트 라이브러리](https://opensearch.org/docs/latest/clients/index/)를 사용하여 OpenSearch Service에 원격 측정을 푸시할 수 있습니다. Lambda 확장은 OpenSearch API에서 지원하는 대량 작업을 사용하여 원격 측정 이벤트를 일괄 처리하여 단일 요청으로 OpenSearch Service로 전송할 수 있습니다. | 
| --- |

다음 워크플로 다이어그램은 OpenSearch 클러스터를 엔드포인트로 사용할 때 Lambda 함수의 로그 워크플로를 보여줍니다.

![\[원격 측정 데이터를 OpenSearch 클러스터로 전송하기 위한 워크플로입니다.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/57fe8796-9f36-46cf-8304-f506242b9f04/images/283ccdcd-a0e1-40a2-a95a-3bd046bfa8ca.png)


아키텍처에는 다음과 같은 구성 요소가 포함되어 있습니다.
+ Lambda 함수: 실행 중에 로그 및 원격 측정 데이터를 생성하는 서버리스 함수입니다.
+ Lambda 확장: Lambda Telemetry API를 사용하여 OpenSearch 클러스터와 직접 통합하는 Python 기반 확장입니다. 이 익스텐션은 Lambda 함수와 동일한 실행 환경에서 같이 실행됩니다.
+ Lambda 원격 측정 API: Lambda 확장이 로그, 지표 및 추적을 포함한 원격 측정 데이터를 서드 파티 모니터링 및 관찰성 도구로 직접 전송할 수 있도록 하는 API입니다.
+ Amazon OpenSearch Service 클러스터:에서 호스팅되는 관리형 OpenSearch 클러스터입니다 AWS. 이 클러스터는 Lambda 확장을 통해 Lambda 함수에서 스트리밍된 로그 데이터를 수집, 저장 및 인덱싱하는 역할을 합니다.

이 워크플로우는 다음 단계로 구성됩니다.

1. Lambda 함수를 직접적으로 호출하고 실행 중에 로그 및 원격 측정 데이터를 생성합니다.

1. Lambda 확장은 함수와 함께 실행되어 Lambda Telemetry API를 사용하여 로그 및 원격 측정 데이터를 캡처합니다.

1. Lambda 확장은 OpenSearch Service 클러스터와의 보안 연결을 설정하고 로그 데이터를 실시간으로 스트리밍합니다.

1. OpenSearch Service 클러스터는 Kibana 또는 기타 호환 애플리케이션과 같은 도구를 사용하여 검색, 분석 및 시각화에 사용할 수 있도록 로그 데이터를 수집, 인덱싱 및 저장합니다.

CloudWatch Logs를 우회하고 로그 데이터를 OpenSearch 클러스터로 직접 전송함으로써이 솔루션은 다음과 같은 몇 가지 이점을 제공합니다.
+ 실시간 로그 스트리밍 및 분석을 통해 문제 해결 속도를 높이고 관찰성을 개선할 수 있습니다.
+ CloudWatch Logs와 관련된 지연 시간 및 잠재적 보존 제한 감소.
+ Lambda 확장을 사용자 지정하거나 특정 출력 형식 또는 추가 처리를 위해 자체 확장을 생성할 수 있는 유연성.
+ 로그 분석 및 모니터링을 위한 OpenSearch Service의 검색, 분석 및 시각화 기능과의 통합.

[에픽](#send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization-epics) 섹션에서는 Lambda 확장을 설정하고, Lambda 함수를 구성하고, OpenSearch Service 클러스터와 통합하기 위한 step-by-step 지침을 제공합니다. 보안 고려 사항, 비용 최적화 전략 및 솔루션 모니터링 및 문제 해결을 위한 팁은 [모범 사례](#send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization-best-practices) 섹션을 참조하세요.

## 도구
<a name="send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization-tools"></a>

**서비스**
+ [AWS Lambda](https://aws.amazon.com/lambda/)은(는) 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수 있게 해주는 컴퓨팅 서비스입니다. Lambda는 필요 시에만 코드를 실행하며, 일일 몇 개의 요청에서 초당 수천 개의 요청까지 자동으로 규모를 조정합니다.
+ [Amazon OpenSearch Service](https://aws.amazon.com/opensearch-service/)는 클라우드에서 OpenSearch 클러스터를 쉽게 배포, 운영 및 확장할 수 AWS 있도록에서 제공하는 완전 관리형 서비스입니다.
+ [Lambda 확장은](https://docs.aws.amazon.com/lambda/latest/dg/lambda-extensions.html) Lambda 함수와 함께 사용자 지정 코드를 실행하여 Lambda 함수의 기능을 확장합니다. Lambda 확장을 사용하여 다양한 모니터링, 관찰, 보안 및 거버넌스 도구와 Lambda를 통합할 수 있습니다.
+ [AWS Lambda 원격 측정 API](https://docs.aws.amazon.com/lambda/latest/dg/telemetry-api.html)를 사용하면 확장을 사용하여 Lambda에서 직접 향상된 모니터링 및 관찰성 데이터를 캡처하여 원하는 대상으로 전송할 수 있습니다.
+ [CloudFormation](https://aws.amazon.com/cloudformation/)는 AWS 리소스를 모델링하고 설정하여 리소스를 관리하는 데 소요되는 시간을 줄이고 애플리케이션에 더 많은 시간을 할애할 수 있도록 도와줍니다.

**코드 리포지토리**
+ [AWS Lambda 익스텐션](https://github.com/aws-samples/aws-lambda-extensions)에는 자체 익스텐션 구축을 시작하는 데 도움이 되는 및 AWS 파트너의 데모 AWS 및 샘플 프로젝트가 포함되어 있습니다.
+ [OpenSearch용 Lambda 원격 측정 통합 예](https://github.com/aws-samples/aws-lambda-extensions/tree/main/python-example-telemetry-opensearch-extension)는 Lambda 함수에서 OpenSearch 클러스터로 로그를 보내는 방법을 보여주는 샘플 Lambda 확장을 제공합니다.

**기타 도구**
+ [OpenSearch](https://opensearch.org/faq/)는 대량의 데이터를 수집, 저장 및 분석하기 위한 강력한 플랫폼을 제공하는 오픈 소스 분산 검색 및 분석 엔진입니다.
+ Kibana는 OpenSearch와 함께 사용할 수 있는 오픈 소스 데이터 시각화 및 탐색 도구입니다. 시각화 및 분석 구현은이 패턴의 범위를 벗어납니다. 자세한 내용은 [Kibana 설명서](https://www.elastic.co/guide/en/kibana/current/index.html)와 기타 리소스를 참조하세요.

## 모범 사례
<a name="send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization-best-practices"></a>

Lambda Telemetry API를 OpenSearch와 통합할 때는 다음 모범 사례를 고려하세요.

**보안 및 액세스 제어**
+ **보안 통신**: HTTPS를 사용하여 Lambda 함수와 OpenSearch 클러스터 간의 모든 통신을 암호화합니다. Lambda 확장 및 OpenSearch 구성에서 필요한 SSL/TLS 설정을 구성합니다.
+ **IAM 권한**:
  + 확장은 Lambda 함수와 동일한 실행 환경에서 실행되므로 파일 시스템, 네트워킹 및 환경 변수와 같은 리소스에 대한 동일한 수준의 액세스를 상속합니다.
  + Lambda 텔레메트리 API에 액세스하고 OpenSearch 클러스터에 데이터를 쓰는 데 필요한 최소 IAM 권한을 Lambda 함수에 부여합니다. [최소 권한 원칙을](https://docs.aws.amazon.com/lambda/latest/operatorguide/least-privilege.html) 사용하여 권한 범위를 제한합니다.
+ **OpenSearch 액세스 제어**: OpenSearch 클러스터에서 세분화된 액세스 제어를 구현하여 민감한 데이터에 대한 액세스를 제한합니다. OpenSearch에서 사용자 인증, 역할 기반 액세스 제어 및 인덱스 수준 권한과 같은 기본 제공 보안 기능을 사용합니다.
+ **신뢰할 수 있는 확장:** 항상 신뢰할 수 있는 소스에서만 확장을 설치합니다. 와 같은 코드형 인프라(IaC) 도구를 사용하여 IAM 권한을 포함한 동일한 확장 구성을 여러 Lambda 함수에 연결하는 프로세스를 CloudFormation 간소화합니다. 또한 IaC 도구는 이전에 사용된 확장 및 버전에 대한 감사 레코드를 제공합니다.
+ **민감한 데이터 처리**: 확장을 구축할 때는 민감한 데이터를 로깅하지 마세요. 감사 목적으로 로깅하거나 유지하기 전에 페이로드와 메타데이터를 삭제합니다.

**비용 최적화**
+ **모니터링 및 알림**: 모니터링 및 알림 메커니즘을 설정하여 Lambda 함수에서 OpenSearch로 전송되는 데이터의 양을 추적합니다. 이렇게 하면 잠재적 비용 초과를 식별하고 해결하는 데 도움이 됩니다.
+ **데이터 보존**: OpenSearch에서 Lambda 원격 측정 데이터에 적절한 데이터 보존 기간을 신중하게 고려합니다. 보존 기간이 길수록 스토리지 비용이 증가할 수 있으므로 관찰성 니즈와 비용 최적화의 균형을 맞출 수 있습니다.
+ **압축 및 인덱싱**: 데이터 압축을 활성화하고 OpenSearch 인덱싱 전략을 최적화하여 Lambda 원격 측정 데이터의 스토리지 공간을 줄입니다.
+ **CloudWatch에 대한 의존도 감소**: Lambda 원격 측정 API를 OpenSearch와 직접 통합하면 CloudWatch Logs에 대한 의존도를 잠재적으로 줄여 비용을 절감할 수 있습니다. 이는 Lambda Telemetry API를 사용하면 로그를 OpenSearch로 직접 전송할 수 있으므로 CloudWatch에 데이터를 저장하고 처리할 필요가 없기 때문입니다.

**확장성 및 신뢰성**
+ **비동기 처리**: Amazon Simple Queue Service(Amazon SQS) 또는 Amazon Kinesis와 같은 비동기 처리 패턴을 사용하여 Lambda 함수 실행을 OpenSearch 데이터 수집에서 분리합니다. 이를 통해 Lambda 함수의 응답성을 유지하고 시스템의 전반적인 신뢰성을 개선할 수 있습니다.
+ **OpenSearch 클러스터 규모 조정**: OpenSearch 클러스터의 성능 및 리소스 사용률을 모니터링하고 필요에 따라 확장 또는 축소하여 증가하는 Lambda 원격 측정 데이터를 처리합니다.
+ **장애 조치 및 재해 복구**: 정기 백업과 장애 발생 시 데이터를 신속하게 복원하는 기능을 포함하여 OpenSearch 클러스터에 대한 강력한 재해 복구 전략을 구현합니다.

**관찰성 및 모니터링**
+ **대시보드 및 시각화**: Kibana 또는 기타 대시보드 도구를 사용하여 OpenSearch의 원격 측정 데이터를 기반으로 Lambda 함수의 성능 및 상태에 대한 인사이트를 제공하는 사용자 지정 대시보드 및 시각화를 생성합니다.
+ **알림 및 알림**: Lambda 함수의 이상, 오류 또는 성능 문제를 사전에 모니터링하도록 알림 및 알림을 설정합니다. 이러한 알림 및 알림을 기존 인시던트 관리 프로세스와 통합합니다.
+ **추적 및 상관관계**: Lambda 원격 측정 데이터에 요청 ID 또는 상관관계 IDs와 같은 관련 추적 정보가 포함되어 있는지 확인하여 분산 서버리스 애플리케이션에서 엔드 투 엔드 관찰성 및 문제 해결을 지원합니다.

이러한 모범 사례를 따르면 Lambda Telemetry API와 OpenSearch의 통합이 안전하고 비용 효율적이며 확장 가능하며 서버리스 애플리케이션에 대한 포괄적인 관찰성을 제공할 수 있습니다.

## 에픽
<a name="send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization-epics"></a>

### Lambda 확장 계층 빌드 및 배포
<a name="build-and-deploy-the-lam-extension-layer"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 소스 코드를 다운로드합니다. | 익스텐션 리포지토리에서 샘플 [AWS Lambda 익스텐션을 다운로드합니다](https://github.com/aws-samples/aws-lambda-extensions). | 앱 개발자, 클라우드 아키텍트 | 
| `python-example-telemetry-opensearch-extension` 폴더로 이동합니다. | 다운로드한 [AWS Lambda 확장](https://github.com/aws-samples/aws-lambda-extensions) 리포지토리에는 여러 사용 사례 및 언어 런타임에 대한 많은 예시가 포함되어 있습니다. [python-example-telemetry-opensearch-extension](https://github.com/aws-samples/aws-lambda-extensions/tree/main/python-example-telemetry-opensearch-extension) 폴더로 이동하여 OpenSearch로 로그를 전송하는 Python OpenSearch 확장을 사용합니다. | 앱 개발자, 클라우드 아키텍트 | 
| 확장 엔드포인트를 실행할 수 있는 권한을 추가합니다. | 다음 명령을 실행하여 확장 엔드포인트를 실행 가능하게 만듭니다.<pre>chmod +x python-example-telemetry-opensearch-extension/extension.py</pre> | 앱 개발자, 클라우드 아키텍트 | 
| 확장 종속 항목을 로컬에 설치합니다. | 다음 명령을 실행하여 Python 코드의 로컬 종속 항목을 설치합니다.<pre>pip3 install -r python-example-telemetry-opensearch-extension/requirements.txt -t ./python-example-telemetry-opensearch-extension/</pre>이러한 종속성은 확장 코드와 함께 마운트됩니다. | 앱 개발자, 클라우드 아키텍트 | 
| 확장을 위한 .zip 패키지를 생성하여 계층으로 배포합니다. | 확장 .zip 파일에는 확장 실행 파일이 `extensions/`있는 라는 루트 디렉터리와 확장의 코어 로직과 해당 종속성이 `python-example-telemetry-opensearch-extension/`있는 라는 또 다른 루트 디렉터리가 포함되어야 합니다.확장을 위한 .zip 패키지를 생성합니다.<pre>chmod +x extensions/python-example-telemetry-opensearch-extension<br />zip -r extension.zip extensions python-example-telemetry-opensearch-extension</pre> | 앱 개발자, 클라우드 아키텍트 | 
| 확장을 Lambda 계층으로 배포합니다. | 확장 .zip 파일과 다음 명령을 사용하여 계층을 게시합니다.<pre>aws lambda publish-layer-version \<br />--layer-name "python-example-telemetry-opensearch-extension" \<br />--zip-file "fileb://extension.zip"</pre> | 앱 개발자, 클라우드 아키텍트 | 

### 확장을 함수에 통합
<a name="integrate-the-extension-into-your-function"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 함수에 계층을 추가합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization.html)Lambda 함수에 계층을 추가하는 데 대한 자세한 내용은 [Lambda 설명서](https://docs.aws.amazon.com/lambda/latest/dg/adding-layers.html)를 참조하십시오. | 앱 개발자, 클라우드 아키텍트 | 
| 함수의 환경 변수를 설정합니다. | 함수 페이지에서 **구성** 탭을 선택하고 함수에 다음 환경 변수를 추가합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization.html) | 앱 개발자, 클라우드 아키텍트 | 

### 로깅 문 추가 및 함수 테스트
<a name="add-logging-statements-and-test-your-function"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 함수에 로깅 문을 추가합니다. | [기본 제공 로깅 메커니즘 중 하나](https://docs.aws.amazon.com/lambda/latest/dg/python-logging.html) 또는 선택한 로깅 모듈을 사용하여 함수에 로깅 문을 추가합니다.다음은 Python에서 메시지를 로깅하는 예입니다.<pre>print("Your Log Message Here")<br />logger = logging.getLogger(__name__)<br /><br />logger.info("Test Info Log.")<br />logger.error("Test Error Log.")</pre> | 앱 개발자, 클라우드 아키텍트 | 
|  함수를 테스트합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization.html)모든 것이 제대로 작동하면 **함수 실행: 성공이** 표시됩니다. | 앱 개발자, 클라우드 아키텍트 | 

### OpenSearch에서 로그 보기
<a name="view-your-logs-in-opensearch"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 인덱스를 쿼리합니다. | OpenSearch에서 다음 명령을 실행하여 인덱스를 쿼리합니다.<pre>SELECT * FROM index-name</pre>쿼리 결과에 로그가 표시되어야 합니다. | 클라우드 아키텍트 | 

## 문제 해결
<a name="send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization-troubleshooting"></a>


| 문제 | Solution | 
| --- | --- | 
| 연결 문제 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization.html) | 
| 데이터 수집 오류 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization.html) | 

## 관련 리소스
<a name="send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization-resources"></a>
+ [OpenSearch용 Lambda 텔레메트리 통합 예](https://github.com/aws-samples/aws-lambda-extensions/tree/main/python-example-telemetry-opensearch-extension)(GitHub 리포지토리)
+ [Lambda 확장을 사용하여 Lambda 함수 보강](https://docs.aws.amazon.com/lambda/latest/dg/lambda-extensions.html)(Lambda 설명서)
+ [Lambda Telemetry API](https://docs.aws.amazon.com/lambda/latest/dg/telemetry-api.html)(Lambda 설명서)
+ [AWS Lambda Telemetry API 소개](https://aws.amazon.com/blogs/compute/introducing-the-aws-lambda-telemetry-api/)(AWS 블로그 게시물)
+ [AWS Lambda Telemetry API를 Prometheus 및 OpenSearch와 통합](https://aws.amazon.com/blogs/opensource/integrating-the-aws-lambda-telemetry-api-with-prometheus-and-opensearch)(AWS 블로그 게시물)

## 추가 정보
<a name="send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization-additional"></a>

**로그 구조 변경**

확장은 기본적으로 로그를 중첩 문서로 OpenSearch에 전송합니다. 이렇게 하면 중첩 쿼리를 수행하여 개별 열 값을 검색할 수 있습니다.

기본 로그 출력이 특정 요구 사항을 충족하지 않는 경우에서 제공하는 Lambda 확장의 소스 코드를 수정하여 사용자 지정할 수 있습니다 AWS.는 고객에게 비즈니스 요구 사항에 맞게 출력을 조정하도록 AWS 권장합니다. 로그 출력을 변경하려면 확장의 소스 코드 내의 `telemetry_dispatcher.py` 파일에서 `dispatch_to_opensearch` 함수를 찾아 필요한 변경을 수행합니다.

# 셀 기반 아키텍처를 위한 서버리스 셀 라우터 설정
<a name="serverless-cell-router-architecture"></a>

*Mian Tariq 및 Ioannis Lioupras, Amazon Web Services*

## 요약
<a name="serverless-cell-router-architecture-summary"></a>

글로벌 셀 기반 애플리케이션의 시스템을 진입점으로 하는 셀 라우터는 사용자를 적절한 셀에 효율적으로 할당하고 사용자에게 엔드포인트를 제공하는 역할을 합니다. 셀 라우터는 user-to-cell 매핑 저장, 셀 용량 모니터링, 필요한 경우 새 셀 요청과 같은 기능을 처리합니다. 잠재적 중단 시 셀-라우터 기능을 유지하는 것이 중요합니다.

이 패턴의 셀-라우터 설계 프레임워크는 복원력, 확장성 및 전반적인 성능 최적화에 중점을 둡니다. 이 패턴은 클라이언트가 초기 로그인 시 엔드포인트를 캐시하고 셀과 직접 통신하는 정적 라우팅을 사용합니다. 이 분리는 셀-라우터 장애 발생 시 셀 기반 애플리케이션의 중단 없는 기능을 보장하여 시스템 복원력을 향상시킵니다.

이 패턴은 AWS CloudFormation 템플릿을 사용하여 아키텍처를 배포합니다. 템플릿 배포에 대한 자세한 내용이나를 사용하여 동일한 구성을 배포하려면 [추가 정보](#serverless-cell-router-architecture-additional) 섹션을 AWS Management Console참조하세요.

**중요**  
이 패턴에 제시된 데모, 코드 및 CloudFormation 템플릿은 설명 목적으로만 사용됩니다. 제공된 재료는 디자인 패턴을 설명하고 이해를 돕기 위한 목적으로만 사용됩니다. 데모 및 코드는 프로덕션에 사용할 수 없으며 라이브 프로덕션 활동에 사용해서는 안 됩니다. 프로덕션 환경에서 코드 또는 데모를 사용하려는 모든 시도는 권장되지 않으며 사용자가 리스크를 감수해야 합니다. 프로덕션 환경에서이 패턴 또는 해당 구성 요소를 구현하기 전에 적절한 전문가와 상의하고 철저한 테스트를 수행하는 것이 좋습니다.

## 사전 조건 및 제한 사항
<a name="serverless-cell-router-architecture-prereqs"></a>

**사전 조건 **
+ 활성 Amazon Web Services(AWS) 계정
+ [AWS Command Line Interface (AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html))의 최신 버전
+  CloudFormation 스택, AWS Lambda 함수 및 관련 리소스를 생성하는 데 필요한 권한이 있는 [AWS 자격 증명](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html) 

**제품 버전**
+ Python 3.12

## 아키텍처
<a name="serverless-cell-router-architecture-architecture"></a>

다음 다이어그램은 셀 라우터의 상위 수준 설계를 보여줍니다.

![\[셀 라우터의 5단계 프로세스입니다.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/fd2fbf9d-9ae4-4c27-bc32-cf117350137a/images/feb90b51-dd91-483b-b5a3-b0a5359686e3.png)


이 다이어그램은 다음 워크플로를 단계별로 보여줍니다.

1. 사용자는 셀-라우터 API 엔드포인트의 전면 역할을 하는 Amazon API Gateway에 문의합니다.

1. Amazon Cognito는 인증 및 권한 부여를 처리합니다.

1.  AWS Step Functions 워크플로는 다음 구성 요소로 구성됩니다.
   + **오케스트레이터** ‒는 AWS Step Functions 를 `Orchestrator` 사용하여 워크플로 또는 상태 시스템을 생성합니다. 워크플로는 셀 라우터 API에 의해 트리거됩니다. 는 리소스 경로를 기반으로 Lambda 함수를 `Orchestrator` 실행합니다.
   + **디스패처** ‒ `Dispatcher` Lambda 함수는 등록된 새 사용자당 하나의 정적 셀을 식별하고 할당합니다. 함수는 사용자 수가 가장 적은 셀을 검색하여 사용자에게 할당하고 엔드포인트를 반환합니다.
   + **매퍼** ‒ `Mapper` 작업은 CloudFormation 템플릿에 의해 생성된 `RoutingDB` Amazon DynamoDB 데이터베이스 내의 user-to-cell 매핑을 처리합니다. 트리거되면 `Mapper` 함수는 이미 할당된 사용자에게 엔드포인트를 제공합니다.
   + **Scaler** ‒ `Scaler` 함수는 셀 점유율과 사용 가능한 용량을 추적합니다. 필요한 경우 `Scaler` 함수는 Amazon Simple Queue Service(Amazon SQS)를 통해 프로비저닝 및 배포 계층으로 요청을 보내 새 셀을 요청할 수 있습니다.
   + **검사기** ‒ `Validator` 함수는 셀 엔드포인트를 검증하고 잠재적 문제를 감지합니다.

1. 는 셀 정보 및 속성(API 엔드포인트, AWS 리전상태, 지표)을 `RoutingDB` 저장합니다.

1. 셀의 사용 가능한 용량이 임계값을 초과하면 셀 라우터는 Amazon SQS를 통해 프로비저닝 및 배포 서비스를 요청하여 새 셀을 생성합니다.

새 셀이 생성되면 `RoutingDB`가 프로비저닝 및 배포 계층에서 업데이트됩니다. 그러나이 프로세스는이 패턴의 범위를 벗어납니다. 셀 기반 아키텍처 설계 온프레미스에 대한 개요와이 패턴에 사용되는 셀-라우터 설계에 대한 자세한 내용은 [추가 정보](#serverless-cell-router-architecture-additional) 섹션을 참조하세요.

## 도구
<a name="serverless-cell-router-architecture-tools"></a>

**AWS 서비스**
+ [Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html)는 규모와 관계없이 REST, HTTP 및 WebSocket API를 생성, 게시, 유지 관리, 모니터링 및 보호하는 것을 지원합니다.
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)를 사용하면 AWS 리소스를 설정하고, 빠르고 일관되게 프로비저닝하고, AWS 계정 및의 수명 주기 동안 리소스를 관리할 수 있습니다 AWS 리전.
+ [Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html)는 웹 및 모바일 앱에 대한 인증, 권한 부여 및 사용자 관리를 제공합니다.
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html)는 빠르고 예측 가능하고 확장 가능한 성능을 제공하는 완전 관리형 NoSQL 데이터베이스 서비스입니다.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)는 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행하는 데 도움이 되는 컴퓨팅 서비스입니다. 필요할 때만 코드를 실행하며 자동으로 확장이 가능하므로 사용한 컴퓨팅 시간만큼만 비용을 지불합니다.
+ [Amazon Simple Storage Service(Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)는 원하는 양의 데이터를 저장, 보호 및 검색하는 데 도움이 되는 클라우드 기반 객체 스토리지 서비스입니다.
+ [Amazon Simple Queue Service(Amazon SQS)](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html)는 내구력 있고 가용성이 뛰어난 보안 호스팅 대기열을 제공하며 이를 통해 분산 소프트웨어 시스템과 구성 요소를 통합 및 분리할 수 있습니다.
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html)는 Lambda 함수 및 기타를 결합하여 비즈니스 크리티컬 애플리케이션을 구축하는 AWS 서비스 데 도움이 되는 서버리스 오케스트레이션 서비스입니다.

**기타 도구**
+ [Python](https://www.python.org/)은 범용 컴퓨터 프로그래밍 언어입니다.

**코드 리포지토리**

이 패턴의 코드는 GitHub [Serverless-Cell-Router](https://github.com/aws-samples/Serverless-Cell-Router/) 리포지토리에서 확인할 수 있습니다.

## 모범 사례
<a name="serverless-cell-router-architecture-best-practices"></a>

셀 기반 아키텍처를 빌드할 때 모범 사례는 다음 AWS Well-Architected 지침을 참조하세요.
+ [셀 기반 아키텍처를 사용하여 영향 범위 축소](https://docs.aws.amazon.com/wellarchitected/latest/reducing-scope-of-impact-with-cell-based-architecture/reducing-scope-of-impact-with-cell-based-architecture.html)
+ [AWS Well-Architected Framework 신뢰성 원칙: REL10-BP04 벌크헤드 아키텍처를 사용하여 영향 범위 제한](https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/rel_fault_isolation_use_bulkhead.html)

## 에픽
<a name="serverless-cell-router-architecture-epics"></a>

### 소스 파일 준비
<a name="prepare-source-files"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 코드 예시 리포지토리를 복제합니다. | Serverless-Cell-Router GitHub 리포지토리를 컴퓨터에 복제하려면 다음 명령을 사용합니다.<pre>git clone https://github.com/aws-samples/Serverless-Cell-Router/</pre> | 개발자 | 
|  AWS CLI 임시 자격 증명을 설정합니다. | 에 대한 자격 증명을 AWS CLI 사용하여를 구성합니다 AWS 계정. 이 연습에서는 AWS IAM Identity Center **명령줄 또는 프로그래밍 방식 액세스** 옵션에서 제공하는 임시 자격 증명을 사용합니다. 그러면 `AWS_ACCESS_KEY_ID`와 함께 사용할 적절한 자격 증명으로 `AWS_SECRET_ACCESS_KEY`, 및 `AWS_SESSION_TOKEN` AWS 환경 변수가 설정됩니다 AWS CLI. | 개발자 | 
| S3 버킷을 생성합니다. |  CloudFormation 템플릿으로 배포할 Serverless-Cell-Router Lambda 함수를 저장하고 액세스하는 데 사용할 S3 버킷을 생성합니다. S3 버킷을 생성하려면 다음 명령을 사용합니다.<pre>aws s3api create-bucket --bucket <bucket name> --region eu-central-1 --create-bucket-configuration LocationConstraint=eu-central-1</pre> | 개발자 | 
| .zip 파일을 만듭니다. | [함수](https://github.com/aws-samples/Serverless-Cell-Router/tree/main/Functions) 디렉터리에 있는 각 Lambda 함수에 대해 하나의 .zip 파일을 생성합니다. 이러한 .zip 파일은 Lambda 함수를 배포하는 데 사용됩니다. Mac에서는 다음 `zip` 명령을 사용합니다.<pre>zip -j mapper-scr.zip Functions/Mapper.py<br />zip -j dispatcher-scr.zip Functions/Dispatcher.py<br />zip -j scaler-scr.zip Functions/Scaler.py<br />zip -j cp validator-scr.zip Functions/Validator.py<br />zip -j dynamodbDummyData-scr.zip Functions/DynamodbDummyData.py</pre> | 개발자 | 
| .zip 파일을 S3 버킷에 복사합니다. | 모든 Lambda 함수 .zip 파일을 S3 버킷에 복사하려면 다음 명령을 사용합니다.<pre>aws s3 cp mapper-scr.zip s3://<bucket name><br />aws s3 cp dispatcher-scr.zip s3://<bucket name><br />aws s3 cp scaler-scr.zip s3://<bucket name><br />aws s3 cp validator-scr.zip s3://<bucket name><br />aws s3 cp dynamodbDummyData-scr.zip s3://<bucket name></pre> | 개발자 | 

### CloudFormation 스택 생성
<a name="create-the-cfn-stack"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
|  CloudFormation 템플릿을 배포합니다. |  CloudFormation 템플릿을 배포하려면 다음 AWS CLI 명령을 실행합니다.<pre>aws cloudformation create-stack --stack-name serverless.cell-router \<br />--template-body file://Serverless-Cell-Router-Stack-v10.yaml \<br />--capabilities CAPABILITY_IAM \<br />--parameters ParameterKey=LambdaFunctionMapperS3KeyParameterSCR,ParameterValue=mapper-scr.zip \<br />ParameterKey=LambdaFunctionDispatcherS3KeyParameterSCR,ParameterValue=dispatcher-scr.zip \<br />ParameterKey=LambdaFunctionScalerS3KeyParameterSCR,ParameterValue=scaler-scr.zip \<br />ParameterKey=LambdaFunctionAddDynamoDBDummyItemsS3KeyParameterSCR,ParameterValue=dynamodbDummyData-scr.zip \<br />ParameterKey=LambdaFunctionsS3BucketParameterSCR,ParameterValue=<S3 bucket storing lambda zip files> \<br />ParameterKey=CognitoDomain,ParameterValue=<Cognito Domain Name> \<br />--region <enter your aws region id, e.g. "eu-central-1"></pre> | 개발자 | 
| 진행 상황을 확인합니다. | 에 로그인하고 AWS Management Console[https://console.aws.amazon.com/cloudformation/]() CloudFormation 콘솔을 열고 스택 개발 진행 상황을 확인합니다. 상태가 `CREATE_COMPLETE`이면 스택이 성공적으로 배포된 것입니다. | 개발자 | 

### 평가 및 확인
<a name="assess-and-verify"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 사용자에게 셀을 할당합니다. | 를 시작하려면 다음 curl 명령을 `Orchestrator`실행합니다.<pre>curl -X POST \<br />-H "Authorization: Bearer {User id_token}" \<br />https://xxxxxx.execute-api.eu-central-1.amazonaws.com/Cell_Router_Development/cells</pre>는 `Dispatcher` 함수의 실행을 `Orchestrator` 트리거합니다. 는 `Dispatcher`사용자의 존재를 확인합니다. 사용자를 찾은 경우는 연결된 셀 ID 및 엔드포인트 URL을 `Dispatcher` 반환합니다. 사용자를 찾을 수 없는 경우는 사용자에게 셀을 `Dispatcher` 할당하고 할당된 셀의 잔여 용량을 평가하기 위해 셀 ID를 `Scaler` 함수로 보냅니다.`Scaler` 함수의 응답은 다음과 같습니다.`"cellID : cell-0002 , endPoint_1 : https://xxxxx.execute-api.eu-north-1.amazonaws.com/ , endPoint_2 : https://xxxxxxx.execute-api.eu-central-1.amazonaws.com/"` | 개발자 | 
| 사용자 셀을 검색합니다. | `Orchestrator`를 사용하여 `Mapper` 함수를 실행하려면 다음 명령을 실행합니다.<pre>curl -X POST \<br />-H "Authorization: Bearer {User id_token}" \<br />https://xxxxxxxxx.execute-api.eu-central-1.amazonaws.com/Cell_Router_Development/mapper</pre>는 사용자에게 할당된 셀을 `Orchestrator` 검색하고 다음 응답에서 셀 ID와 URL을 반환합니다.`"cellID : cell-0002 , endPoint_1 : https://xxxxx.execute-api.eu-north-1.amazonaws.com/ , endPoint_2 : https://xxxxxxx.execute-api.eu-central-1.amazonaws.com/"` | 개발자 | 

### 정리
<a name="clean-up"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 리소스를 정리합니다. | 계정에 추가 요금이 발생하지 않도록 하려면 다음을 수행합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/serverless-cell-router-architecture.html) | 앱 개발자 | 

## 관련 리소스
<a name="serverless-cell-router-architecture-resources"></a>

**참조**
+ [가용 영역을 사용한 정적 안정성](https://aws.amazon.com/builders-library/static-stability-using-availability-zones/)
+ [AWS 장애 격리 경계: 정적 안정성](https://docs.aws.amazon.com/whitepapers/latest/aws-fault-isolation-boundaries/static-stability.html)

**동영상**

[Physalia: Amazon EBS에서 더 높은 가용성을 제공하는 셀 기반 아키텍처](https://www.youtube.com/watch?v=6IknqRZMFic) 




[https://www.youtube-nocookie.com/embed/6IknqRZMFic?controls=0](https://www.youtube-nocookie.com/embed/6IknqRZMFic?controls=0)

## 추가 정보
<a name="serverless-cell-router-architecture-additional"></a>

**셀 기반 아키텍처 설계 온프레미스**

이 패턴은 셀 라우터에 초점을 맞추지만 전체 환경을 이해하는 것이 중요합니다. 환경은 세 개의 개별 계층으로 구성됩니다.
+ 셀 라우터가 포함된 라우팅 계층 또는 씬 계층
+ 다양한 셀로 구성된 셀 계층
+ 셀을 프로비저닝하고 애플리케이션을 배포하는 프로비저닝 및 배포 계층

각 계층은 다른 계층에 영향을 미치는 장애가 있는 경우에도 기능을 유지합니다.를 장애 격리 경계로 AWS 계정 사용합니다.

다음 다이어그램은 상위 수준의 계층을 보여줍니다. 셀 계층과 프로비저닝 및 배포 계층은이 패턴의 범위를 벗어납니다.

![\[라우팅 계층, 여러 셀 계정이 있는 셀 계층, 프로비저닝 및 배포 계층.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/fd2fbf9d-9ae4-4c27-bc32-cf117350137a/images/137ac34d-43c3-42b6-95de-a365ff611ce8.png)


셀 기반 아키텍처에 대한 자세한 내용은 [셀 기반 아키텍처로 영향 범위 줄이기: 셀 라우팅을 참조하세요](https://docs.aws.amazon.com/wellarchitected/latest/reducing-scope-of-impact-with-cell-based-architecture/cell-routing.html).

**셀-라우터 설계 패턴**

셀 라우터는 셀 간에 공유되는 구성 요소입니다. 잠재적 영향을 완화하려면 라우팅 계층이 최대한 얇은 단순하고 수평적으로 확장 가능한 설계를 사용하는 것이 중요합니다. 시스템의 진입점 역할을 하는 라우팅 계층은 사용자를 적절한 셀에 효율적으로 할당하는 데 필요한 구성 요소로만 구성됩니다. 이 계층 내의 구성 요소는 셀 관리 또는 생성에 관여하지 않습니다.

이 패턴은 정적 라우팅을 사용합니다. 즉, 클라이언트는 초기 로그인 시 엔드포인트를 캐싱한 다음 셀과 직접 통신을 설정합니다. 클라이언트와 셀 라우터 간의 주기적 상호 작용이 시작되어 현재 상태를 확인하거나 업데이트를 검색합니다. 이 의도적인 분리는 셀-라우터 가동 중지 시 기존 사용자에게 중단 없는 작업을 가능하게 하며 시스템 내에서 지속적인 기능과 복원력을 제공합니다.

이 패턴에서 셀 라우터는 다음 기능을 지원합니다.
+ 프로비저닝 및 배포 계층의 셀 데이터베이스에서 셀 데이터를 검색하고 로컬 데이터베이스를 저장하거나 업데이트합니다.
+ 셀 할당 알고리즘을 사용하여 애플리케이션의 새로 등록된 각 사용자에게 셀을 할당합니다.
+ 로컬 데이터베이스에 user-to-cells 매핑 저장.
+ 사용자 할당 중에 셀의 용량을 확인하고 벤딩 머신의 이벤트를 프로비저닝 및 배포 계층으로 높여 셀을 생성합니다.
+ 셀 생성 기준 알고리즘을 사용하여이 기능을 제공합니다.
+ 정적 셀의 URL을 제공하여 새로 등록된 사용자 요청에 응답합니다. 이러한 URL은 TTL(Time To Live)을 사용하여 클라이언트에 캐싱됩니다.
+ 새 URL 또는 업데이트된 URL을 제공하여 잘못된 URL의 기존 사용자 요청에 응답합니다.

 CloudFormation 템플릿에 의해 설정된 데모 셀 라우터를 자세히 이해하려면 다음 구성 요소 및 단계를 검토하세요.

1. Amazon Cognito 사용자 풀을 설정하고 구성합니다.

1. 셀 라우터에 대한 API Gateway API를 설정하고 구성합니다.

1. DynamoDB 테이블을 생성합니다.

1. SQS 대기열을 생성하고 구성합니다.

1. `Orchestrator`를 구현합니다.

1. Lambda 함수 `Dispatcher`, `Scaler`, `Mapper`,를 구현합니다`Validator`.

1. 를 평가하고 확인합니다.

사전 가정은 프로비저닝 및 배포 계층이 이미 설정되어 있다는 것입니다. 구현 세부 정보는이 아티팩트의 범위를 벗어납니다.

이러한 구성 요소는 CloudFormation 템플릿에 의해 설정 및 구성되므로 다음 단계는 설명적이고 높은 수준으로 표시됩니다. 설정 및 구성을 완료하는 데 필요한 AWS 기술이 있다고 가정합니다.

*1: Amazon Cognito 사용자 풀을 설정 및 구성*

에 로그인 AWS Management Console하고 [https://console.aws.amazon.com/cognito/]() Amazon Cognito 콘솔을 엽니다. 앱 통합`CellRouterPool`, 호스팅 UI 및 필요한 권한을 사용하여 라는 Amazon Cognito 사용자 풀을 설정하고 구성합니다.

*2. 셀 라우터에 대한 API Gateway API 설정 및 구성*

[https://console.aws.amazon.com/apigateway/]()에서 Amazon API Gateway 콘솔을 엽니다. Amazon Cognito 사용자 풀와 통합된 Amazon Cognito 권한 부여자를 `CellRouter`사용하여 라는 API를 설정하고 구성합니다`CellRouterPool`. 다음 요소를 구현합니다.
+ `CellRouter` `POST` 메서드를 포함한 API 리소스
+ 5단계에서 구현된 Step Functions 워크플로와 통합
+ Amazon Cognito 권한 부여자를 통한 권한 부여
+ 통합 요청 및 응답 매핑
+ 필요한 권한 할당

*3. DynamoDB 테이블 생성*

[https://console.aws.amazon.com/dynamodb/]() DynamoDB 콘솔을 열고 다음 구성으로 라는 표준 DynamoDB 테이블`tbl_router`을 생성합니다.
+ **파티션 키** - `marketId`
+ **정렬 키** - `cellId`
+ **용량 모드** - 프로비저닝됨
+ **시점 복구(PITR)** - 끔

**인덱스** 탭에서 라는 글로벌 보조 인덱스를 생성합니다`marketId-currentCapacity-index`. `Scaler` Lambda 함수는 인덱스를 사용하여 할당된 사용자 수가 가장 적은 셀을 효율적으로 검색합니다.

다음 속성을 사용하여 테이블 구조를 생성합니다.
+ `marketId` - 유럽
+ `cellId` ‒ cell-0002
+ `currentCapacity` ‒ 2
+ `endPoint_1` ‒ <첫 번째 리전의 엔드포인트>
+ `endPoint_2` ‒ <두 번째 리전의 엔드포인트>
+ `IsHealthy` ‒ True
+ `maxCapacity` ‒ 10
+ `regionCode_1` ‒ `eu-north-1`
+ `regionCode_2` ‒ `eu-central-1`
+ `userIds` ‒ <이메일 주소>

*4. SQS 대기열 생성 및 구성*

[https://console.aws.amazon.com/sqs/]() Amazon SQS 콘솔을 열고 Amazon SQS 키 암호화로 `CellProvisioning` 구성된 라는 표준 SQS 대기열을 생성합니다. **Amazon SQS ** 

*5. 오케스트레이터 구현*

Step Functions 워크플로를 개발하여 라우터의 `Orchestrator` 로 사용합니다. 워크플로는 셀 라우터 API를 통해 직접 호출할 수 있습니다. 워크플로는 리소스 경로를 기반으로 지정된 Lambda 함수를 실행합니다. 단계 함수를 셀 라우터 `CellRouter`용 API Gateway API와 통합하고 Lambda 함수를 간접적으로 호출하는 데 필요한 권한을 구성합니다.

다음 다이어그램은 워크플로를 보여줍니다. 선택 상태는 Lambda 함수 중 하나입니다. Lambda 함수가 성공하면 워크플로가 종료됩니다. Lambda 함수가 실패하면 실패 상태가 직접적으로 호출됩니다.

![\[4개의 함수가 있고 실패 상태로 끝나는 워크플로의 다이어그램입니다.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/fd2fbf9d-9ae4-4c27-bc32-cf117350137a/images/cfe8d029-6f30-49a1-aaad-cad503bdcbae.png)


*6. Lambda 함수 구현*

`Dispatcher`, `Mapper``Scaler`, 및 `Validator` 함수를 구현합니다. 데모에서 각 함수를 설정하고 구성할 때 함수에 대한 역할을 정의하고 DynamoDB 테이블에서 필요한 작업을 수행하는 데 필요한 권한을 할당합니다`tbl_router`. 또한 각 함수를 워크플로에 통합합니다`Orchestrator`.

*디스패처 함수*

`Dispatcher` 함수는 새로 등록된 각 사용자에 대해 단일 정적 셀을 식별하고 할당하는 역할을 합니다. 새 사용자가 글로벌 애플리케이션에 등록하면 요청이 `Dispatcher` 함수로 이동합니다. 함수는 다음과 같은 사전 정의된 평가 기준을 사용하여 요청을 처리합니다.

1. **리전** ‒ 사용자가 위치한 시장에서 셀을 선택합니다. 예를 들어 사용자가 유럽에서 글로벌 애플리케이션에 액세스하는 경우 유럽 AWS 리전 에서를 사용하는 셀을 선택합니다.

1. **근접성 또는 지연** 시간 ‒ 사용자와 가장 가까운 셀 선택 예를 들어 사용자가 네덜란드에서 애플리케이션에 액세스하는 경우 함수는 프랑크푸르트와 아일랜드를 사용하는 셀을 고려합니다. 가장 가까운 셀에 대한 결정은 사용자 위치와 셀 리전 간의 지연 시간과 같은 지표를 기반으로 합니다. 이 예시 패턴의 경우 정보는 프로비저닝 및 배포 계층에서 정적으로 공급됩니다.

1. **상태** ‒ `Dispatcher` 함수는 제공된 셀 상태(정상 = true 또는 false)를 기반으로 선택한 셀이 정상인지 확인합니다.

1. **용량** ‒ 사용자 배포는 *셀 로직의 최소 사용자 수를* 기반으로 하므로 사용자는 사용자 수가 가장 적은 셀에 할당됩니다.

**참고**  
이러한 기준은이 예시 패턴만 설명하기 위해 제공됩니다. 실제 셀-라우터 구현의 경우 보다 세분화된 사용 사례 기반 기준을 정의할 수 있습니다.

`Orchestrator`는 Dispatcher 함수를 간접적으로 호출하여 셀에 사용자를 할당합니다. 이 데모 함수에서 시장 가치는 로 정의된 정적 파라미터입니다`europe`.

`Dispatcher` 함수는 셀이 이미 사용자에게 할당되었는지 여부를 평가합니다. 셀이 이미 할당된 경우 `Dispatcher` 함수는 셀의 엔드포인트를 반환합니다. 사용자에게 할당된 셀이 없는 경우 함수는 사용자 수가 가장 적은 셀을 검색하여 사용자에게 할당하고 엔드포인트를 반환합니다. 셀 검색 쿼리의 효율성은 글로벌 보조 인덱스를 사용하여 최적화됩니다.

*매퍼 함수*

`Mapper` 함수는 데이터베이스에서 user-to-cell 매핑의 저장 및 유지 관리를 감독합니다. 등록된 각 사용자에게 단일 셀이 할당됩니다. 각 셀에는 AWS 리전마다 하나씩 두 개의 고유한 URL이 있습니다. API Gateway에서 호스팅되는 API 엔드포인트 역할을 하는 이러한 URL은 글로벌 애플리케이션에 대한 인바운드 포인트 역할을 합니다.

`Mapper` 함수는 클라이언트 애플리케이션으로부터 요청을 수신하면 DynamoDB 테이블에서 쿼리를 실행`tbl_router`하여 제공된 이메일 ID와 연결된 user-to-cell 매핑을 검색합니다. 할당된 셀을 찾으면 `Mapper` 함수는 셀의 두 URL을 즉시 제공합니다. 또한이 `Mapper` 함수는 셀 URL의 변경을 능동적으로 모니터링하고 사용자 설정에 대한 알림 또는 업데이트를 시작합니다.

*Scaler 함수*

`Scaler` 함수는 셀의 잔여 용량을 관리합니다. 각 새 사용자 등록 요청에 대해 `Scaler` 함수는 `Dispatcher` 함수가 사용자에게 할당한 셀의 사용 가능한 용량을 평가합니다. 셀이 지정된 평가 기준에 따라 미리 결정된 한도에 도달한 경우 함수는 Amazon SQS 대기열을 통해 프로비저닝 및 배포 계층으로 요청을 시작하여 새 셀의 프로비저닝 및 배포를 요청합니다. 셀 크기 조정은 다음과 같은 평가 기준 세트를 기반으로 실행할 수 있습니다.

1. **최대 사용자** ‒ 각 셀에는 최대 500명의 사용자가 있을 수 있습니다.

1. **버퍼 용량** ‒ 각 셀의 버퍼 용량은 20%입니다. 즉, 각 셀을 언제든지 400명의 사용자에게 할당할 수 있습니다. 나머지 20% 버퍼 용량은 향후 사용 사례 및 예상치 못한 시나리오(예: 셀 생성 및 프로비저닝 서비스를 사용할 수 없는 경우) 처리를 위해 예약되어 있습니다.

1. **셀 생성** ‒ 기존 셀이 용량의 70%에 도달하면 요청이 트리거되어 추가 셀을 생성합니다.

**참고**  
이러한 기준은이 예시 패턴만 설명하기 위해 제공됩니다. 실제 셀-라우터 구현의 경우 보다 세분화된 사용 사례 기반 기준을 정의할 수 있습니다.

데모 `Scaler` 코드는가 새로 등록된 사용자에게 셀을 `Dispatcher` 성공적으로 할당한 `Orchestrator` 후에서 실행됩니다. 는에서 셀 ID를 `Scaler`받으면 미리 정의된 `Dispatcher`평가 기준에 따라 지정된 셀에 추가 사용자를 수용할 수 있는 적절한 용량이 있는지 평가합니다. 셀의 용량이 충분하지 않으면 `Scaler` 함수가 Amazon SQS 서비스에 메시지를 전달합니다. 이 메시지는 프로비저닝 및 배포 계층 내의 서비스에서 검색되어 새 셀의 프로비저닝을 시작합니다.

**Validator 함수**

`Validator` 함수는 셀 액세스와 관련된 문제를 식별하고 해결합니다. 사용자가 글로벌 애플리케이션에 로그인하면 애플리케이션은 사용자 프로필 설정에서 셀의 URL을 검색하고 셀 내에 할당된 두 리전 중 하나로 사용자 요청을 라우팅합니다. URL에 액세스할 수 없는 경우 애플리케이션은 셀 라우터에 유효한 URL 요청을 디스패치할 수 있습니다. cell-router `Orchestrator`는 `Validator`를 간접적으로 호출합니다. 는 검증 프로세스를 `Validator` 시작합니다. 검증에는 특히 다음이 포함될 수 있습니다.
+ 잠재적 업데이트를 식별하고 처리하기 위해 데이터베이스에 저장된 URL을 사용하여 요청의 셀 URLs 교차 참조
+ 심층 상태 확인 실행(예: 셀의 엔드포인트에 대한 `HTTP GET` 요청)

결과적으로 `Validator` 함수는 클라이언트 애플리케이션 요청에 대한 응답을 제공하고 필요한 수정 단계와 함께 검증 상태를 제공합니다.

`Validator`는 사용자 경험을 개선하도록 설계되었습니다. 인시던트로 인해 셀을 일시적으로 사용할 수 없기 때문에 특정 사용자가 글로벌 애플리케이션에 액세스하는 데 어려움을 겪는 시나리오를 생각해 보세요. `Validator` 함수는 일반적인 오류를 표시하는 대신 지시적인 문제 해결 단계를 제공할 수 있습니다. 이러한 단계에는 다음과 같은 작업이 포함됩니다.
+ 사용자에게 인시던트에 대해 알립니다.
+ 서비스 가용성 전에 대략적인 대기 시간을 제공합니다.
+ 추가 정보를 얻기 위한 지원 연락처 번호를 제공합니다.

`Validator` 함수의 데모 코드는 요청의 사용자 제공 셀 URL이 `tbl_router` 테이블에 저장된 레코드와 일치하는지 확인합니다. 또한이 `Validator` 함수는 셀이 정상인지 여부를 확인합니다.

# VPC 엔드포인트를 통해 Amazon S3 버킷에 대한 프라이빗 액세스 설정
<a name="set-up-private-access-to-an-amazon-s3-bucket-through-a-vpc-endpoint"></a>

*Martin Maritsch, Nicolas Jacob Baer, Gabriel Rodriguez Garcia, Shukhrat Khodjaev, Mohan Gowda Purushothama, Joaquin Rinaudo, Amazon Web Services*

## 요약
<a name="set-up-private-access-to-an-amazon-s3-bucket-through-a-vpc-endpoint-summary"></a>

Amazon Simple Storage Service(Amazon S3)에서 미리 서명된 URL을 사용하면 원하는 크기의 파일을 대상 사용자와 공유할 수 있습니다. 기본적으로 Amazon S3 미리 서명된 URL은 만료 기간 내에 인터넷에서 액세스할 수 있으므로 사용이 편리합니다. 그러나 기업 환경에서는 프라이빗 네트워크로만 제한하기 위해 Amazon S3 미리 서명된 URL에 대한 액세스가 필요한 경우가 많습니다.

이 패턴은 인터넷 순회 없이 프라이빗 네트워크의 미리 서명된 URL을 사용하여 S3 객체와 안전하게 상호 작용할 수 있는 서버리스 솔루션을 제공합니다. 아키텍처에서 사용자는 내부 도메인 이름을 통해 Application Load Balancer에 액세스합니다. 트래픽은 Amazon API Gateway와 S3 버킷의 Virtual Private Cloud(VPC) 엔드포인트를 통해 내부적으로 라우팅됩니다. 이 AWS Lambda 함수는 프라이빗 VPC 엔드포인트를 통한 파일 다운로드에 대해 미리 서명된 URLs을 생성하여 민감한 데이터의 보안 및 개인 정보 보호를 강화하는 데 도움이 됩니다.

## 사전 조건 및 제한 사항
<a name="set-up-private-access-to-an-amazon-s3-bucket-through-a-vpc-endpoint-prereqs"></a>

**사전 조건 **
+ 회사 네트워크에 연결된(예:를 통해)에 배포 AWS 계정 된 서브넷을 포함하는 VPC입니다 AWS Direct Connect.

**제한 사항 **
+ S3 버킷의 이름은 도메인과 동일해야 하므로 [Amazon S3 버킷 이름 지정 규칙을 확인하는 것이 좋습니다.](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html)
+ 이 샘플 아키텍처에는 배포된 인프라에 대한 모니터링 기능이 포함되지 않습니다. 사용 사례에 모니터링이 필요한 경우 [AWS 모니터링 서비스를](https://docs.aws.amazon.com/prescriptive-guidance/latest/implementing-logging-monitoring-cloudwatch/welcome.html) 추가하는 것이 좋습니다.
+ 이 샘플 아키텍처에는 입력 검증이 포함되지 않습니다. 사용 사례에 입력 검증과 보안 강화가 필요한 경우를 [사용하여 API AWS WAF 를 보호하는 것이](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-aws-waf.html) 좋습니다.
+ 이 샘플 아키텍처에는 Application Load Balancer를 사용한 액세스 로깅이 포함되지 않습니다. 사용 사례에 액세스 로깅이 필요한 경우 [로드 밸런서 액세스 로그](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-access-logs.html)를 활성화하는 것이 좋습니다.

**버전**
+ Python 버전 3.11 이상
+ Terraform 버전 1.6 이상

## 아키텍처
<a name="set-up-private-access-to-an-amazon-s3-bucket-through-a-vpc-endpoint-architecture"></a>

**대상 기술 스택**

대상 기술 스택에는 다음 AWS 서비스가 사용됩니다.
+ **Amazon S3**는 파일을 안전하게 업로드, 다운로드 및 저장하는 데 사용되는 코어 스토리지 서비스입니다.
+ **Amazon API Gateway**는 S3 버킷과 상호 작용하기 위한 리소스 및 엔드포인트를 노출합니다. 이 서비스는 데이터 다운로드 또는 업로드를 위해 미리 서명된 URL을 생성하는 역할을 합니다.
+ **AWS Lambda**는 Amazon S3에서 파일을 다운로드하기 위해 미리 서명된 URL을 생성합니다. API Gateway가 Lambda 함수를 직접 호출합니다.
+ **Amazon VPC**는 VPC 내에 리소스를 배포하여 네트워크 격리를 제공합니다. VPC에는 트래픽 흐름을 제어하는 서브넷과 라우팅 테이블이 포함되어 있습니다.
+ **Application Load Balancer**는 수신 트래픽을 API Gateway 또는 S3 버킷의 VPC 엔드포인트로 라우팅합니다. 이를 통해 회사 네트워크의 사용자가 내부적으로 리소스에 액세스할 수 있습니다.
+ **Amazon S3용 VPC 엔드포인트**를 사용하면 퍼블릭 인터넷을 통과하지 않고도 VPC와 Amazon S3의 리소스 간에 직접 프라이빗 통신을 수행할 수 있습니다.
+ **AWS Identity and Access Management (IAM)**는 AWS 리소스에 대한 액세스를 제어합니다. API 및 기타 서비스와의 안전한 상호 작용을 보장하기 위해 권한이 설정됩니다.

**대상 아키텍처 **

![\[VPC 종료를 통해 S3 버킷에 대한 프라이빗 액세스 설정\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/683ca6a1-789c-4444-bcbf-e4e80d253df3/images/1ca7ee17-d346-4eb9-bf61-ccf42528a401.png)


다이어그램은 다음을 보여 줍니다.

1. 회사 네트워크의 사용자는 내부 도메인 이름을 통해 Application Load Balancer에 액세스할 수 있습니다. 회사 네트워크와의 인트라넷 서브넷 사이에 연결이 있다고 가정합니다 AWS 계정 (예: Direct Connect 연결을 통해).

1. Application Load Balancer는 수신 트래픽을 API Gateway로 라우팅하여 미리 서명된 URL을 생성하여 Amazon S3 또는 S3 버킷의 VPC 엔드포인트에 데이터를 다운로드하거나 업로드합니다. 두 시나리오 모두에서 요청은 내부적으로 라우팅되며 인터넷을 통과할 필요가 없습니다.

1. API Gateway는 리소스와 엔드포인트를 노출하여 S3 버킷과 상호 작용합니다. 이 예에서는 S3 버킷에서 파일을 다운로드할 엔드포인트를 제공하지만 업로드 기능도 제공하도록 확장할 수 있습니다.

1. Lambda 함수는 퍼블릭 Amazon S3 도메인 대신 Application Load Balancer의 도메인 이름을 사용하여 Amazon S3에서 파일을 다운로드할 미리 서명된 URL을 생성합니다.

1. 사용자는 미리 서명된 URL을 수신하고 이를 사용하여 Application Load Balancer를 사용하여 Amazon S3에서 파일을 다운로드합니다. 로드 밸런서에는 API용이 아닌 트래픽을 S3 버킷의 VPC 엔드포인트로 전송하는 기본 경로가 포함되어 있습니다.

1. VPC 엔드포인트는 사용자 지정 도메인 이름이 있는 미리 서명된 URL을 S3 버킷으로 라우팅합니다. S3 버킷은 도메인과 이름이 동일해야 합니다.

**자동화 및 규모 조정**

이 패턴은 Terraform을 사용하여 코드 리포지토리의 인프라를에 배포합니다 AWS 계정.

## 도구
<a name="set-up-private-access-to-an-amazon-s3-bucket-through-a-vpc-endpoint-tools"></a>

**도구**
+ [Python](https://www.python.org/)은 범용 컴퓨터 프로그래밍 언어입니다.
+ [Terraform](https://www.terraform.io/)은 HashiCorp의 코드형 인프라(IaC) 도구로, 클라우드 및 온프레미스 리소스를 생성하고 관리하는 데 도움이 됩니다.
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)는 명령줄 셸의 명령을 통해 AWS 서비스와 상호 작용하는 데 도움이 되는 오픈 소스 도구입니다.

**코드 리포지토리**

이 패턴의 코드는 [https://github.com/aws-samples/private-s3-vpce](https://github.com/aws-samples/private-s3-vpce) GitHub 리포지토리에서 사용할 수 있습니다.

## 모범 사례
<a name="set-up-private-access-to-an-amazon-s3-bucket-through-a-vpc-endpoint-best-practices"></a>

이 패턴의 샘플 아키텍처는 [IAM 권한을](https://docs.aws.amazon.com/apigateway/latest/developerguide/permissions.html) 사용하여 API에 대한 액세스를 제어합니다. 유효한 IAM 자격 증명이 있는 사람은 누구나 API를 직접적으로 호출할 수 있습니다. 사용 사례에 더 복잡한 권한 부여 모델이 필요한 경우 [다른 액세스 제어 메커니즘을 사용할](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-to-api.html) 수 있습니다.

## 에픽
<a name="set-up-private-access-to-an-amazon-s3-bucket-through-a-vpc-endpoint-epics"></a>

### 에 솔루션 배포 AWS 계정
<a name="deploy-the-solution-in-an-aws-account"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
|  AWS 자격 증명을 가져옵니다. | 자격 AWS 증명과 계정에 대한 액세스를 검토합니다. 지침은 AWS CLI 설명서의 [구성 및 자격 증명 파일 설정을](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html) 참조하세요. | AWS DevOps, 일반 AWS | 
| 리포지토리를 복제합니다. | 이 패턴과 함께 제공된 GitHub 리포지토리를 복제합니다.<pre>git clone https://github.com/aws-samples/private-s3-vpce</pre> | AWS DevOps, 일반 AWS | 
| 변수를 구성합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/set-up-private-access-to-an-amazon-s3-bucket-through-a-vpc-endpoint.html) | AWS DevOps, 일반 AWS | 
| 솔루션을 배포합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/set-up-private-access-to-an-amazon-s3-bucket-through-a-vpc-endpoint.html) | AWS DevOps, 일반 AWS | 

### 솔루션 테스트
<a name="test-the-solution"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 테스트 파일을 생성합니다. | Amazon S3에 파일을 업로드하여 파일 다운로드에 대한 테스트 시나리오를 생성합니다. [Amazon S3 콘솔](https://console.aws.amazon.com/s3/) 또는 다음 AWS CLI 명령을 사용할 수 있습니다.<pre>aws s3 cp /path/to/testfile s3://your-bucket-name/testfile</pre> | AWS DevOps, 일반 AWS | 
| 미리 서명된 URL 기능을 테스트합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/set-up-private-access-to-an-amazon-s3-bucket-through-a-vpc-endpoint.html) | AWS DevOps, 일반 AWS | 
| 정리 | 리소스가 더 이상 필요하지 않은 경우 리소스를 제거해야 합니다.<pre>terraform destroy</pre> | AWS DevOps, 일반 AWS | 

## 문제 해결
<a name="set-up-private-access-to-an-amazon-s3-bucket-through-a-vpc-endpoint-troubleshooting"></a>


| 문제 | Solution | 
| --- | --- | 
| 숫자 기호(\$1) 브레이크 URL 파라미터와 같은 특수 문자가 포함된 S3 객체 키 이름으로 인해 오류가 발생합니다. | URL 파라미터를 올바르게 인코딩하고 S3 객체 키 이름이 [Amazon S3 지침을](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html) 따르는지 확인합니다. | 

## 관련 리소스
<a name="set-up-private-access-to-an-amazon-s3-bucket-through-a-vpc-endpoint-resources"></a>

Amazon S3:
+ [미리 서명된 URLs을 사용하여 객체 공유](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html)
+ [버킷 정책을 사용하여 VPC 엔드포인트에서 액세스 제어](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies-vpc-endpoint.html)

Amazon API Gateway:
+ [API Gateway에서 프라이빗 APIs에 VPC 엔드포인트 정책 사용](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-vpc-endpoint-policies.html)

Application Load Balancer:
+ [ALB, S3 및 PrivateLink를 사용하여 내부 HTTPS 정적 웹 사이트 호스팅](https://aws.amazon.com/blogs/networking-and-content-delivery/hosting-internal-https-static-websites-with-alb-s3-and-privatelink/)(AWS 블로그 게시물)

# Amazon Bedrock AWS Step Functions 을 사용하여의 상태 문제 해결
<a name="troubleshooting-states-in-aws-step-functions"></a>

*Aniket Kurzadkar 및 Sangam Kushwaha, Amazon Web Services*

## 요약
<a name="troubleshooting-states-in-aws-step-functions-summary"></a>

AWS Step Functions 오류 처리 기능은 [워크플로](https://docs.aws.amazon.com/step-functions/latest/dg/concepts-statemachines.html)의 상태에서 발생하는 오류를 확인하는 데 도움이 될 수 있지만 오류의 근본 원인을 찾아 디버깅하는 것은 여전히 어려울 수 있습니다. 이 패턴은 이러한 문제를 해결하고 Amazon Bedrock이 Step Functions의 상태에서 발생하는 오류를 해결하는 데 어떻게 도움이 되는지 보여줍니다.

Step Functions는 워크플로 오케스트레이션을 제공하므로 개발자가 프로세스를 더 쉽게 자동화할 수 있습니다. Step Functions는 다음과 같은 이점을 제공하는 오류 처리 기능도 제공합니다.
+ 개발자는 문제가 발생할 때 완전히 실패하지 않는 복원력이 뛰어난 애플리케이션을 만들 수 있습니다.
+ 워크플로에는 다양한 유형의 오류를 다르게 처리하는 조건부 로직이 포함될 수 있습니다.
+ 시스템은 지수 백오프를 통해 실패한 작업을 자동으로 재시도할 수 있습니다.
+ 오류 시나리오에 대해 대체 실행 경로를 정의하여 워크플로를 조정하고 처리를 계속할 수 있습니다.

Step Functions 워크플로에서 오류가 발생하면이 패턴은 Step Functions에서 지원하는 Claude 3과 같은 파운데이션 모델(FM)로 오류 메시지와 컨텍스트를 전송하는 방법을 보여줍니다. FM은 오류를 분석하고 분류하며 잠재적 수정 단계를 제안할 수 있습니다.

## 사전 조건 및 제한 사항
<a name="troubleshooting-states-in-aws-step-functions-prereqs"></a>

**사전 조건 **
+ 활성 AWS 계정
+ [AWS Step Functions 및 워크플로](https://docs.aws.amazon.com/step-functions/latest/dg/concepts-statemachines.html)에 대한 기본 이해
+ Amazon Bedrock [API 연결](https://docs.aws.amazon.com/bedrock/latest/userguide/getting-started-api.html)

**제한 사항 **
+ 다양한에이 패턴의 접근 방식을 사용할 수 있습니다 AWS 서비스. 그러나 결과는 AWS Lambda 이후에 Amazon Bedrock에서 평가한에서 생성된 프롬프트에 따라 달라질 수 있습니다.
+ 일부 AWS 서비스 는 전혀 사용할 수 없습니다 AWS 리전. 리전별 가용성은 [리전별 AWS 서비스](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)를 참조하세요. 구체적인 엔드포인트는 [서비스 엔드포인트 및 할당량](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)을 참조하고 서비스 링크를 선택합니다.

## 아키텍처
<a name="troubleshooting-states-in-aws-step-functions-architecture"></a>

다음 다이어그램은 이 패턴의 워크플로 및 구성 요소를 보여 줍니다.

![\[Step Functions, Amazon Bedrock 및 Amazon SNS를 사용한 오류 처리 및 알림을 위한 워크플로입니다.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/78f86c74-c9de-4562-adcc-105b87a77a54/images/d8eda499-ea1d-45e5-8a36-e04a44ad5c4b.png)


다이어그램은 Step Functions 상태 시스템에서 오류 처리 및 알림을 위한 자동화된 워크플로를 보여줍니다.

1. 개발자가 상태 시스템의 실행을 시작합니다.

1. Step Functions 상태 시스템이 상태 처리를 시작합니다. 이 경우 다음 두 가지 결과가 가능합니다.
   + (a) 모든 상태가 성공적으로 실행되면 워크플로는 이메일 성공 알림을 위해 Amazon SNS로 직접 진행합니다.
   + (b) 상태가 실패하면 워크플로가 Lambda 함수를 처리하는 오류로 이동합니다.

1. 이 오류는 다음 경우에 발생할 수 있습니다.
   + (a) Lambda 함수(오류 핸들러)가 트리거됩니다. Lambda 함수는 Step Functions 상태 시스템이 전달한 이벤트 데이터에서 오류 메시지를 추출합니다. 그런 다음 Lambda 함수는이 오류 메시지를 기반으로 프롬프트를 준비하고 Amazon Bedrock에 프롬프트를 보냅니다. 프롬프트는 발생한 특정 오류와 관련된 솔루션과 제안을 요청합니다.
   + (b) 생성형 AI 모델을 호스팅하는 Amazon Bedrock은 입력 프롬프트를 처리합니다. (이 패턴은 Amazon Bedrock이 지원하는 많은 FM 중 하나인 Anthropic Claude 3 파운데이션 모델(FMs 사용합니다.) AI 모델은 오류 컨텍스트를 분석합니다. 그런 다음 모델은 오류가 발생한 이유에 대한 설명, 오류를 해결하기 위한 잠재적 솔루션, 향후 동일한 실수를 피하기 위한 제안을 포함할 수 있는 응답을 생성합니다.

     Amazon Bedrock은 AI 생성 응답을 Lambda 함수에 반환합니다. Lambda 함수는 응답을 처리하여 잠재적으로 응답을 포맷하거나 키 정보를 추출합니다. 그런 다음 Lambda 함수는 상태 시스템 출력에 응답을 전송합니다.

1. 오류 처리 또는 성공적인 실행 후 Amazon SNS가 이메일 알림을 보내도록 트리거하여 워크플로가 종료됩니다.

## 도구
<a name="troubleshooting-states-in-aws-step-functions-tools"></a>

**AWS 서비스**
+ [Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/what-is-bedrock.html)은 선도적인 AI 스타트업과 Amazon의 고성능 파운데이션 모델(FM)을 통합 API를 통해 사용할 수 있게 해주는 완전 관리형 서비스입니다.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)는 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행하는 데 도움이 되는 컴퓨팅 서비스입니다. 필요할 때만 코드를 실행하며 자동으로 확장이 가능하므로 사용한 컴퓨팅 시간만큼만 비용을 지불합니다.
+ [Amazon Simple Notification Service(Amazon SNS)](https://docs.aws.amazon.com/sns/latest/dg/welcome.html)를 사용하면 웹 서버 및 이메일 주소를 포함하여 게시자와 클라이언트 간의 메시지 교환을 조정하고 관리할 수 있습니다.
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html)는 AWS Lambda 함수 및 기타를 결합하여 비즈니스 크리티컬 애플리케이션을 구축하는 AWS 서비스 데 도움이 되는 서버리스 오케스트레이션 서비스입니다.

## 모범 사례
<a name="troubleshooting-states-in-aws-step-functions-best-practices"></a>
+ Amazon Bedrock은 훈련된 데이터에서 학습하는 생성형 AI 모델이므로 해당 데이터를 사용하여 컨텍스트를 훈련하고 생성합니다. 데이터 유출 문제로 이어질 수 있는 모든 프라이빗 정보를 숨기는 것이 가장 좋습니다.
+ 생성형 AI는 귀중한 인사이트를 제공할 수 있지만 중요한 오류 처리 결정에는 특히 프로덕션 환경에서 인적 감독이 포함되어야 합니다.

## 에픽
<a name="troubleshooting-states-in-aws-step-functions-epics"></a>

### 워크플로에 대한 상태 시스템 생성
<a name="create-a-state-machine-for-your-workflow"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 상태 시스템 생성 | 워크플로에 적합한 상태 시스템을 생성하려면 다음을 수행합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/troubleshooting-states-in-aws-step-functions.html) | DevOps | 

### Lambda 함수 생성
<a name="create-a-lam-function"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| Lambda 함수를 생성합니다. | Lambda 함수를 생성하려면 다음을 수행합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/troubleshooting-states-in-aws-step-functions.html) | DevOps | 
| Lambda 코드에서 필요한 로직을 설정합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/troubleshooting-states-in-aws-step-functions.html)<pre>client = boto3.client(<br />        service_name="bedrock-runtime", region_name="selected-region"<br />    )<br /><br />    # Invoke Claude 3 with the text prompt<br />    model_id = "your-model-id" # Select your Model ID, Based on the Model Id, Change the body format<br /><br />    try:<br />        response = client.invoke_model(<br />            modelId=model_id,<br />            body=json.dumps(<br />                {<br />                    "anthropic_version": "bedrock-2023-05-31",<br />                    "max_tokens": 1024,<br />                    "messages": [<br />                        {<br />                            "role": "user",<br />                            "content": [{"type": "text", "text": prompt}],<br />                        }<br />                    ],<br />                }<br />            ),<br />        )<br /></pre>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/troubleshooting-states-in-aws-step-functions.html) | DevOps | 

### Step Functions를 Lambda와 통합
<a name="integrate-sfn-with-lam"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| Step Functions에서 오류를 처리하도록 Lambda를 설정합니다. | 워크플로를 중단하지 않고 오류를 처리하도록 Step Functions를 설정하려면 다음을 수행합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/troubleshooting-states-in-aws-step-functions.html) | DevOps | 

## 문제 해결
<a name="troubleshooting-states-in-aws-step-functions-troubleshooting"></a>


| 문제 | Solution | 
| --- | --- | 
| Lambda가 Amazon Bedrock API에 액세스할 수 없음(수행 권한이 없음) | 이 오류는 Lambda 역할에 Amazon Bedrock API에 액세스할 권한이 없는 경우에 발생합니다. 이 문제를 해결하려면 Lambda 역할에 대한 `AmazonBedrockFullAccess` 정책을 추가합니다. 자세한 내용은 *AWS 관리형 정책 참조 안내서*의 [AmazonBedrockFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonBedrockFullAccess.html)를 참조하세요. | 
| Lambda 제한 시간 오류 | 프롬프트에 따라 응답을 생성하고 다시 보내는 데 30초 이상 걸릴 수 있습니다. 이 문제를 해결하려면 구성 시간을 늘리세요. 자세한 내용은 *AWS Lambda 개발자 가이드*의 [Lambda 함수 제한 시간 구성](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonBedrockFullAccess.html)을 참조하세요. | 

## 관련 리소스
<a name="troubleshooting-states-in-aws-step-functions-resources"></a>
+ [Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/what-is-bedrock.html)
+ [Amazon Bedrock API 액세스](https://docs.aws.amazon.com/bedrock/latest/userguide/getting-started-api.html)
+ [첫 번째 Lambda 함수 생성](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html)
+ [Step Functions를 사용하여 워크플로 개발](https://docs.aws.amazon.com/step-functions/latest/dg/developing-workflows.html#development-run-debug)
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html) 

# 패턴 더 보기
<a name="serverless-more-patterns-pattern-list"></a>

**Topics**
+ [Athena를 사용한 Amazon DynamoDB 테이블 액세스, 쿼리 및 조인](access-query-and-join-amazon-dynamodb-tables-using-athena.md)
+ [GitHub Actions를 사용하여 AWS CDK Python 애플리케이션에 대한 Amazon CodeGuru 리뷰 자동화](automate-amazon-codeguru-reviews-for-aws-cdk-python-applications.md)
+ [AWS 리소스 평가 자동화](automate-aws-resource-assessment.md)
+ [AWS SAM을 사용하여 중첩된 애플리케이션 자동 배포](automate-deployment-of-nested-applications-using-aws-sam.md)
+ [GitHub Actions, Artifactory 및 Terraform을 사용하여 다중 리포지토리 설정에서 AWS Supply Chain 데이터 레이크 배포 자동화](automate-the-deployment-of-aws-supply-chain-data-lakes.md)
+ [에서 Amazon RDS 인스턴스 복제 자동화 AWS 계정](automate-the-replication-of-amazon-rds-instances-across-aws-accounts.md)
+ [DynamoDB TTL을 사용하여 Amazon S3에 항목 자동으로 보관](automatically-archive-items-to-amazon-s3-using-dynamodb-ttl.md)
+ [CodeCommit의 모노리포지토리에 대한 변경 사항 자동 감지 및 다양한 CodePipeline 파이프라인 시작](automatically-detect-changes-and-initiate-different-codepipeline-pipelines-for-a-monorepo-in-codecommit.md)
+ [Amazon OpenSearch Service에서 멀티 테넌트 서버리스 아키텍처 구축](build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service.md)
+ [클라우드에서 고급 메인프레임 파일 뷰어 구축](build-an-advanced-mainframe-file-viewer-in-the-aws-cloud.md)
+ [AWS 서비스를 사용하여 위험 가치(VaR) 계산](calculate-value-at-risk-var-by-using-aws-services.md)
+ [여러 AWS 계정 및 AWS 리전에 걸쳐 AWS Service Catalog 제품 복사](copy-aws-service-catalog-products-across-different-aws-accounts-and-aws-regions.md)
+ [Java 및 Python 프로젝트를 위한 동적 CI 파이프라인을 자동으로 생성](create-dynamic-ci-pipelines-for-java-and-python-projects-automatically.md)
+ [CQRS 및 이벤트 소싱을 사용하여 모놀리식 유형을 마이크로서비스로 분해하기](decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.md)
+ [Amazon S3 및 CloudFront에 React 기반 단일 페이지 애플리케이션 배포](deploy-a-react-based-single-page-application-to-amazon-s3-and-cloudfront.md)
+ [프라이빗 엔드포인트와 Application Load Balancer 사용하여 내부 웹 사이트에 Amazon API Gateway API 배포](deploy-an-amazon-api-gateway-api-on-an-internal-website-using-private-endpoints-and-an-application-load-balancer.md)
+ [AWS 클라우드에서 인프라를 코드로 사용하여 서버리스 데이터 레이크 배포와 관리](deploy-and-manage-a-serverless-data-lake-on-the-aws-cloud-by-using-infrastructure-as-code.md)
+ [Terraform 및 Amazon Bedrock을 AWS 사용하여에 RAG 사용 사례 배포](deploy-rag-use-case-on-aws.md)
+ [Amazon Bedrock 에이전트 및 지식 기반을 사용하여 완전 자동화된 채팅 기반 어시스턴트 개발](develop-a-fully-automated-chat-based-assistant-by-using-amazon-bedrock-agents-and-knowledge-bases.md)
+ [RAG 및 ReAct 프롬프트를 사용하여 고급 생성형 AI 채팅 기반 어시스턴트 개발](develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting.md)
+ [Step Functions를 사용하여 IIAM Access Analyzer로 IAM 정책을 동적으로 생성하기](dynamically-generate-an-iam-policy-with-iam-access-analyzer-by-using-step-functions.md)
+ [Amazon Cognito 및 IaC 자동화를 사용하여 Amazon Quick Sight 시각적 구성 요소를 웹 애플리케이션에 임베드](embed-quick-sight-visual-components-into-web-apps-cognito-iac.md)
+ [시작 시 Amazon S3에 Amazon EMR 로깅이 활성화되었는지 확인](ensure-amazon-emr-logging-to-amazon-s3-is-enabled-at-launch.md)
+ [온디맨드 용량에 대한 DynamoDB 테이블의 비용 추정](estimate-the-cost-of-a-dynamodb-table-for-on-demand-capacity.md)
+ [Amazon Personalize를 사용하여 개인화되고 순위가 다시 매겨진 추천 생성](generate-personalized-and-re-ranked-recommendations-using-amazon-personalize.md)
+ [AWS Glue 작업과 Python을 사용하여 테스트 데이터 생성](generate-test-data-using-an-aws-glue-job-and-python.md)
+ [SQL Server에서 PostgreSQL로 마이그레이션할 때 PII 데이터에 대한 SHA1 해싱 구현](implement-sha1-hashing-for-pii-data-when-migrating-from-sql-server-to-postgresql.md)
+ [AWS Step Functions을 사용하여 서버리스 사가 패턴 구현](implement-the-serverless-saga-pattern-by-using-aws-step-functions.md)
+ [AWS CDK를 통해 여러 AWS 리전, 계정, OU에서 Amazon DevOps Guru를 활성화하여 운영 성능을 개선하세요.](improve-operational-performance-by-enabling-amazon-devops-guru-across-multiple-aws-regions-accounts-and-ous-with-the-aws-cdk.md)
+ [Step Functions와 Lambda 프록시 함수를 사용하여 여러 AWS 계정에서 CodeBuild 프로젝트 시작](launch-a-codebuild-project-across-aws-accounts-using-step-functions-and-a-lambda-proxy-function.md)
+ [AWS Glue를 사용하여 Apache Cassandra 워크로드를 Amazon Keyspaces으로 마이그레이션](migrate-apache-cassandra-workloads-to-amazon-keyspaces-by-using-aws-glue.md)
+ [여러에서 공유 Amazon Machine Image 사용 모니터링 AWS 계정](monitor-use-of-a-shared-amazon-machine-image-across-multiple-aws-accounts.md)
+ [AWS CDK 및 GitHub Actions 워크플로를 사용하여 다중 계정 서버리스 배포 최적화](optimize-multi-account-serverless-deployments.md)
+ [를 사용하여 검증, 변환 및 파티셔닝으로 ETL 파이프라인 오케스트레이션 AWS Step Functions](orchestrate-an-etl-pipeline-with-validation-transformation-and-partitioning-using-aws-step-functions.md)
+ [Amazon Athena를 사용하여 SQL로 Amazon DynamoDB 테이블 쿼리](query-amazon-dynamodb-tables-sql-amazon-athena.md)
+ [AWS Fargate를 사용하여 이벤트 기반 및 예약된 워크로드를 대규모로 실행](run-event-driven-and-scheduled-workloads-at-scale-with-aws-fargate.md)
+ [사용자 지정 속성을 Amazon Cognito로 전송하고 토큰에 주입](send-custom-attributes-cognito.md)
+ [Amazon CloudFront를 사용하여 VPC를 통해 Amazon S3 버킷의 정적 콘텐츠 제공하기](serve-static-content-in-an-amazon-s3-bucket-through-a-vpc-by-using-amazon-cloudfront.md)
+ [자동화된 워크플로를 사용하여 Amazon Lex 봇 개발 및 배포 간소화](streamline-amazon-lex-bot-development-and-deployment-using-an-automated-workflow.md)
+ [AWS Lambda를 사용하여 육각형 아키텍처로 Python 프로젝트 구조화](structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.md)
+ [OpenSearch 및 Elasticsearch 쿼리를 위해 자연어를 쿼리 DSL로 변환](translate-natural-language-query-dsl-opensearch-elasticsearch.md)
+ [계정 간에 Amazon Redshift 클러스터에서 Amazon S3로 데이터 언로드](unload-data-from-amazon-redshift-cross-accounts-to-amazon-s3.md)
+ [AWS Fargate WaitCondition 후크 구성을 사용하여 리소스 종속성과 작업 실행을 조정합니다.](use-the-aws-fargate-waitcondition-hook-construct.md)
+ [Amazon Bedrock 에이전트를 사용하여 텍스트 기반 프롬프트를 통해 Amazon EKS에서 액세스 항목 제어 생성 자동화](using-amazon-bedrock-agents-to-automate-creation-of-access-entry-controls-in-amazon-eks.md)