如何在GitHub Actions中获取AWS CloudFormation堆栈输出?
我使用CloudFormation模板构建AWS堆栈,部分堆栈会生成输出信息(例如密钥和端点)。比如我的分析堆栈为分析API服务器创建了一个用户,并生成了两个AWS密钥:CubeJsUserAccessKey和CubeJsUserSecretAccessKey,对应的CloudFormation输出配置如下:
Outputs: Endpoint: Description: Endpoint Value: !Join ['', ['https://', !Ref DNSRecord]] CubeJsUserAccessKey: Description: "CubeJS user staging access key id" Value: !Ref CubeJsUserAccessKey Export: Name: Fn::Sub: "${AWS::StackName}-cubejs-access-id" CubeJsUserSecretAccessKey: Description: "CubeJS user access key id" Value: !GetAtt - CubeJsUserAccessKey - CubeJsSecretAccessKey
目前我正在使用GitHub Actions,希望能在流水线中像引用密钥一样使用这些堆栈输出,例如在构建镜像的步骤中:
id: build-image env: ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} ECR_REPOSITORY: analytics-staging IMAGE_TAG: latest NODE_ENV: staging AWS_ACCESS_KEY_ID: ${{ stack-name.outputs.CubeJsUserAccessKey }} AWS_SECRET_ACCESS_KEY: ${{ stack-name.outputs.CubeJsSecretAccessKey }} AWS_DEFAULT_REGION: ${{ secrets.AWS_DEFAULT_REGION }}
现有堆栈运行正常,我不想切换到Terraform,也不想执行delete-stack和create-stack操作,仅需在流水线中构建并标记容器,而构建容器需要用到这些堆栈输出值,请问是否可以通过某种插件或方式轻松获取AWS堆栈输出?
完全可以通过以下两种方式在GitHub Actions中获取现有CloudFormation堆栈的输出,无需改动现有堆栈:
方法一:使用AWS CLI直接获取(推荐,无需额外插件)
在GitHub Actions流水线中添加一个步骤,通过aws cloudformation describe-stacks命令查询堆栈输出,再将结果设置为步骤输出供后续步骤引用:
- 先配置AWS凭证(确保流水线使用的IAM角色拥有
cloudformation:DescribeStacks权限):
- name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v4 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: ${{ secrets.AWS_DEFAULT_REGION }}
- 添加获取堆栈输出的步骤:
- name: Fetch CloudFormation stack outputs id: get-stack-outputs run: | # 查询堆栈输出并转为JSON格式 STACK_OUTPUTS=$(aws cloudformation describe-stacks --stack-name YOUR_STACK_NAME --region ${{ secrets.AWS_DEFAULT_REGION }} --query 'Stacks[0].Outputs' --output json) # 提取所需输出并写入GitHub Actions输出变量 echo "CubeJsUserAccessKey=$(echo "$STACK_OUTPUTS" | jq -r '.[] | select(.OutputKey=="CubeJsUserAccessKey") | .OutputValue')" >> "$GITHUB_OUTPUT" echo "CubeJsUserSecretAccessKey=$(echo "$STACK_OUTPUTS" | jq -r '.[] | select(.OutputKey=="CubeJsUserSecretAccessKey") | .OutputValue')" >> "$GITHUB_OUTPUT"
- 在构建镜像步骤中引用这些输出:
- id: build-image env: ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} ECR_REPOSITORY: analytics-staging IMAGE_TAG: latest NODE_ENV: staging AWS_ACCESS_KEY_ID: ${{ steps.get-stack-outputs.outputs.CubeJsUserAccessKey }} AWS_SECRET_ACCESS_KEY: ${{ steps.get-stack-outputs.outputs.CubeJsUserSecretAccessKey }} AWS_DEFAULT_REGION: ${{ secrets.AWS_DEFAULT_REGION }} # 后续构建命令...
注意:运行环境需要预装jq(GitHub托管的ubuntu-latest镜像默认自带),如果使用其他环境需自行安装。
方法二:使用第三方GitHub Actions插件
可以使用专门用于获取CloudFormation输出的第三方Action(无需手动编写CLI命令),配置时指定堆栈名称和所需输出键即可。这类Action本质是封装了AWS CLI的查询逻辑,使用起来更简洁,但需要确认Action的可靠性和维护状态。
额外注意事项
- 确保流水线使用的IAM权限足够:除了
cloudformation:DescribeStacks,如果需要操作ECR等资源,还需对应权限。 - 若堆栈输出使用了
Export(如示例中的${AWS::StackName}-cubejs-access-id),也可以通过aws cloudformation list-exports命令查询,适合跨堆栈引用的场景。
内容的提问来源于stack exchange,提问作者Igor Shmukler

