【问题标题】:CICD in AWS - GitHub to LambdaAWS 中的 CICD - GitHub 到 Lambda
【发布时间】:2021-10-08 17:27:52
【问题描述】:
我正在尝试构建一个支持下面列出的非常简单的流程的 CICD 管道。我试图在 AWS 中完成这一切(即避免使用 GitHub Actions),我不想手动压缩或传输任何东西。
目标进程:
- Git 将代码推送到 GitHub 存储库。
- AWS 更新现有 Lambda 函数中的代码并相应地更新 $latest 别名。
目前的进展
我已经能够将 AWS CodePipeline 链接到 GitHub。当代码被推送到存储库时,管道会触发并且包含来自 GitHub 的内容的压缩文件被添加到 S3 存储桶中。
从长远来看,我可能会对部署前和部署后的测试、批准等感兴趣......但现在我只想要一个如上所述的简单设置。
挑战
现在我在 S3 中有这个压缩文件,我无法理解如何实际更新 Lamda 函数。我在 CodeDeloy 管道中尝试了各种构建/部署的东西,但我得到了各种错误。我什至不完全确定这整个方法是否是完成我想做的事情的最佳方式?!
问
- 这是实施此类 CICD 管道的有效方法吗?如果不是,请提出替代方案并说明您认为它更好的理由。
- 如何自动从压缩的 S3 文件中获取代码并将其放入 Lambda 函数?
感谢您的帮助!
理查德
【问题讨论】:
标签:
amazon-web-services
github
aws-lambda
aws-codepipeline
cicd
【解决方案1】:
您可以做的是在您的存储库中包含一个 AWS SAM (CloudFormation) 模板。然后,您可以在构建步骤中使用 AWS SAM 的构建/打包步骤,这将创建一个 packaged.yaml CloudFormation 模板。然后,此模板可用于 CloudFormation 部署操作。
这是设置此类流程的 CloudFormation 模板的一部分,为简洁起见省略了一些内容:
CodeBuildProject:
Type: AWS::CodeBuild::Project
Properties:
Name: codebuildproject
Description: Package and Deploy
Artifacts:
Type: CODEPIPELINE
Environment:
Type: LINUX_CONTAINER
ComputeType: BUILD_GENERAL1_SMALL
Image: aws/codebuild/amazonlinux2-x86_64-standard:3.0
EnvironmentVariables:
- Name: IAC_BUCKET
Type: PLAINTEXT
Value: !Sub iac-${AWS::Region}-${AWS::AccountId} # Bucket needed for SAM deployment
ServiceRole: !Ref CodeBuildServiceRole
Source:
Type: CODEPIPELINE
BuildSpec: |
version: 0.2
phases:
install:
runtime-versions:
python: 3.8
commands:
- 'pip install --upgrade --user aws-sam-cli'
build:
commands:
- sam build
- sam package --s3-bucket $IAC_BUCKET --output-template-file packaged.yaml
artifacts:
files:
- 'packaged.yaml'
Pipeline:
Type: AWS::CodePipeline::Pipeline
Properties:
ArtifactStore:
Location: !Sub "codepipeline-${AWS::Region}-${AWS::AccountId}"
Type: S3
Name: deployment-pipeline
RoleArn: !GetAtt PipelineExecutionRole.Arn
Stages:
- Name: Source
Actions:
- YourGithubSourceAction
- Name: Package
Actions:
- Name: SamPackage
ActionTypeId:
Category: Build
Owner: AWS
Provider: CodeBuild
Version: '1'
Configuration:
ProjectName: !Ref CodeBuildProject
InputArtifacts:
- Name: SourceZip
OutputArtifacts:
- Name: samArtifact
RunOrder: 1
- Name: Deployment
Actions:
- Name: CreateChangeSet
ActionTypeId:
Category: Deploy
Owner: AWS
Provider: CloudFormation
Version: '1'
Configuration:
ActionMode: "CHANGE_SET_REPLACE"
ChangeSetName: !Sub "${ApplicationName}-${Environment}-changeset"
Capabilities: CAPABILITY_NAMED_IAM
StackName: your-stack-name
RoleArn: !GetAtt PipelineExecutionRole.Arn
ParameterOverrides: !Sub '{ "Environment" : "${Environment}" }'
TemplatePath: 'samArtifact::packaged.yaml'
InputArtifacts:
- Name: samArtifact
RunOrder: 1
- Name: ExecuteChangeSet
ActionTypeId:
Category: Deploy
Owner: AWS
Provider: CloudFormation
Version: '1'
Configuration:
ActionMode: CHANGE_SET_EXECUTE
ChangeSetName: !Sub ${ApplicationName}-${Environment}-changeset
StackName: your-stack-name
RunOrder: 2
如果您不熟悉 AWS SAM,请务必查看它以了解所有可能性以及如何构建您的模板本身。