You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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模板:

  1. 先在你的CloudFormation模板里定义参数:
Parameters:
  GitCommitSHA:
    Type: String
    Description: 当前Git提交的SHA值

Outputs:
  CommitSHA:
    Value: !Ref GitCommitSHA
  1. 在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 }}
  1. 后续要从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运行时直接替换模板里的占位符:

  1. 模板里预留占位符:
Outputs:
  CommitSHA:
    Value: ${GIT_COMMIT_SHA}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 17:42:11