자습서: Amazon SQS에서 Lambda 사용 - AWS Lambda

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

자습서: Amazon SQS에서 Lambda 사용

이 자습서에서는 Amazon Simple Queue Service(Amazon SQS) 대기열에서 메시지를 사용하는 Lambda 함수를 생성합니다. Lambda 함수는 새 메시지가 대기열에 추가될 때마다 실행됩니다. 이 함수는 메시지를 Amazon CloudWatch Logs 스트림에 기록합니다. 다음 다이어그램은 자습서를 완료하는 데 사용하는 AWS 리소스를 보여줍니다.


        Amazon SQS 메시지, Lambda 함수, CloudWatch Logs 스트림을 보여주는 다이어그램

이 자습서를 완료하려면 다음 단계를 수행하세요.

  1. CloudWatch Logs에 메시지를 작성하는 Lambda 함수를 생성합니다.

  2. Amazon SQS 대기열을 생성합니다.

  3. Lambda 이벤트 소스 매핑을 생성합니다. 이벤트 소스 매핑은 Amazon SQS 대기열을 읽고 새 메시지가 추가되면 Lambda 함수를 간접적으로 호출합니다.

  4. 대기열에 메시지를 추가하고 CloudWatch Logs에서 결과를 모니터링하여 설정을 테스트합니다.

필수 조건

AWS 계정 항목이 없으면 다음 절차에 따라 생성하세요.

AWS 계정에 등록하려면
  1. https://portal.aws.amazon.com/billing/signup을 엽니다.

  2. 온라인 지시 사항을 따릅니다.

    가입 절차 중 전화를 받고 전화 키패드로 확인 코드를 입력하는 과정이 있습니다.

    AWS 계정에 가입하면 AWS 계정 루트 사용자가 생성됩니다. 루트 사용자는 계정의 모든 AWS 서비스 및 리소스에 액세스하는 권한이 있습니다. 보안 모범 사례는 관리 사용자에게 관리자 액세스 권한을 할당하고, 루트 사용자만 루트 사용자 액세스 권한이 필요한 작업을 수행하는 것입니다.

등록 프로세스가 완료된 후 AWS가 확인 이메일을 전송합니다. 언제든지 https://aws.amazon.com/으로 이동하고 내 계정을 선택하여 현재 계정 활동을 보고 계정을 관리할 수 있습니다.

AWS 계정에 가입하고 AWS 계정 루트 사용자에 보안 조치를 한 다음, AWS IAM Identity Center를 활성화하고 일상적인 작업에 루트 사용자를 사용하지 않도록 관리 사용자를 생성합니다.

귀하의 AWS 계정 루트 사용자 보호
  1. 루트 사용자를 선택하고 AWS 계정이메일 주소를 입력하여 AWS Management Console에 계정 소유자로 로그인합니다. 다음 페이지에서 암호를 입력합니다.

    루트 사용자를 사용하여 로그인하는 데 도움이 필요하면 AWS 로그인 사용 설명서루트 사용자로 로그인을 참조하세요.

  2. 루트 사용자에 대해 다중 인증(MFA)을 활성화합니다.

    지침은 IAM 사용 설명서AWS 계정 루트 사용자용 가상 MFA 디바이스 활성화(콘솔)를 참조하세요.

관리 사용자 생성
  1. IAM Identity Center를 활성화합니다.

    지침은 AWS IAM Identity Center 사용 설명서AWS IAM Identity Center 설정을 참조하세요.

  2. IAM Identity Center에서 관리 사용자에게 관리 액세스 권한을 부여합니다.

    IAM Identity Center 디렉터리를 ID 소스로 사용하는 방법에 대한 자습서는 AWS IAM Identity Center 사용 설명서기본 IAM Identity Center 디렉터리로 사용자 액세스 구성을 참조하세요.

관리 사용자로 로그인
  • IAM 자격 증명 센터 사용자로 로그인하려면 IAM 자격 증명 센터 사용자를 생성할 때 이메일 주소로 전송된 로그인 URL을 사용합니다.

    IAM Identity Center 사용자로 로그인하는 데 도움이 필요한 경우 AWS 로그인 사용 설명서AWS 액세스 포털에 로그인을 참조하세요.

