如何在CloudFormation模板中获取当前Git Commit SHA?
在GitHub Action中通过CloudFormation引用Git Commit SHA并部署Lambda
问题说明
你尝试在CloudFormation模板的Outputs里用Fn::Sub直接引用GitHub Action的${{ github.sha }},但这种写法行不通——因为CloudFormation的函数是在AWS端解析的,而github.sha是GitHub Action运行环境的本地变量,两者上下文不互通,没法直接在CFN模板里嵌套使用。
正确实现方式
方法一:通过CloudFormation参数传递SHA
这是最规范的做法,把SHA作为参数传给CFN模板:
- 先在你的CloudFormation模板里定义参数:
Parameters: GitCommitSHA: Type: String Description: 当前Git提交的SHA值 Outputs: CommitSHA: Value: !Ref GitCommitSHA
- 在GitHub Action的部署步骤中,用
aws cloudformation deploy命令传入这个参数:
- name: 部署CloudFormation模板 run: | aws cloudformation deploy \ --stack-name your-stack-name \ --template-file path/to/your/template.yml \ --parameter-overrides GitCommitSHA=${{ github.sha }}
- 后续要从S3读取对应版本代码部署Lambda时,直接在模板里用
!Ref GitCommitSHA拼接S3路径即可:
Resources: YourLambdaFunction: Type: AWS::Lambda::Function Properties: Code: S3Bucket: your-code-bucket S3Key: lambda-code/${GitCommitSHA}/function.zip # 其他Lambda配置(如运行时、handler等)
方法二:在GitHub Action中提前替换模板变量
如果不想用CFN参数,可以在Action运行时直接替换模板里的占位符:
- 模板里预留占位符:
Outputs: CommitSHA: Value: ${GIT_COMMIT_SHA}
- 在Action中用
envsubst替换变量并部署:
- name: 替换模板中的Commit SHA run: envsubst < template.yml > deployed-template.yml env: GIT_COMMIT_SHA: ${{ github.sha }} - name: 部署替换后的模板 run: | aws cloudformation deploy \ --stack-name your-stack-name \ --template-file deployed-template.yml
其他部署Lambda的替代思路
- 直接上传代码包到S3再部署:在GitHub Action中先打包Lambda代码,上传到S3的
lambda-code/${{ github.sha }}/function.zip路径,再用上面的方法让CFN引用这个路径完成部署。 - 使用AWS SAM部署:SAM是CloudFormation的Serverless扩展,更适合Lambda这类服务。同样可以通过参数传递SHA,还能自动处理代码包上传:
- name: 部署SAM应用 run: | sam deploy \ --stack-name your-sam-stack \ --parameter-overrides GitCommitSHA=${{ github.sha }} \ --s3-bucket your-sam-bucket
- 用GitHub Action Lambda插件直接部署:跳过CFN,用
aws-actions/aws-lambda-deploy插件直接指定带SHA的S3路径部署:
- name: 部署Lambda函数 uses: aws-actions/aws-lambda-deploy@v1 with: function-name: your-function-name s3-bucket: your-code-bucket s3-key: lambda-code/${{ github.sha }}/function.zip
内容的提问来源于stack exchange,提问作者pt4wirgs
相关产品推荐
相关产品推荐

