Как сделать элемент списка условным в шаблоне Cloud Formation?
У меня есть следующий шаблон формирования облаков, который создает конвейер кода. Трубопровод имеет три этапа:
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]
Когда условие ложно, я хотел бы опустить 3-й элемент в списке этапов Code Pipeline.
Я пытался использовать! Если с AWS :: NoValue, но 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
?
Ответы
Ответ 1
Такая же проблема возникает в моем шаблоне для распространения Cloudfront.
Решение заключалось в использовании AWS::NoValue
с атрибутом Ref
.
...
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"
Надеюсь это поможет!
Ответ 2
@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