Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
CloudFormation의 푸시 기반 이벤트 소스에 Lambda 함수를 구독할 때 발생하는 오류를 해결하려면 어떻게 해야 합니까?
AWS CloudFormation 스택의 Amazon Simple Storage Service(Amazon S3) 이벤트 알림 또는 Amazon Simple Notification Service(Amazon SNS) 주제에 AWS Lambda 함수를 구독할 수 없습니다.
간략한 설명
AWS::Lambda::EventSourceMapping 리소스를 사용하여 Lambda 함수를 구독하는 경우 "Unrecognized event source, must be kinesis or dynamodb stream." 오류가 발생할 수 있습니다.
이 리소스는 Amazon DynamoDB 이벤트 스트림 및 Amazon Kinesis와 같은 풀 기반 이벤트 소스용으로 설계되었습니다. Amazon S3 이벤트 알림 또는 Amazon SNS 메시지와 같은 푸시 기반 이벤트 소스를 사용하는 경우 이벤트 소스가 Lambda 함수를 간접적으로 호출합니다. 푸시 이벤트 소스가 Lambda 함수를 간접적으로 호출하려면 함수의 리소스 정책이 Lambda 함수를 간접적으로 호출할 수 있는 서비스를 승인해야 합니다.
해결 방법
CloudFormation 템플릿에서 AWS::Lambda::Permission 리소스와 리소스 기반 정책을 추가합니다.
예를 들어 다음 리소스 기반 정책은 Amazon SNS 주제가 Lambda 함수를 간접적으로 호출하도록 허용합니다.
"LambdaResourcePolicy": { "Type": "AWS::Lambda::Permission", "Properties": { "FunctionName" : { "Ref" : "MyFunction" }, "Principal": "sns.amazonaws.com", "Action": "lambda:InvokeFunction", "SourceArn" : { "Ref" : "MySNSTopic" } } }
Amazon SNS 주제 이벤트 소스의 경우 필요한 권한이 있는 주제 정책을 정의해야 합니다.
Amazon S3 이벤트 소스의 경우 Amazon S3 버킷에 Lambda 함수를 구독하는 알림 구성 문이 있어야 합니다. 예를 들면 다음과 같습니다.
{ "AWSTemplateFormatVersion": "2010-09-09", "Parameters": { "BucketPrefix": { "Type": "String", "Default": "test-bucket-name" } }, "Resources": { "EncryptionServiceBucket": { "DependsOn": "LambdaInvokePermission", "Type": "AWS::S3::Bucket", "Properties": { "BucketName": { "Fn::Sub": "${BucketPrefix}-encryption-service" }, "NotificationConfiguration": { "LambdaConfigurations": [ { "Function": { "Fn::GetAtt": [ "AppendItemToListFunction", "Arn" ] }, "Event": "s3:ObjectCreated:*", "Filter": { "S3Key": { "Rules": [ { "Name": "suffix", "Value": "zip" } ] } } } ] } } }, "LambdaInvokePermission": { "Type": "AWS::Lambda::Permission", "Properties": { "FunctionName": { "Fn::GetAtt": [ "AppendItemToListFunction", "Arn" ] }, "Action": "lambda:InvokeFunction", "Principal": "s3.amazonaws.com", "SourceAccount": { "Ref": "AWS::AccountId" }, "SourceArn": { "Fn::Sub": "arn:aws:s3:::${BucketPrefix}-encryption-service" } } }, "AppendItemToListFunction": { "Type": "AWS::Lambda::Function", "Properties": { "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "LambdaExecutionRole", "Arn" ] }, "Code": { "ZipFile": { "Fn::Join": [ "", [ "exports.handler = function(event, context) {", "console.log('Received event: ', JSON.stringify(event, null, 2));", "};" ] ] } }, "Runtime": "nodejs20.x" } }, "LambdaExecutionRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "lambda.amazonaws.com" ] }, "Action": [ "sts:AssumeRole" ] } ] }, "Path": "/", "Policies": [ { "PolicyName": "root", "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:*" ], "Resource": "arn:aws:logs:*:*:log-group:/path/<log-group-name>:log-stream:<log-stream-name>" } ] } } ] } } } }
이 예에서는 S3 버킷과 알림 구성이 동시에 생성됩니다. 이 예에서는 리소스를 생성하는 Fn::GetAtt 내장 함수와 DependsOn 속성을 통해 순환 종속성을 방지합니다.
참고: DependOn 속성이 지정되지 않은 경우 CloudFormation은 S3 버킷과 Lambda 권한 리소스를 동시에 생성합니다.
리소스는 다음과 같은 순서로 생성됩니다.
- AWS Identity and Access Management(IAM) 역할
- Lambda 함수
- Lambda 권한
- S3 버킷
자세한 내용은 CloudFormation에서 오류를 수정하려면 어떻게 해야 합니까?"Unable to validate the following destination configurations"를 참조하십시오.
관련 정보
- 언어
- 한국어

관련 콘텐츠
- 질문됨 일 년 전