如何使用 lambda 将 s3 中的最新代码部署到 lambda 函数

Posted

技术标签:

【中文标题】如何使用 lambda 将 s3 中的最新代码部署到 lambda 函数【英文标题】:How to use lamda to deploy latest code put in s3 to lamda function 【发布时间】:2018-03-29 14:21:09 【问题描述】:

我正在尝试在包含它的 s3 存储桶更新时部署我的 lambda 函数。

如果我知道我有最新的 zip lambda 代码,我可以简单地使用云形成来自动创建和部署 lambda 函数


"AWSTemplateFormatVersion": "2010-09-09",
"Description": "AWS CloudFormation CloudWatch Log Janitor Demo Stack",
"Resources": 
    "TestLamdaRole": 
        "Type": "AWS::IAM::Role",
        "Properties": 
            "AssumeRolePolicyDocument": 
                "Version": "2012-10-17",
                "Statement": [
                    "Effect": "Allow",
                    "Principal": 
                        "Service": [
                            "lambda.amazonaws.com"
                        ]
                    ,
                    "Action": [
                        "sts:AssumeRole"
                    ]
                ]
            ,
            "Path": "/"
        
    ,
    "EbsBackupExecutionPolicy": 
        "DependsOn": [
            "TestLamdaRole"
        ],
        "Type": "AWS::IAM::Policy",
        "Properties": 
            "PolicyName": "hamedlamdapolicytest",
            "Roles": [
                "Ref": "TestLamdaRole"
            ],
            "PolicyDocument": 
                "Version": "2012-10-17",
                "Statement": [
                        "Effect": "Allow",
                        "Action": [
                            "logs:*"
                        ],
                        "Resource": [
                            "arn:aws:lambda:us-east-1:1111111111111:function:*"
                        ]
                    ,
                    
                        "Effect": "Allow",
                        "Action": [
                            "ec2:Describe*"
                        ],
                        "Resource": [
                            "*"
                        ]
                    
                ]
            
        
    ,
    "LambdaFuction": 
        "Type": "AWS::Lambda::Function",
        "Properties": 
            "Code": 
                "S3Bucket": "lambda-dep-test",
                "S3Key": "index.zip"
            ,
            "Role": 
                "Fn::GetAtt": [
                    "TestLamdaRole",
                    "Arn"
                ]
            ,
            "Timeout": 60,
            "Handler": "lambda_function.handler",
            "Runtime": "nodejs6.10",
            "MemorySize": 128,
            "FunctionName": "stg1-test"
        
    

但问题是,一旦我运行上面的 lambda 代码,那么每当用户将某物放入存储桶时,最新的代码都不会自动部署。我知道它与 lambda 有关,但我迷路了,我不知道使用哪种方法以及从哪里开始。你能解释一下吗?

【问题讨论】:

没有直接的方法可以实现这一点。在 S3 中创建一个事件。每当添加新文件时,该事件将触发一个不同的 Lambda 函数,该函数将更新原始函数(在本例中:stg1-test) 【参考方案1】:

也可以使用 无服务器 等框架。它们使用简单的命令使部署更容易,并且易于与您的 CI 集成。 https://serverless.com

【讨论】:

感谢您了解该框架。但我想要的是没有任何用户参与的自动部署。框架会这样做吗? Serverless 将 zip 文件部署到配置的 s3 存储桶并触发 lambda 部署。在您的情况下,您仍然需要用户交互才能将 zip 文件上传到 s3。【参考方案2】:

这就是我解决这个问题的方法:

lambda-dep-test 存储桶中启用版本控制 在 CloudFormation 模板中的 AWS::Lambda::Function 声明中,使用 Code 部分中的 S3ObjectVersion 属性来指定应部署的版本。

现在您可以更新模板并在每次更新存储桶中的 lambda 代码时指定一个新的 S3ObjectVersion,或者您可以将其声明为模板中的参数并在 S3ObjectVersion 中引用它。然后可以通过打包和上传 .zip 文件来编写这两种解决方案的脚本。

【讨论】:

您好,如果您可以举一个示例,将 S3ObjectVersion 声明为代码管道中的模板参数,那就太好了,我已经看到有关“Fn::GetArtifactAtt”的 aws 文档,但找不到如何我可以在这种情况下使用它。你能帮忙吗?

以上是关于如何使用 lambda 将 s3 中的最新代码部署到 lambda 函数的主要内容,如果未能解决你的问题,请参考以下文章

AWS CloudFormation 更新 Lambda 代码以在 S3 存储桶中使用最新版本

从 s3 部署包结构问题上传 cloudformation lambda 函数

我的 Lambda 代码在 S3 中的存储位置

我如何使用 aws lambda 将文件写入 s3 (python)?

使用nodejs中的AWS Lambda函数上传音频文件

使用 AWS Lambda (Python 3) 读取存储在 S3 中的 Parquet 文件