web-dev-qa-db-ja.com

Cloudformationテンプレートでリストアイテムを条件付きにする方法は?

コードパイプラインを作成する次のクラウド形成テンプレートがあります。パイプラインには3つの段階があります。

  Stages:
    -
      Name: "Source"
      Actions:
        -
          Name: "Source"
          ActionTypeId:
            Category: "Source"
            Owner: "ThirdParty"
            Version: "1"
            Provider: "GitHub"
          OutputArtifacts:
            - Name: "MyApp"
          Configuration:
            Owner: !Ref GithubOwner
            Repo: !Ref GithubRepo
            PollForSourceChanges: "true"
            Branch: !Ref GithubBranch
            OAuthToken: !Ref GithubTokenParameter
          RunOrder: 1
    -
      Name: "Run-Unit-Tests"
      Actions:
        -
          InputArtifacts:
            - Name: "MyApp"
          Name: "UnitTests"
          ActionTypeId:
            Category: "Test"
            Owner: "AWS"
            Version: "1"
            Provider: "CodeBuild"
          OutputArtifacts:
            - Name: "MyTests"
          Configuration:
          ProjectName: !Ref CodeBuildName
          RunOrder: 1
    -
      Name: "Deploy-Staging"
      Actions:
        -
          InputArtifacts:
            - Name: "MyApp"
          Name: "Deploy-Staging"
          ActionTypeId:
            Category: "Deploy"
            Owner: "AWS"
            Version: "1"
            Provider: "ElasticBeanstalk"
          Configuration:
            ApplicationName: !Ref BeanstalkApplicationName
            EnvironmentName: !Ref BeanstalkEnvironmentStaging
          RunOrder: 1

私にも条件があります:

IncludeStagingEnv: !Equals [Staging, !Ref CodePipelineEnvironment]

条件がfalseの場合、コードパイプラインステージリストの3番目の項目を省略したいと思います。

AWS :: NoValueで!Ifを使用してみましたが、NoValueは有効なリストアイテムではありません:

Stages:
  - !IF
    - IncludeStagingEnv
    - Name: "Deploy-Staging"
      Actions:
        -
          InputArtifacts:
            - Name: "MyApp"
          Name: "Deploy-Staging"
          ActionTypeId:
            Category: "Deploy"
            Owner: "AWS"
            Version: "1"
            Provider: "ElasticBeanstalk"
          Configuration:
            ApplicationName: !Ref BeanstalkApplicationName
            EnvironmentName: !Ref BeanstalkEnvironmentStaging
            RunOrder: 1
    - AWS::NoValue

IncludeStagingEnv==falseのときに最後の項目を省略するにはどうすればよいですか?

15
Tim W.

Cloudfrontディストリビューションのテンプレートでも同じ問題が発生します。

解決策は、AWS::NoValuewithRef属性を使用することでした。

...
LambdaFunctionAssociations: 
  Fn::If: 
    - Authentication
    - - EventType: "viewer-request"
        LambdaFunctionARN: "arn:aws:lambda:us-east-1:..."
    - - Ref: "AWS::NoValue"
...

これがすべてのリソースで同じように機能する場合は、条件付き部分を次のように変更する必要があります。

Stages:
  - !IF
    - IncludeStagingEnv
    - - Name: "Deploy-Staging"
        Actions:
          - InputArtifacts:
            ...
    - - Ref: "AWS::NoValue"

お役に立てれば!

16
Fabi755

@ Fabi755の答えは私を正しい道に導いてくれてありがとう!

私は同じLambdaFunctionAssociationsチャレンジで戦っていました。私は次のように少し異なる、少し良いアプローチに落ち着きました。複数のオプションのリスト項目で機能するという点で優れていると思います。

          LambdaFunctionAssociations:
          - !If
            - HasOriginResponseFunctionArn
            - EventType: Origin-response
              LambdaFunctionARN: !Ref OriginResponseFunctionArn
            - !Ref AWS::NoValue
          - !If
            - HasViewerRequestFunctionArn
            - EventType: viewer-request
              LambdaFunctionARN: !Ref ViewerRequestFunctionArn
            - !Ref AWS::NoValue
5
Aaron