아직 AWS Command Line Interface를 설치하지 않은 경우 AWS CLI의 최신 버전 설치 또는 업데이트에서 설명하는 단계에 따라 설치하세요.

이 자습서에서는 명령을 실행할 셸 또는 명령줄 터미널이 필요합니다. Linux 및 macOS에서는 선호하는 셸과 패키지 관리자를 사용합니다.

참고

Windows에서는 Lambda와 함께 일반적으로 사용하는 일부 Bash CLI 명령(예:zip)은 운영 체제의 기본 제공 터미널에서 지원되지 않습니다. Ubuntu와 Bash의 Windows 통합 버전을 가져오려면 Linux용 Windows Subsystem을 설치합니다.

실행 역할 생성


        1단계 실행 역할 생성

실행 역할은 AWS 서비스 및 리소스에 액세스할 수 있는 권한을 Lambda 함수에 부여하는 AWS Identity and Access Management(IAM) 역할입니다. 함수가 Amazon SQS에서 항목을 읽을 수 있도록 허용하려면 AWSLambdaSQSQueueExecutionRole 권한 정책을 연결합니다.

실행 역할을 생성하고 Amazon SQS 권한 정책을 연결하려면
  1. IAM 콘솔에서 역할 페이지를 엽니다.

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

  3. 신뢰할 수 있는 엔터티 유형에서 AWS 서비스를 선택합니다.

  4. 사용 사례에서 Lambda를 선택합니다.

  5. 다음을 선택합니다.

  6. 권한 정책 검색 상자에 AWSLambdaSQSQueueExecutionRole을 입력합니다.

  7. AWSLambdaSQSQueueExecutionRole 정책을 선택한 후 다음을 선택합니다.

  8. 역할 세부 정보에서 역할 이름lambda-sqs-role을 입력한 다음 역할 생성을 선택합니다.

역할을 생성한 후에는 실행 역할의 Amazon 리소스 이름(ARN)을 기록해 둡니다. 이는 이후 단계에서 필요합니다.

함수 생성


        2단계 Lambda 함수 생성

Amazon SQS 메시지를 처리하는 Lambda 함수를 생성합니다. 함수 코드는 Amazon SQS 메시지 본문을 CloudWatch Logs에 로그합니다.

이 자습서에서는 Node.js 18.x 런타임을 사용하지만 다른 런타임 언어의 예제 코드도 제공했습니다. 다음 상자에서 탭을 선택하여 관심 있는 런타임에 대한 코드를 볼 수 있습니다. 이 단계에서 사용할 JavaScript 코드는 JavaScript 탭에 표시된 첫 번째 예제입니다.

.NET
AWS SDK for .NET
참고

GitHub에 더 많은 내용이 있습니다. 서버리스 예제 리포지토리에서 전체 예제를 찾아보고 설정 및 실행 방법을 알아봅니다.

.NET을 사용하여 Lambda로 SQS 이벤트 사용

using Amazon.Lambda.Core; using Amazon.Lambda.SQSEvents; // Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class. [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))] namespace SqsIntegrationSampleCode { public async Task FunctionHandler(SQSEvent evnt, ILambdaContext context) { foreach (var message in evnt.Records) { await ProcessMessageAsync(message, context); } context.Logger.LogInformation("done"); } private async Task ProcessMessageAsync(SQSEvent.SQSMessage message, ILambdaContext context) { try { context.Logger.LogInformation($"Processed message {message.Body}"); // TODO: Do interesting work based on the new message await Task.CompletedTask; } catch (Exception e) { //You can use Dead Letter Queue to handle failures. By configuring a Lambda DLQ. context.Logger.LogError($"An error occurred"); throw; } } }
Go
SDK for Go V2
참고

GitHub에 더 많은 내용이 있습니다. 서버리스 예제 리포지토리에서 전체 예제를 찾아보고 설정 및 실행 방법을 알아봅니다.

