获取CloudFormation堆栈输出到GitHub Actions



从CloudFormation模板构建我的AWS堆栈。一些栈产生outputs,例如安全密钥和/或端点。例如,我的分析堆栈为分析API服务器创建了一个用户,并创建了几个AWS密钥:CubeJsUserAccessKeyCubeJsUserSecretAccessKey

Outputs:
Endpoint:
Description: Endpoint
Value: !Join ['', ['https://', !Ref DNSRecord]]
CubeJsUserAccessKey:
Description: "CubeJS user stagin 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行动。我希望能够像引用秘密一样在我的管道中引用这些东西。

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 }}

我知道这可以用steps.{step-id}来完成。然而,我不想切换到terraform或delete-stackcreate-stack,当有一个完美的工作堆栈,只需要一个任务定义更新。

表示堆栈已经存在。我只从管道构建和标记容器。为了构建容器,我需要输出值。我可以很容易地检索AWS堆栈输出使用一些插件或什么?

我今天也在找同样的东西。在一些资源中找到了答案。我们可以通过AWS CLI输出来获取这些,然后将我们需要的内容导出到github工作流中。

这个示例将返回堆栈示例中的第一个输出值,并在本地命令行上工作:

CF_OUTPUT_1=`aws cloudformation --region us-west-2 describe-stacks --stack-name stackname --query "Stacks[0].Outputs[0].OutputValue"`
echo $CF_OUTPUT_1

这是在我的github操作中工作的版本,从现有堆栈导出一个值,然后立即在另一个步骤中使用它:

- name: Get outputs from the stack just created
id: get-outputs
run: >-
echo "::set-output name=ECRURI::$(
aws cloudformation 
--region us-west-2 describe-stacks 
--stack-name $(echo ${GITHUB_REF##*/}) 
--query "Stacks[0].Outputs[0].OutputValue"
)"
- name: Docker build image
shell: bash
run: |
docker buildx build 
-f ./Dockerfile 
--platform=linux/amd64 
-t ${{ steps.get-outputs.outputs.ECRURI }} 
.

关于这个主题的更多深度…没有--query,我们可以看到整个Cloudformation堆栈信息

{
"Stacks": [
{
"StackId": "arn:aws:cloudformation:us-west-2:#############:stack/ep1-122/335b18e0-####-11ed-b288-06a8abe09281",
"StackName": "ep1-122",
"ChangeSetId": "arn:aws:cloudformation:us-west-2:#############:changeSet/samcli-deploy1660747439/692f3efb-####-4d02-930a-f9d1b4c1dc59",
"Parameters": [
{
"ParameterKey": "InfoSlackChannelID",
"ParameterValue": "###########"
}
],
"CreationTime": "2022-08-17T06:09:49.541000+00:00",
"LastUpdatedTime": "2022-08-17T14:44:10.185000+00:00",
"RollbackConfiguration": {},
"StackStatus": "UPDATE_COMPLETE",
"DisableRollback": false,
"NotificationARNs": [],
"Capabilities": [
"CAPABILITY_AUTO_EXPAND",
"CAPABILITY_IAM",
"CAPABILITY_NAMED_IAM"
],
"Outputs": [
{
"OutputKey": "ECRURI",
"OutputValue": "##########.dkr.ecr.us-west-2.amazonaws.com/erc-repo-name",
"Description": "Location of the ECR Repository to commit images",
"ExportName": "ECRURI"
}
],
"RoleARN": "arn:aws:iam::##############:role/some-role-CloudFormationExecutionR-U4GJ10T26U21",
"Tags": [],
"EnableTerminationProtection": false,
"DriftInformation": {
"StackDriftStatus": "NOT_CHECKED"
}
}

对前面这些答案的提示:

  • https://stackoverflow.com/a/41629516/642507
  • https://stackoverflow.com/a/31699657/642507
  • https://github.com/jbranchaud/til/blob/master/github-actions/capture-an-output-value-for-use-in-a-later-step.md

最新更新