【发布时间】:2020-09-15 06:44:27
【问题描述】:
类似下面的 CloudformationYAML 可以工作。我最终得到一个 lambda 函数,每当新对象出现在 S3 存储桶上时就会触发该函数。
Resources:
myS3BucketResource:
Type: AWS::S3::Bucket
Properties:
BucketName: !Ref myS3BucketName
AccessControl: Private
VersioningConfiguration:
Status: Enabled
LambdaFunction:
Type: 'AWS::Serverless::Function'
Properties:
Handler: main.handler
CodeUri:
Bucket: !Ref CodeBucketName
Key: !Ref CodeKey
Role: !GetAtt
- LambdaRole
- Arn
Runtime: nodejs12.x
Timeout: !Ref LambdaTimeOut
MemorySize: !Ref LambdaMemory
FunctionName: !Sub '${Environment}-${FunctionName}'
Events:
S3Event:
Type: S3
Properties:
Bucket: !Ref myS3BucketResource
Events:
- 's3:ObjectCreated:Put'
但是,我需要做的是让 lambda 函数使用已经存在的 S3 存储桶,该存储桶是由另一个堆栈创建的。请注意,在上面,S3 存储桶是由同样创建 lambda 的同一个 CF 模板创建的。
我似乎不能只引用 S3Event 的 Bucket 属性中的 S3 存储桶名称,如下所示:
Events:
S3Event:
Type: S3
Properties:
Bucket: !Ref myS3BucketName
Events:
- 's3:ObjectCreated:Put'
所以我认为这是因为它需要是资源而不是字符串,至少基于上面的 CF 模板有效。
我读到了关于 Fn::ImportValue 导入由另一个堆栈导出的内容的信息——这就是我需要使用的 S3 存储桶的情况。但我不知道如何在 CF 模板上指定它。
例如,在下面尝试过,但它不起作用。没有Type: AWS::S3::Bucket 行。
Resources:
myS3BucketResource:
Type: AWS::S3::Bucket
Properties:
Bucket:
Fn::ImportValue: !Sub "${exportedS3Bucket}"
任何线索将不胜感激。如果有一种方法可以指定 Bucket 而无需通过导入路线,那真的是最好的。
谢谢!
【问题讨论】:
-
您是否尝试过使用 ARN 而不是名称来配置存储桶?
-
它应该与存储桶名称一起正常工作。您是否从参数中获取存储桶名称?您是否尝试在
Bucket: 'my-bucket'中对其进行硬编码作为测试? -
我还没有尝试过arn,我会试一试。而且我还没有尝试对存储桶名称进行编码。但是我看不出有任何理由说明为什么在 CF 脚本中作为参数提供的存储桶名称的 !Ref 与硬编码不同。我在 CF 脚本的其他部分引用了相同的参数,它工作得很好。但我也会尝试对其进行硬编码。
-
因此,使用 ARN 或对存储桶名称进行编码会导致相同的错误:“Transform AWS::Serverless-2016-10-31 failed with: Invalid Serverless Application Specification document。发现的错误数量: 1. ID为[LambdaFunction]的资源无效。ID为[S3Event]的事件无效。S3事件必须引用同一模板中的S3存储桶。用户请求回滚。"
标签: amazon-web-services amazon-s3 aws-lambda yaml amazon-cloudformation