【问题标题】:AWS::Lambda::Function, JS file as sourceAWS::Lambda::Function, JS 文件作为源
【发布时间】:2021-01-14 05:35:19
【问题描述】:

我正在尝试通过 cloudformation 部署 lambda 函数。我的项目正在设置中

-src
--lambdas
---lambda1.js
---lambda2.js
---lambda3.js

然后我尝试将每个 lambda 文件作为 lambda 函数上传

Type: AWS::Lambda::Function
    Properties:
      FunctionName: lambda1
      Role: !GetAtt LambdaAtEdgeRole.Arn
      Runtime: nodejs10.x
      Handler: index.handler

现在我正在尝试获取代码,但我没有看到可以上传 JS 文件的任何地方。我可以看到 ZIP,但是我必须为每个文件添加一个构建步骤来压缩它。哪里可以说lambda_src = ./src/lambdas/lambda1.js

【问题讨论】:

  • 像 SAM 和无服务器框架这样的工具可以在这里提供帮助,但如果您愿意,当然可以手动完成。

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


【解决方案1】:

您可以使用 aws cli cloudformation package 将您的 lambda 代码与 cloudformation 打包在一起。但是您需要事先使用 S3 存储桶来执行此操作。

    $ aws cloudformation package \
            --template-file template.yml \
            --output-template-file packaged-template.yml \
            --s3-bucket {s3bucket}

    $ aws cloudformation deploy \
            --template-file packaged-template.yml \
            --stack-name {s3bucket}

以下是目录结构

    $ tree
    ├── template.yml
    ├── lambda_one.py
    └── lambda_two/
        ├── index.py
        └── some_module.py

并且您的 cloudoformation 定义应提供目录路径

   LambdaTwo:
        Type: AWS::Lambda::Function
        Properties:
          Handler: index.lambda_handler
          Code: lambda_two/   #lambda code directory
          Runtime: …
   LambdaOne:
        Type: AWS::Lambda::Function
        Properties:
          Handler: index.lambda_handler
          Code: lambda_one.py    #just one file
          Runtime: …

打包后您的模板将如下所示:

    LambdaOne:
        Properties:
          Code:
              S3Bucket: cf-templates-abcdefghjklm-ap-southeast-2
              S3Key: 35f69109a3a3f87e999f028f034

     ..
   LambdaTwo:
     Properties:
       Code:
         S3Bucket: cf-templates-abcdefghjklm-ap-southeast-2
         S3Key: cca5b023ed6603eabf9421471b65d68b

为简单起见,您可以将整个内容包装到 Makefile 中

最后但并非最不重要的一点是,如果您不想做所有的管道,您可以使用 AWS SAM。您可以查看这个Tutorial: Deploying a Hello World application 来欣赏它。

【讨论】:

  • 我尝试按照您在 LambdaOne(Code: lambdas/lambda1.js) 中定义的代码设置代码,但它给了我以下错误:Value of property Code must be an object
  • 代码没有正确缩进你可以参考这个AWS::Lambda::Function,我更新了缩进,你可以使用cfn-linter
  • 我看不出有什么区别……不知道是缓存还是什么。
  • 不,没有cahcing,更新原模板中的语法后,需要再次打包模板,使用打包好的模板进行部署。
  • 不,你说你的代码有缩进错误,我看不出有什么区别
【解决方案2】:

这里是工作示例,试图重现您的设置以执行 aws cloudformation package

目录结构

.
├── src
│   └── lambdas
│       ├── lambda1.js
│       ├── lambda2.js
│       └── lambda3.js
└── template.yaml

template.yaml

Resources:

  MyFunction1:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: lambda1
      Runtime: nodejs10.x
      Handler: index.handler
      Code: ./src/lambdas/lambda1.js  
  
  MyFunction2:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: lambda1
      Runtime: nodejs10.x
      Handler: index.handler
      Code: ./src/lambdas/lambda2.js  


  MyFunction3:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: lambda1
      Runtime: nodejs10.x
      Handler: index.handler
      Code: ./src/lambdas/lambda3.js 

在项目根目录下执行

aws cloudformation package  --template-file template.yaml --output-template-file output.yml --s3-bucket <your-bucket-name> 

然后你可以部署你的output.yml

【讨论】:

    猜你喜欢
    • 2021-02-11
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 2022-12-01
    • 2019-07-19
    相关资源
    最近更新 更多