使用 cloudformation yaml 在 Lambda 函数上添加 S3 触发器
Posted
技术标签:
【中文标题】使用 cloudformation yaml 在 Lambda 函数上添加 S3 触发器【英文标题】:add S3 trigger on a Lambda function with cloudformation yaml 【发布时间】:2020-01-29 17:25:29 【问题描述】:所以我想解决这个问题:
-
创建一个 S3 存储桶
将此 S3 存储桶添加为我正在使用的当前 lambda 函数的触发器。
这是必须在 YAML 中完成的事情
我不知道如何设置它... 到目前为止,我所做的是创建一个运行良好的 s3 存储桶,现在我只需要将它作为触发器附加到 lambda 函数。
在 AWS 控制台中进行设置非常容易,但我对 YAML 没有太多经验。所以我不知道如何正确设置它,而且文件非常敏感,所以它很痛苦:-)。
运行时:node.js 10.x希望使用 yaml 的最终结果:
【问题讨论】:
可能重复:***.com/questions/51991413/… 所以从 JSON 转换为 YAML? json2yaml.com 如果您仍然无法做到,请告诉我。我将构建一个示例并发布它 谢谢不知道..我可以尝试...但是我仍然缺少创建 s3-bucket 的部分不要认为它包含在答案中...除非我误解了东西。 我确实知道如何将其从 JSOn 转换为 YAML,但如前所述,我不确定 FunctionsAcesImportNewFileUploaded 是什么以及创建 s3 存储桶的位置等......并且示例将不胜感激。 【参考方案1】:我已经建立了一个小模板,经过测试。
模板是
创建 S3 存储桶。它是触发 Lambda,所有文件都以 txt 结尾。 如果您不想要任何过滤器,请从模板中删除过滤器 创建权限,让 S3 可以触发 Lambda 函数。 (注:我只是 假名,请相应更改) 创建 Lambda(注意:我使用的是现有角色 arn:aws:iam::057351434671:role/lambda_sqs 但您可以创建或使用您组织中的其他角色)YML 版本
---
AWSTemplateFormatVersion: '2010-09-09'
Description: This template is to create all resources for Config Service Api
Parameters:
LambdaArtifactBucketName:
Type: String
Default: befit-artifact
S3BucketName:
Type: String
Default: befit-test-s3
Resources:
ExampleS3:
Type: AWS::S3::Bucket
DependsOn: ExampleInvokePermission
Properties:
BucketName: !Ref S3BucketName
NotificationConfiguration:
LambdaConfigurations:
- Event: s3:ObjectCreated:Put
Filter:
S3Key:
Rules:
- Name: suffix
Value: txt
Function: !GetAtt [ ExampleLambdaFunction, Arn]
ExampleInvokePermission:
Type: AWS::Lambda::Permission
DependsOn: ExampleLambdaFunction
Properties:
FunctionName:
Fn::GetAtt:
- ExampleLambdaFunction
- Arn
Action: lambda:InvokeFunction
Principal: s3.amazonaws.com
SourceArn:
Fn::Sub: arn:aws:s3:::$S3BucketName
ExampleLambdaFunction:
Type: AWS::Lambda::Function
Properties:
Code:
S3Bucket:
Ref: LambdaArtifactBucketName
S3Key: emailnotification-1.0.0.jar
FunctionName: example-lambda-function
Handler: com.xxx.Example::handleRequest
Role: arn:aws:iam::057351434671:role/lambda_sqs
Runtime: java8
Timeout: '300'
MemorySize: 512
Outputs:
S3BucketSecureURL:
Value: !Join ['', ['https://', !GetAtt [ExampleS3, DomainName]]]
Description: Name of S3 bucket
Json 版本
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "This template is to create all resources for Config Service Api",
"Parameters":
"LambdaArtifactBucketName":
"Type": "String",
"Default": "befit-artifact"
,
"S3BucketName":
"Type": "String",
"Default": "befit-test-s3"
,
"Resources":
"ExampleS3":
"Type": "AWS::S3::Bucket",
"DependsOn": "ExampleInvokePermission",
"Properties":
"BucketName": null,
"NotificationConfiguration":
"LambdaConfigurations": [
"Event": "s3:ObjectCreated:Put",
"Filter":
"S3Key":
"Rules": [
"Name": "suffix",
"Value": "txt"
]
,
"Function": null
]
,
"ExampleInvokePermission":
"Type": "AWS::Lambda::Permission",
"DependsOn": "ExampleLambdaFunction",
"Properties":
"FunctionName":
"Fn::GetAtt": [
"ExampleLambdaFunction",
"Arn"
]
,
"Action": "lambda:InvokeFunction",
"Principal": "s3.amazonaws.com",
"SourceArn":
"Fn::Sub": "arn:aws:s3:::$S3BucketName"
,
"ExampleLambdaFunction":
"Type": "AWS::Lambda::Function",
"Properties":
"Code":
"S3Bucket":
"Ref": "LambdaArtifactBucketName"
,
"S3Key": "emailnotification-1.0.0.jar"
,
"FunctionName": "example-lambda-function",
"Handler": "com.xxx.Example::handleRequest",
"Role": "arn:aws:iam::057351434671:role/lambda_sqs",
"Runtime": "java8",
"Timeout": "300",
"MemorySize": 512
,
"Outputs":
"S3BucketSecureURL":
"Value": null,
"Description": "Name of S3 bucket"
模板运行后,输出将是
谢谢,
【讨论】:
当然。随时 。希望对你有帮助 感谢分享,我已经尝试将它放在一起,但没有运气...我正在使用 Node.js 10.x 不确定这是否会对您的答案产生影响?您能否告诉我代码:S3Bucket:参考:LambdaArtifactBucketName S3Key:emailnotification-1.0.0.jar 是如何工作的?在我的堆栈事件中,我可以看到我收到错误:NoSuchBucket 并且我需要为 S3Bucket 和 S3Key 提供一个值?在 ExampleLambdaFunction StrawHat,您需要为您的 lambda 执行提供正确的存储桶和密钥。 您能详细说明一下吗?我不确定什么是正确的 S3Bucket 和 S3Key?我可以看到 Bucket 的 ref 是 LambdaArtifactBucketName 这是一个硬编码的字符串......但是关键?我该如何找回这个?或创造它?我可以看到您指向 emailnotification-1.0.0.jar 为什么指向外部库?如果我想在本地做呢? 为什么有key的属性?您可以在 AWS 中创建一个只有一个 bucketName 的存储桶,那么为什么要附加密钥?以上是关于使用 cloudformation yaml 在 Lambda 函数上添加 S3 触发器的主要内容,如果未能解决你的问题,请参考以下文章
在 CloudFormation yaml 中创建 BucketPolicy 时出错
如何使用 cloudformation 或 yaml 将保留天数设置为日志流
如何在 cloudformation 策略文档中引用资源 ARN? (yaml)