튜토리얼: 교차 계정 Amazon SQS 대기열을 이벤트 소스로 사용
튜토리얼: 교차 계정 Amazon SQS 대기열을 이벤트 소스로 사용 (Tutorial: Using a cross-account Amazon SQS queue as an event source)
이 튜토리얼에서는 다른 AWS 계정의 Amazon Simple Queue Service(Amazon SQS) 대기열에서 메시지를 소비하는 Lambda 함수를 만듭니다. 이 튜토리얼에는 두 개의 AWS 계정이 포함됩니다. Account A는 Lambda 함수가 포함된 계정을, Account B는 Amazon SQS 대기열이 포함된 계정을 나타냅니다.
본문
사전 조건
아직 AWS Command Line Interface를 설치하지 않았다면 AWS CLI 최신 버전 설치 또는 업데이트의 단계에 따라 설치하세요.
이 튜토리얼은 명령을 실행하기 위한 명령줄 터미널 또는 셸이 필요합니다. Linux와 macOS에서는 선호하는 셸과 패키지 관리자를 사용하세요.
참고
Windows에서는 운영 체제에 내장된 터미널에서 Lambda와 함께 흔히 사용하는 일부 Bash CLI 명령(예:
zip)이 지원되지 않습니다. Windows 통합 버전의 Ubuntu와 Bash를 얻으려면 Windows Subsystem for Linux를 설치하세요.
실행 역할 만들기 (Account A)
Account A에서 함수가 필요한 AWS 리소스에 액세스할 수 있는 권한을 부여하는 실행 역할을 만듭니다.
실행 역할을 만들려면:
- AWS Identity and Access Management(IAM) 콘솔의 Roles(역할) 페이지를 엽니다.
- Create role(역할 생성) 을 선택합니다.
- 다음 속성으로 역할을 만듭니다:
- Trusted entity(신뢰할 수 있는 엔터티) – AWS Lambda
- Permissions(권한) –
AWSLambdaSQSQueueExecutionRole - Role name(역할 이름) –
cross-account-lambda-sqs-role
AWSLambdaSQSQueueExecutionRole 정책에는 함수가 Amazon SQS에서 항목을 읽고 Amazon CloudWatch Logs에 로그를 쓰는 데 필요한 권한이 있습니다.
함수 만들기 (Account A)
Account A에서 Amazon SQS 메시지를 처리하는 Lambda 함수를 만듭니다. Lambda 함수와 Amazon SQS 대기열은 같은 AWS 리전에 있어야 합니다.
다음 Node.js 코드 예제는 각 메시지를 CloudWatch Logs의 로그로 씁니다.
예시 index.mjs:
export const handler = async function(event, context) {
event.Records.forEach(record => {
const { body } = record;
console.log(body);
});
return {};
}
함수를 만들려면:
참고
다음 단계는 Node.js 함수를 만듭니다. 다른 언어도 단계는 비슷하지만 일부 세부 사항이 다릅니다.
- 코드 예제를
index.mjs라는 파일로 저장합니다. - 배포 패키지를 만듭니다.
zip function.zip index.mjs
create-functionAWS Command Line Interface(AWS CLI) 명령으로 함수를 만듭니다.arn:aws:iam::111122223333:role/cross-account-lambda-sqs-role를 앞서 만든 실행 역할의 ARN으로 교체하세요.
aws lambda create-function --function-name CrossAccountSQSExample \
--zip-file fileb://function.zip --handler index.handler --runtime nodejs24.x \
--role arn:aws:iam::111122223333:role/cross-account-lambda-sqs-role
함수 테스트 (Account A)
Account A에서 invoke AWS CLI 명령과 샘플 Amazon SQS 이벤트로 Lambda 함수를 수동으로 테스트합니다.
핸들러가 예외 없이 정상적으로 반환하면 Lambda는 메시지가 성공적으로 처리된 것으로 간주하고 대기열의 새 메시지 읽기를 시작합니다. 메시지를 성공적으로 처리한 후 Lambda는 자동으로 대기열에서 메시지를 삭제합니다. 핸들러가 예외를 던지면 Lambda는 메시지 일괄 처리가 성공적으로 처리되지 않은 것으로 간주하고 함수를 같은 메시지 일괄 처리로 호출합니다.
- 다음 JSON을
input.txt라는 파일로 저장합니다.
{
"Records": [
{
"messageId": "059f36b4-87a3-44ab-83d2-661975830a7d",
"receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...",
"body": "test",
"attributes": {
"ApproximateReceiveCount": "1",
"SentTimestamp": "1545082649183",
"SenderId": "AIDAIENQZJOLO23YVJ4VO",
"ApproximateFirstReceiveTimestamp": "1545082649185"
},
"messageAttributes": {},
"md5OfBody": "098f6bcd4621d373cade4e832627b4f6",
"eventSource": "aws:sqs",
"eventSourceARN": "arn:aws:sqs:us-east-1:111122223333:example-queue",
"awsRegion": "us-east-1"
}
]
}
앞선 JSON은 Amazon SQS가 Lambda 함수로 보낼 수 있는 이벤트를 시뮬레이션하며, 여기서 "body"는 대기열의 실제 메시지를 포함합니다.
- 다음
invokeAWS CLI 명령을 실행합니다.
aws lambda invoke --function-name CrossAccountSQSExample \
--cli-binary-format raw-in-base64-out \
--payload file://input.txt outputfile.txt
AWS CLI 버전 2를 사용하는 경우 cli-binary-format 옵션이 필요합니다. 기본 설정으로 만들려면 aws configure set cli-binary-format raw-in-base64-out을 실행하세요. 자세한 내용은 AWS Command Line Interface User Guide for Version 2의 AWS CLI 지원 글로벌 명령줄 옵션을 참조하세요.
outputfile.txt파일에서 출력을 확인합니다.
Amazon SQS 대기열 만들기 (Account B)
Account B에서 Account A의 Lambda 함수가 이벤트 소스로 사용할 수 있는 Amazon SQS 대기열을 만듭니다. Lambda 함수와 Amazon SQS 대기열은 같은 AWS 리전에 있어야 합니다.
대기열을 만들려면:
- Amazon SQS 콘솔을 엽니다.
- Create queue(대기열 생성) 를 선택합니다.
- 다음 속성으로 대기열을 만듭니다:
- Type(유형) – Standard
- Name(이름) – LambdaCrossAccountQueue
- Configuration(구성) – 기본 설정을 유지합니다.
- Access policy(액세스 정책) – Advanced(고급) 를 선택합니다. 다음 JSON 정책을 붙여넣습니다. 다음 값을 교체하세요:
111122223333: Account A의 AWS 계정 ID444455556666: Account B의 AWS 계정 ID
{
"Version":"2012-10-17",
"Id": "Queue1_Policy_UUID",
"Statement": [
{
"Sid": "Queue1_AllActions",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::111122223333:role/cross-account-lambda-sqs-role"
]
},
"Action": "sqs:*",
"Resource": "arn:aws:sqs:us-east-1:444455556666:LambdaCrossAccountQueue"
}
]
}
이 정책은 Account A의 Lambda 실행 역할에 이 Amazon SQS 대기열에서 메시지를 소비할 권한을 부여합니다.
- 대기열을 만든 후 그 Amazon 리소스 이름(ARN)을 기록합니다. 다음 단계에서 대기열을 Lambda 함수와 연결할 때 필요합니다.
이벤트 소스 구성 (Account A)
Account A에서 다음 create-event-source-mapping AWS CLI 명령을 실행해 Account B의 Amazon SQS 대기열과 Lambda 함수 사이의 이벤트 소스 매핑을 만듭니다. arn:aws:sqs:us-east-1:444455556666:LambdaCrossAccountQueue를 이전 단계에서 만든 Amazon SQS 대기열의 ARN으로 교체하세요.
aws lambda create-event-source-mapping --function-name CrossAccountSQSExample --batch-size 10 \
--event-source-arn arn:aws:sqs:us-east-1:444455556666:LambdaCrossAccountQueue
이벤트 소스 매핑 목록을 얻으려면 다음 명령을 실행하세요.
aws lambda list-event-source-mappings --function-name CrossAccountSQSExample \
--event-source-arn arn:aws:sqs:us-east-1:444455556666:LambdaCrossAccountQueue
설정 테스트
이제 다음과 같이 설정을 테스트할 수 있습니다:
- Account B에서 Amazon SQS 콘솔을 엽니다.
- 앞서 만든 LambdaCrossAccountQueue 를 선택합니다.
- Send and receive messages(메시지 보내기 및 받기) 를 선택합니다.
- Message body(메시지 본문) 에 테스트 메시지를 입력합니다.
- Send message(메시지 보내기) 를 선택합니다.
Account A의 Lambda 함수가 메시지를 받아야 합니다. Lambda는 업데이트를 위해 대기열을 계속 폴링합니다. 새 메시지가 있으면 Lambda는 대기열의 이 새 이벤트 데이터로 함수를 호출합니다. 함수가 실행되어 Amazon CloudWatch에 로그를 만듭니다. CloudWatch 콘솔에서 로그를 볼 수 있습니다.
리소스 정리
보관하려는 경우가 아니라면 이 튜토리얼에서 만든 리소스를 삭제할 수 있습니다. 더 이상 사용하지 않는 AWS 리소스를 삭제하면 AWS 계정에 불필요한 요금이 발생하는 것을 방지할 수 있습니다.
Account A에서 실행 역할과 Lambda 함수를 정리합니다.
실행 역할을 삭제하려면:
- IAM 콘솔의 Roles(역할) 페이지를 엽니다.
- 만든 실행 역할을 선택합니다.
- Delete(삭제) 를 선택합니다.
- 텍스트 입력 필드에 역할 이름을 입력하고 Delete 를 선택합니다.
Lambda 함수를 삭제하려면:
- Lambda 콘솔의 Functions(함수) 페이지를 엽니다.
- 만든 함수를 선택합니다.
- Actions(작업), Delete(삭제) 를 선택합니다.
- 텍스트 입력 필드에
confirm을 입력하고 Delete 를 선택합니다.
Account B에서 Amazon SQS 대기열을 정리합니다.
Amazon SQS 대기열을 삭제하려면:
- AWS Management Console에 로그인하고 https://console.aws.amazon.com/sqs/ 에서 Amazon SQS 콘솔을 엽니다.
- 만든 대기열을 선택합니다.
- Delete(삭제) 를 선택합니다.
- 텍스트 입력 필드에
confirm을 입력합니다. - Delete 를 선택합니다.
더 알아보기 (Learn more)
- SQS를 Lambda 이벤트 소스로 사용
- Lambda 이벤트 소스 매핑
- 교차 계정 액세스