Go를 사용하여 Lambda로 SQS 이벤트를 사용합니다.

package integration_sqs_to_lambda import ( "fmt" "github.com/aws/aws-lambda-go/events" "github.com/aws/aws-lambda-go/lambda" ) func handler(event events.SQSEvent) error { for _, record := range event.Records { err := processMessage(record) if err != nil { return err } } fmt.Println("done") return nil } func processMessage(record events.SQSMessage) error { fmt.Printf("Processed message %s\n", record.Body) // TODO: Do interesting work based on the new message return nil } func main() { lambda.Start(handler) }
Java
SDK for Java 2.x
참고

GitHub에 더 많은 내용이 있습니다. 서버리스 예제 리포지토리에서 전체 예제를 찾아보고 설정 및 실행 방법을 알아봅니다.

Java를 사용하여 Lambda로 SQS 이벤트 사용

import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.events.SQSEvent; import com.amazonaws.services.lambda.runtime.events.SQSEvent.SQSMessage; public class Function implements RequestHandler<SQSEvent, Void> { @Override public Void handleRequest(SQSEvent sqsEvent, Context context) { for (SQSMessage msg : sqsEvent.getRecords()) { processMessage(msg, context); } context.getLogger().log("done"); return null; } private void processMessage(SQSMessage msg, Context context) { try { context.getLogger().log("Processed message " + msg.getBody()); // TODO: Do interesting work based on the new message } catch (Exception e) { context.getLogger().log("An error occurred"); throw e; } } }
JavaScript
SDK for JavaScript(v2)
참고

GitHub에 더 많은 내용이 있습니다. 서버리스 예제 리포지토리에서 전체 예제를 찾아보고 설정 및 실행 방법을 알아봅니다.

JavaScript를 사용하여 Lambda로 SQS 이벤트 사용

exports.handler = async (event, context) => { for (const message of event.Records) { await processMessageAsync(message); } console.info("done"); }; async function processMessageAsync(message) { try { console.log(`Processed message ${message.body}`); // TODO: Do interesting work based on the new message await Promise.resolve(1); //Placeholder for actual async work } catch (err) { console.error("An error occurred"); throw err; } }

TypeScript를 사용하여 Lambda로 SQS 이벤트 사용

import { SQSEvent, Context, SQSHandler, SQSRecord } from "aws-lambda"; export const functionHandler: SQSHandler = async ( event: SQSEvent, context: Context ): Promise<void> => { for (const message of event.Records) { await processMessageAsync(message); } console.info("done"); }; async function processMessageAsync(message: SQSRecord): Promise<any> { try { console.log(`Processed message ${message.body}`); // TODO: Do interesting work based on the new message await Promise.resolve(1); //Placeholder for actual async work } catch (err) { console.error("An error occurred"); throw err; } }
PHP
SDK for PHP
참고

GitHub에 더 많은 내용이 있습니다. 서버리스 예제 리포지토리에서 전체 예제를 찾아보고 설정 및 실행 방법을 알아봅니다.

PHP를 사용하여 Lambda로 SQS 이벤트를 사용합니다.

<?php # using bref/bref and bref/logger for simplicity use Bref\Context\Context; use Bref\Event\InvalidLambdaEvent; use Bref\Event\Sqs\SqsEvent; use Bref\Event\Sqs\SqsHandler; use Bref\Logger\StderrLogger; require __DIR__ . '/vendor/autoload.php'; class Handler extends SqsHandler { private StderrLogger $logger; public function __construct(StderrLogger $logger) { $this->logger = $logger; } /** * @param SqsEvent $event * @param Context $context * @return void * @throws InvalidLambdaEvent */ public function handleSqs(SqsEvent $event, Context $context): void { try { foreach ($event->getRecords() as $record) { $body = $record->getBody(); // TODO: Do interesting work based on the new message } } catch (InvalidLambdaEvent $e) { $this->logger->error($e->getMessage()); throw $e; } } } $logger = new StderrLogger(); return new Handler($logger);
Python
SDK for Python (Boto3)
참고

GitHub에 더 많은 내용이 있습니다. 서버리스 예제 리포지토리에서 전체 예제를 찾아보고 설정 및 실행 방법을 알아봅니다.

Python을 사용하여 Lambda로 SQS 이벤트를 사용합니다.

def lambda_handler(event, context): for message in event['Records']: process_message(message) print("done") def process_message(message): try: print(f"Processed message {message['body']}") # TODO: Do interesting work based on the new message except Exception as err: print("An error occurred") raise err
Ruby
SDK for Ruby
참고

GitHub에 더 많은 내용이 있습니다. 서버리스 예제 리포지토리에서 전체 예제를 찾아보고 설정 및 실행 방법을 알아봅니다.

Ruby를 사용하여 Lambda로 SQS 이벤트를 사용합니다.

def lambda_handler(event:, context:) event['Records'].each do |message| process_message(message) end puts "done" end def process_message(message) begin puts "Processed message #{message['body']}" # TODO: Do interesting work based on the new message rescue StandardError => err puts "An error occurred" raise err end end
Rust
SDK for Rust
참고

GitHub에 더 많은 내용이 있습니다. 서버리스 예제 리포지토리에서 전체 예제를 찾아보고 설정 및 실행 방법을 알아봅니다.

Rust를 사용하여 Lambda로 SQS 이벤트를 사용합니다.

use aws_lambda_events::event::sqs::SqsEvent; use lambda_runtime::{run, service_fn, Error, LambdaEvent}; async fn function_handler(event: LambdaEvent<SqsEvent>) -> Result<(), Error> { event.payload.records.iter().for_each(|record| { // process the record tracing::info!("Message body: {}", record.body.as_deref().unwrap_or_default()) }); Ok(()) } #[tokio::main] async fn main() -> Result<(), Error> { tracing_subscriber::fmt() .with_max_level(tracing::Level::INFO) // disable printing the name of the module in every log line. .with_target(false) // disabling time is handy because CloudWatch will add the ingestion time. .without_time() .init(); run(service_fn(function_handler)).await }
Node.js Lambda 함수를 생성하려면
  1. 프로젝트에 대한 디렉터리를 생성하고 해당 디렉터리로 전환합니다.

    mkdir sqs-tutorial cd sqs-tutorial
  2. 샘플 JavaScript 코드를 새로운 index.js 파일에 복사합니다.

  3. 다음 zip 명령을 사용하여 배포 패키지를 생성합니다.

    zip function.zip index.js
  4. create-function AWS CLI 명령을 사용하여 Lambda 함수를 생성합니다. role 파라미터에 앞서 생성한 실행 역할의 ARN을 입력합니다.

    aws lambda create-function --function-name ProcessSQSRecord \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs18.x \ --role arn:aws:iam::111122223333:role/lambda-sqs-role

함수 테스트


        3단계 Lambda 함수 테스트

invoke AWS CLI 명령 및 샘플 Amazon SQS 이벤트를 사용하여 Lambda 함수를 수동으로 호출합니다.

샘플 이벤트를 사용하여 Lambda 함수를 간접적으로 호출하려면
  1. 다음 JSON을 input.json라는 파일로 저장합니다. 이 JSON은 Amazon SQS가 "body"에 대기열의 실제 메시지를 포함하는 Lambda 함수로 보낼 수 있는 이벤트를 시뮬레이션합니다. 이 예제에서 메시지는 "test"입니다.

    예 Amazon SQS 이벤트

    이는 테스트 이벤트이므로 메시지나 계정 번호를 변경할 필요가 없습니다.

    { "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:my-queue", "awsRegion": "us-east-1" } ] }
  2. 다음 AWS CLI 간접 호출 명령을 실행합니다. 이 명령은 응답으로 CloudWatch 로그를 반환합니다. 로그 검색에 대한 자세한 내용은 AWS CLI를 사용하여 로그에 액세스 단원을 참조하십시오.

    aws lambda invoke --function-name ProcessSQSRecord --payload file://input.json out --log-type Tail \ --query 'LogResult' --output text --cli-binary-format raw-in-base64-out | base64 --decode

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

  3. 응답에서 INFO 로그를 찾습니다. 여기에 Lambda 함수가 메시지 본문을 기록합니다. 다음과 유사한 로그가 표시되어야 합니다.

    2023-09-11T22:45:04.271Z 348529ce-2211-4222-9099-59d07d837b60 INFO Processed message test 2023-09-11T22:45:04.288Z 348529ce-2211-4222-9099-59d07d837b60 INFO done

Amazon SQS 대기열 생성


        4단계 Amazon SQS 대기열 생성

Lambda 함수가 이벤트 소스로 사용할 수 있는 Amazon SQS 대기열을 생성합니다.

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

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

  3. 대기열의 이름을 입력합니다. 다른 모든 옵션은 기본 설정으로 둡니다.

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

대기열을 생성한 후 해당 ARN을 기록해 둡니다. 다음 단계에서 대기열을 Lambda 함수와 연결할 때 필요합니다.

이벤트 소스 구성


        5단계 이벤트 소스 매핑 구성

이벤트 소스 매핑을 생성하여 Amazon SQS 대기열을 Lambda 함수에 연결합니다. 이벤트 소스 매핑은 Amazon SQS 대기열을 읽고 새 메시지가 추가되면 Lambda 함수를 간접적으로 호출합니다.

Amazon SQS 대기열과 Lambda 함수 간에 매핑을 생성하려면 AWS CLI create-event-source-mapping 명령을 사용합니다. 예제

aws lambda create-event-source-mapping --function-name ProcessSQSRecord --batch-size 10 \ --event-source-arn arn:aws:sqs:us-east-1:111122223333:my-queue

이벤트 소스 매핑 목록을 가져오려면 list-event-source-mappings 명령을 사용합니다. 예제

aws lambda list-event-source-mappings --function-name ProcessSQSRecord

테스트 메시지 보내기


        6단계 테스트 메시지 전송
Amazon SQS 메시지를 Lambda 함수로 보내려면
  1. Amazon SQS 콘솔을 엽니다.

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

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

  4. 메시지 본문에 테스트 메시지(예: “이것은 테스트 메시지입니다.”)를 입력합니다.

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

Lambda는 업데이트를 위해 대기열을 폴링합니다. 새 메시지가 있는 경우 Lambda는 대기열에서 이 새 이벤트 데이터를 사용하여 함수를 호출합니다. 함수 핸들러가 예외 없이 반환되면 Lambda는 메시지가 성공적으로 처리된 것으로 간주하고 대기열의 새 메시지 읽기를 시작합니다. 메시지를 성공적으로 처리하면 Lambda는 대기열에서 메시지를 자동으로 삭제합니다. 핸들러가 예외를 발생시키면 Lambda는 메시지 배치가 성공적으로 처리되지 않은 것으로 간주하고 Lambda는 동일한 메시지 배치로 함수를 호출합니다.

CloudWatch Logs 확인


        6단계 테스트 메시지 전송
함수가 메시지를 처리했는지 확인하려면
  1. Lambda 콘솔의 함수 페이지를 엽니다.

  2. ProcessSQSRecord 함수를 선택합니다.

  3. 모니터(Monitor)를 선택합니다.

  4. CloudWatch 로그 보기를 선택합니다.

  5. CloudWatch 콘솔에서 함수의 로그 스트림을 선택합니다.

  6. INFO 로그를 찾습니다. 여기에 Lambda 함수가 메시지 본문을 기록합니다. Amazon SQS 대기열을 통해 보낸 메시지가 표시됩니다. 예제

    2023-09-11T22:49:12.730Z b0c41e9c-0556-5a8b-af83-43e59efeec71 INFO Processed message this is a test message.

리소스 정리

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

실행 역할을 삭제하려면
  1. IAM 콘솔에서 역할 페이지를 엽니다.

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

  3. 삭제를 선택합니다.

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

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

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

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

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

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

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

  3. 삭제를 선택합니다.

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

  5. 삭제를 선택합니다.