AWS CodePipeline:如何将输出从CloudFormation操作传递到CodeBuild操作

时间:2018-07-14 17:19:51

标签: amazon-web-services amazon-cloudformation aws-codepipeline

我在CloudFormation模板中定义了一个AWS CodePipeline。

管道的步骤之一是CloudFormation操作,该操作为我的应用程序构建测试环境。应用程序的Elastic Load Balancer的URL是此模板中定义的输出之一。

如何访问此输出,以便可以在下一步中使用它,这是一个将在测试环境中运行api测试的CodeBuild操作?

我可以在CloudFormation Deploy步骤中指定一个OutputFileName,但是CodeBuild步骤将需要2个输入工件,测试代码和CloudFormation输出文件,并且最多有1个输入工件。

我认为我可以将CloudFormation输出文件推送到S3,以便api测试步骤可以访问它(或作为CloudFormation :: Init代码的一部分将其推送到S3),但是我我希望可以在CodePipeline步骤中配置一些更简单的内容(类似于CloudFormation中的!ImportValue)。

我还认为我可以分配一个“测试网址”,例如http://test.myapp.com,在CloudFormation步骤中,以便始终针对特定的url运行api测试,这是一个不错的选择,除了我在测试之前就动态地动态测试环境(因为我没有想要它始终运行的成本),并且我不确定在api测试开始运行时DNS是否已经传播。

预先感谢

启动测试环境的CodePipeline CloudFormation操作的定义

...
Name: DeployApplicationInfra
ActionTypeId:
  Category: Deploy
  Owner: AWS
  Version: 1
  Provider: CloudFormation
Configuration:
  ActionMode: CREATE_UPDATE
  Capabilities: CAPABILITY_IAM
  OutputFileName: test-application-infra-stack.outputs.json
  StackName: test-application-infra-stack
  RoleArn: !Ref CloudFormationServiceRoleArn
  TemplateConfiguration: AppInfraCfnTemplate::test-application-infra.config.json
  TemplatePath: AppInfraCfnTemplate::application-infra.yml
InputArtifacts:
  - Name: AppInfraCfnTemplate
OutputArtifacts:
  -  Name: TestApplicationInfraStackOutputs

用于运行api测试的CodePipeline CodeBuild操作的定义

...
Name: RunApiTests
ActionTypeId:
  Category: Test
  Owner: AWS
  Version: 1
  Provider: CodeBuild
Configuration:
  ProjectName: !Ref ApiTestsBuildProject
InputArtifacts:
  - Name: AppSource

...
ApiTestsBuildProject:
  Type: AWS::CodeBuild::Project
  Properties:
    Name: companyinsight-api-tests-build
    Artifacts:
      Type: CODEPIPELINE
    Environment:
      ComputeType: BUILD_GENERAL1_SMALL
      Image: aws/codebuild/nodejs:8.11.0
      Type: LINUX_CONTAINER
    ServiceRole: !Ref CIServerBuildRoleArn
    Source:
      Type: CODEPIPELINE
      BuildSpec: !Sub |
        version: 0.2
        env:
          variables:
            BASE_URL: <Want to inject test app url here!!!>
        phases:
          install:
            commands:
              - npm install
          build:
            commands:
              - npm run api-test

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

不幸的是,目前没有解决方法允许从CodePipeline中为CodeBuild提供2个输入工件。

我现在建议的替代方法是在构建过程中从CLI调用aws cloudformation describe-stacks,然后从堆栈输出中提取ELB主机名。