使用 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 触发器的主要内容,如果未能解决你的问题,请参考以下文章

yaml中的Cloudformation嵌套堆栈输出

在 CloudFormation yaml 中创建 BucketPolicy 时出错

如何使用 cloudformation 或 yaml 将保留天数设置为日志流

如何在 cloudformation 策略文档中引用资源 ARN? (yaml)

使用 AWS CloudFormation 引用创建 yaml

AWS IAM Cloudformation YAML 模板错误:不允许使用“空”值