자습서: 교차 계정 Amazon SQS 대기열을 이벤트 소스로 사용 - AWS Lambda

자습서: 교차 계정 Amazon SQS 대기열을 이벤트 소스로 사용

이 자습서에서는 다른 AWS 계정의 Amazon Simple Queue Service(Amazon SQS) 대기열에서 메시지를 사용하는 Lambda 함수를 생성합니다. 이 자습서에는 2개의 AWS 계정, 즉 Lambda 함수가 포함된 계정을 나타내는 계정 A와 Amazon SQS 대기열이 포함된 계정을 나타내는 계정 B가 사용됩니다.

필수 조건

이 자습서에서는 사용자가 기본 Lambda 작업과 Lambda 콘솔에 대해 어느 정도 알고 있다고 가정합니다. 그렇지 않은 경우 콘솔로 Lambda 함수 생성의 지침에 따라 첫 Lambda 함수를 생성합니다.

다음 단계를 완료하려면 AWS Command Line Interface(AWS CLI) 버전 2가 필요합니다. 명령과 예상 결과는 별도의 블록에 나열됩니다.

aws --version

다음 결과가 표시됩니다.

aws-cli/2.13.27 Python/3.11.6 Linux/4.14.328-248.540.amzn2.x86_64 exe/x86_64.amzn.2

긴 명령의 경우 이스케이프 문자(\)를 사용하여 명령을 여러 행으로 분할합니다.

Linux 및 macOS는 선호 셸과 패키지 관리자를 사용합니다.

참고

Windows에서는 Lambda와 함께 일반적으로 사용하는 일부 Bash CLI 명령(예:zip)은 운영 체제의 기본 제공 터미널에서 지원되지 않습니다. Ubuntu와 Bash의 Windows 통합 버전을 가져오려면 Linux용 Windows Subsystem을 설치합니다. 이 안내서의 예제 CLI 명령은 Linux 형식을 사용합니다. Windows CLI를 사용하는 경우 인라인 JSON 문서를 포함하는 명령의 형식을 다시 지정해야 합니다.

실행 역할 생성(계정 A)

계정 A에서 필요한 AWS 리소스에 액세스하는 함수 권한을 부여하는 실행 역할을 만듭니다.

실행 역할을 만들려면
  1. AWS Identity and Access Management(IAM) 콘솔에서 역할(Roles) 페이지를 엽니다.

  2. 역할 생성을 선택합니다.

  3. 다음 속성을 사용하여 역할을 만듭니다.

    • 신뢰할 수 있는 엔터티AWS Lambda

    • 권한AWSLambdaSQSQueueExecutionRole

    • 역할 이름cross-account-lambda-sqs-role

AWSLambdaSQSQueueExecutionRole 정책은 함수가 Amazon SQS에서 항목을 읽고 Amazon CloudWatch Logs에 로그를 쓰는 데 필요한 권한을 가집니다.

함수 생성(계정 A)

계정 A에서 Amazon SQS 메시지를 처리하는 Lambda 함수를 생성합니다. 다음 Node.js 18 코드 예는 각 메시지를 CloudWatch Logs의 로그에 기록합니다.

예 index.mjs
export const handler = async function(event, context) { event.Records.forEach(record => { const { body } = record; console.log(body); }); return {}; }
함수를 만들려면
참고

다음 단계에 따라 Node.js 18에서 함수를 생성합니다. 다른 언어의 경우 단계는 비슷하지만 일부 세부 사항은 다릅니다.

  1. 예제 코드를 index.mjs라는 파일로 저장합니다.

  2. 배포 패키지를 만듭니다.

    zip function.zip index.mjs
  3. create-function AWS Command Line Interface(AWS CLI) 명령을 사용하여 함수를 만듭니다.

    aws lambda create-function --function-name CrossAccountSQSExample \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs18.x \ --role arn:aws:iam::<AccountA_ID>:role/cross-account-lambda-sqs-role

함수 테스트(계정 A)

계정 A에서 invoke AWS CLI 명령 및 샘플 Amazon SQS 이벤트를 사용하여 Lambda 함수를 수동으로 테스트합니다.

핸들러가 예외 없이 정상적으로 반환되면 Lambda는 메시지가 성공적으로 처리된 것으로 간주하고 대기열의 새 메시지 읽기를 시작합니다. 메시지를 성공적으로 처리하면 Lambda는 대기열에서 메시지를 자동으로 삭제합니다. 핸들러가 예외를 발생시키면 Lambda는 메시지 배치가 성공적으로 처리되지 않은 것으로 간주하고 Lambda는 동일한 메시지 배치로 함수를 호출합니다.

  1. 다음 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가 "body"에 대기열의 실제 메시지를 포함하는 Lambda 함수로 보낼 수 있는 이벤트를 시뮬레이션합니다.

  2. 다음 invoke AWS CLI 명령을 실행합니다.

    aws lambda invoke --function-name CrossAccountSQSExample \ --cli-binary-format raw-in-base64-out \ --payload file://input.txt outputfile.txt

    cli-binary-format 옵션은 AWS CLI 버전 2를 사용할 때 필요합니다. 이 설정을 기본 설정으로 지정하려면 aws configure set cli-binary-format raw-in-base64-out을(를) 실행하세요. 자세한 내용은 AWS CLI 지원되는 글로벌 명령줄 옵션을 AWS Command Line Interface 사용 설명서 버전 2에서 참조하세요.

  3. outputfile.txt 파일의 출력을 확인합니다.

