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

如何在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命令查询堆栈输出,再将结果设置为步骤输出供后续步骤引用:

  1. 先配置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 }}
  1. 添加获取堆栈输出的步骤:
- 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"
  1. 在构建镜像步骤中引用这些输出:
- 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 06:24:33