在参数ZipFile AWS :: Lambda :: Function上上传本地文件

时间:2019-02-26 00:34:36

标签: aws-lambda amazon-cloudformation

我有一个带有AWS :: Lambda :: Function资源的CloudFormation模板,并且我试图将本地zip文件作为代码上传,但是没有上传。 Lambda函数是在没有代码文件的情况下创建的。

    Resources:
  mastertestingLambdaDataDigestor:
    Properties:
      Code:
        ZipFile: fileb:///home/dariobenitez/Proyectos/dataflow/templates/lambda_template.zip
      FunctionName: mastertesting_Kinesis2DynamoDB_Datapipeline
      Handler: handler.kinesis_to_dynamodb
      Role: SOMEROLE
      Runtime: python3.6
    Type: AWS::Lambda::Function

当我尝试使用CLI部署相同功能时,zip文件路径参数有效。有想法吗?

非常感谢!

2 个答案:

答案 0 :(得分:3)

您不能在此处指定文件路径。您必须输入功能代码本身。限制为4096个字节。如果您的代码较大,则需要先将其上传到S3并使用S3BucketS3Key

示例:

mastertestingLambdaDataDigestor:
  Properties:
    Code:
      ZipFile: >
        def handler(event, context):
          pass
    FunctionName: mastertesting_Kinesis2DynamoDB_Datapipeline
    Handler: handler.kinesis_to_dynamodb
    Role: SOMEROLE
    Runtime: python3.6
  Type: AWS::Lambda::Function

另一个选择是使用aws cloudformation package。它将为您上传zip文件,并将模板转换为具有正确路径的模板。为此,您必须将zip文件路径直接放在Code中。例如:

Resources:
  mastertestingLambdaDataDigestor:
    Properties:
      Code: /home/dariobenitez/Proyectos/dataflow/templates/lambda_template.zip
      FunctionName: mastertesting_Kinesis2DynamoDB_Datapipeline
      Handler: handler.kinesis_to_dynamodb
      Role: SOMEROLE
      Runtime: python3.6
    Type: AWS::Lambda::Function

然后运行:

aws cloudformation package --template-file my-template.yaml --s3-bucket my-bucket

它应该输出如下内容:

Resources:
  mastertestingLambdaDataDigestor:
    Properties:
      Code:
        S3Bucket: my-bucket
        S3Key: fjklsdu903490f349034g
      FunctionName: mastertesting_Kinesis2DynamoDB_Datapipeline
      Handler: handler.kinesis_to_dynamodb
      Role: SOMEROLE
      Runtime: python3.6
    Type: AWS::Lambda::Function

然后您应该使用此模板来部署堆栈。

答案 1 :(得分:0)

以下模式对我有用:

  1. 在lambda定义中放入一些伪代码

    Properties: Code: ZipFile: > def handler(event, context): pass

  2. 使用Cloudformation进行打包

    $ aws cloudformation package --template-file\ /src/apigateway/cf.yml --s3-bucket <SOME_BUCKET>\ --output-template-file packaged-template.json

  3. 更新lambda代码

aws lambda update-function-code \ --function-name my-function \ --zip-file fileb://my-function.zip

  1. 由于Cloudformation从不关心lambda函数中的代码。因此,即使我们重新部署Cloudformation,您的lambda代码仍将与您使用CLI更新的代码相同。

如果我们只想上传lambda代码,并使用上传的参考信息更新Cloudformation,则可以使用Cloudformation包命令。

  1. 在Cloudformation中放入类似的内容

    Properties: Code:

  2. 然后运行

    $ aws cloudformation package --template-file\ /src/apigateway/cf.yml --s3-bucket <SOME_BUCKET>\ --output-template-file packaged-template.json

  3. 这将更新Cloudformaion

    $ grep S3 packaged-template.json -B 2 Properties: Code: S3Bucket: <SOME_BUCKET> S3Key: 77807d1ae2c2e590e0b928ac579c3aee