Amazon SQS 대기열 생성(계정 B)

계정 B에서 계정 A의 Lambda 함수가 이벤트 소스로 사용할 수 있는 Amazon SQS 대기열을 생성합니다.

대기열을 생성하려면
  1. Amazon SQS 콘솔을 엽니다.

  2. Create queue(대기열 생성)를 선택합니다.

  3. 다음 속성을 사용하여 대기열을 만듭니다.

    • TypeStandard

    • NameLambdaCrossAccountQueue

    • Configuration - 기본 설정을 유지합니다.

    • Access policyAdvanced를 선택합니다. 다음 JSON 정책을 붙여넣습니다.

      { "Version": "2012-10-17", "Id": "Queue1_Policy_UUID", "Statement": [{ "Sid":"Queue1_AllActions", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::<AccountA_ID>:role/cross-account-lambda-sqs-role" ] }, "Action": "sqs:*", "Resource": "arn:aws:sqs:us-east-1:<AccountB_ID>:LambdaCrossAccountQueue" } ] }

      이 정책은 이 Amazon SQS 대기열에서 발생하는 메시지를 사용할 수 있는 계정 A 권한에 Lambda 실행 역할을 부여합니다.

  4. 대기열을 만든 후 대기열의 Amazon 리소스 이름(ARN)을 기록합니다. 다음 단계에서 대기열을 Lambda 함수와 연결할 때 필요합니다.

이벤트 소스 구성(계정 A)

다음 create-event-source-mapping AWS CLI 명령을 실행하여, 계정 A에서 계정 B의 Amazon SQS 대기열 간에 이벤트 소스 매핑과 Lambda 함수를 생성합니다.

aws lambda create-event-source-mapping --function-name CrossAccountSQSExample --batch-size 10 \ --event-source-arn arn:aws:sqs:us-east-1:<AccountB_ID>:LambdaCrossAccountQueue

이벤트 소스 매핑 목록을 가져오려면 다음 명령을 실행합니다.

aws lambda list-event-source-mappings --function-name CrossAccountSQSExample \ --event-source-arn arn:aws:sqs:us-east-1:<AccountB_ID>:LambdaCrossAccountQueue

설정 테스트

이제 다음과 같이 설정을 테스트할 수 있습니다.

  1. 계정 B에서 Amazon SQS 콘솔을 엽니다.

  2. 앞서 생성한 LambdaCrossAccountQueue를 선택합니다.

  3. [메시지 전송 및 수신(Send and receive messages)]을 선택합니다.

  4. 메시지 본문 아래에 테스트 메시지를 입력합니다.

  5. 메시지 전송을 선택합니다.

계정 A의 Lambda 함수가 이 메시지를 수신해야 합니다. Lambda는 계속해서 업데이트를 위해 대기열을 폴링합니다. 새 메시지가 있는 경우 Lambda는 대기열에서 이 새 이벤트 데이터를 사용하여 함수를 호출합니다. 함수는 Amazon CloudWatch에서 로그를 실행하고 생성합니다. CloudWatch 콘솔에서 로그를 확인할 수 있습니다.

리소스 정리

이 자습서 용도로 생성한 리소스를 보관하고 싶지 않다면 지금 삭제할 수 있습니다. 더 이상 사용하지 않는 AWS 리소스를 삭제하면 AWS 계정에 불필요한 요금이 발생하는 것을 방지할 수 있습니다.

계정 A에서 실행 역할 및 Lambda 함수를 정리합니다.

집행 역할 삭제
  1. IAM 콘솔에서 역할 페이지를 엽니다.

  2. 생성한 실행 역할을 선택합니다.

  3. Delete(삭제)를 선택합니다.

  4. 텍스트 입력 필드에 역할의 이름을 입력하고 Delete(삭제)를 선택합니다.

Lambda 함수를 삭제하려면
  1. Lambda 콘솔의 함수 페이지를 엽니다.

  2. 생성한 함수를 선택합니다.

  3. 작업, 삭제를 선택합니다.

  4. 텍스트 입력 필드에 delete를 입력하고 Delete(삭제)를 선택합니다.

계정 B에서 Amazon SQS 대기열을 정리합니다.

Amazon SQS 대기열을 삭제하려면
  1. AWS Management Console에 로그인한 후 https://console.aws.amazon.com/sqs/에서 Amazon SQS 콘솔을 엽니다.

  2. 생성한 대기열을 선택합니다.

  3. Delete(삭제)를 선택합니다.

  4. 텍스트 입력 필드에 confirm을 입력합니다.

  5. Delete(삭제)를 선택합니다.