云形成:链接到Lambda的S3给出了ARN格式不正确

时间:2017-12-30 20:12:49

标签: amazon-web-services amazon-s3 lambda amazon-cloudformation

我正在尝试使用CloudFormation部署一个在ObjectCreate上调用Lambda函数的S3存储桶。

以下是我的资源:

"ExampleFunction": {
            "Type": "AWS::Lambda::Function",
            "Properties": {
                "Handler": "index.lambda_handler",
                "Code": {
                    "S3Bucket": "bucketname",
                    "S3Key": "something.zip"
                },
                "Runtime": "python3.6",
                "Role": {
                    "Fn::GetAtt": [
                        "LambdaExecutionRole",
                        "Arn"
                    ]
                }
            }
        },
        "InputDataBucket": {
            "Type": "AWS::S3::Bucket",
            "Properties": {
                "BucketName": "input-data",
                "NotificationConfiguration": {
                    "LambdaConfigurations": [
                        {
                            "Function": {
                                "Ref": "ExampleFunction"
                            },
                            "Event": "s3:ObjectCreated:*",
                            "Filter": {
                                "S3Key": {
                                    "Rules": [
                                        {
                                            "Name": "suffix",
                                            "Value": "zip"
                                        }
                                    ]
                                }
                            }
                        }
                    ]
                }
            }
        },
        "LambdaInvokePermission": {
            "Type": "AWS::Lambda::Permission",
            "Properties": {
                "Action": "lambda:InvokeFunction",
                "FunctionName": {
                    "Fn::GetAtt": [
                        "ExampleFunction",
                        "Arn"
                    ]
                },
                "Principal": "s3.amazonaws.com",
                "SourceAccount": {
                    "Ref": "AWS::AccountId"
                },
                "SourceArn": {
                    "Fn::Join": [
                        ":",
                        [
                            "arn",
                            "aws",
                            "s3",
                            "",
                            "",
                            {
                                "Ref": "InputDataBucket"
                            }
                        ]
                    ]
                }
            }
        }

我试图遵循通知配置的文档,该文档说明可能存在循环依赖。但是,如果我按照说明操作,我会得到同样的错误。参考:https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-notificationconfig.html

当我尝试创建堆栈时,S3总是打破它,并显示错误“ARN格式不正确”

我尝试了很多东西,但我总是收到同样的错误。

1 个答案:

答案 0 :(得分:5)

只要我事先知道S3存储桶名称( mybucketname ),我就可以使用它。如果您事先不知道存储桶名称,则可以对此进行增强,以将存储桶名称作为堆栈参数请求,并且它仍然可以正常工作。如果您需要自动生成存储桶名称(因此您无法提前预测名称),那么这将不起作用,您将不得不进行创建/更新路由。

这里的关键是从已知的存储桶名称手动创建S3存储桶ARN,而不是依靠{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "stackoverflow-48037497", "Resources" : { "ExampleFunction": { "Type": "AWS::Lambda::Function", "Properties": { "Handler": "index.lambda_handler", "Code": { "S3Bucket": "bucketname", "S3Key": "something.zip" }, "Runtime": "python3.6", "Role": { "Fn::GetAtt": [ "LambdaExecutionRole", "Arn" ] } } }, "LambdaInvokePermission": { "Type": "AWS::Lambda::Permission", "DependsOn": [ "ExampleFunction" ], "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { "Fn::GetAtt": [ "ExampleFunction", "Arn" ] }, "Principal": "s3.amazonaws.com", "SourceAccount": { "Ref": "AWS::AccountId" }, "SourceArn": "arn:aws:s3:::mybucketname" } }, "InputDataBucket": { "Type": "AWS::S3::Bucket", "DependsOn": [ "ExampleFunction", "LambdaInvokePermission" ], "Properties": { "BucketName": "mybucketname", "NotificationConfiguration": { "LambdaConfigurations": [ { "Function": { "Fn::GetAtt" : [ "ExampleFunction", "Arn" ] }, "Event": "s3:ObjectCreated:*" } ] } } } } } 为您获取存储桶名称。

还值得一读https://softwareengineering.stackexchange.com/questions/3199/what-version-naming-convention-do-you-use

MySQL