У меня есть шаблон CF, в котором я предоставляю параметр и условно проверяю его, чтобы определить, как создать имя сегмента. Если это продукт, это должно быть «имя». Если это не prod, это должно быть "name_environment", например:
# # # # # # # # # # # # # # # #
# #
# Input Parameters #
# Prefix: t3st-acc0un7-123 #
# Stage: dev #
# #
# Expected S3 Name Output #
# t3st-acc0un7-123-dev #
# t3st-acc0un7-123-dev-2 #
# #
# # # # # # # # # # # # # # # #
# #
# Input Parameters #
# Prefix: t3st-acc0un7-123 #
# Stage: prod #
# #
# Expected S3 Name Output #
# t3st-acc0un7-123 #
# t3st-acc0un7-123-2 #
# #
# # # # # # # # # # # # # # # #
Вот мой шаблон, который делает это:
Parameters:
Prefix:
Type: String
Default: t3st-acc0un7-123
Stage:
Type: String
AllowedPattern: "([a-z]|[0-9])+"
Conditions:
IsProdStage:
Fn::Equals:
- !Ref Stage
- prod
Resources:
TestBucket:
Type: AWS::S3::Bucket
Properties:
BucketName:
Fn::If:
- IsProdStage
- !Ref Prefix
- !Join
- '-'
-
- !Ref Prefix
- !Ref Stage
TestBucket2:
Type: AWS::S3::Bucket
Properties:
BucketName:
Fn::If:
- IsProdStage
- !Join
- '-'
-
- !Ref Prefix
- '2'
- !Join
- '-'
-
- !Ref Prefix
- !Ref Stage
- '2'
В первом примере шаблона логика условного выражения и логического соединения дублируется. Я в основном хочу хранить значение условного выражения для вызова из каждой последующей функции вместо дублирования логики.
В этом следующем примере я пытаюсь использовать пользовательские ресурсы для вызова фиктивной лямбды (поскольку требуется ServiceToken ), поэтому я могу установить свойство Value для TestCustomResource Пользовательский ресурс, основанный на условии и входных данных, и считывание из него других созданных мной ресурсов.
Parameters:
Prefix:
Type: String
Default: t3st-acc0un7-123
Stage:
Type: String
AllowedPattern: "([a-z]|[0-9])+"
Conditions:
IsProdStage:
Fn::Equals:
- !Ref Stage
- prod
Resources:
TestBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !GetAtt TestCustomResource.Value
TestBucket2:
Type: AWS::S3::Bucket
Properties:
BucketName: !Join
- '-'
-
- !GetAtt TestCustomResource.Value
- 2
TestCustomResource:
Type: Custom::Codswallop
Properties:
ServiceToken: !GetAtt DummyLambda.Arn
Value:
Fn::If:
- IsProdStage
- !Ref Prefix
- !Join
- '-'
-
- !Ref Prefix
- !Ref Stage
DummyLambda:
Type: "AWS::Lambda::Function"
Properties:
Code:
ZipFile: >
print("")
Handler: lambda_function.lambda_handler
Role: !GetAtt DummyRole.Arn
Runtime: python3.6
DummyRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Statement:
- Effect: Allow
Principal:
Service:
- lambda.amazonaws.com
Action:
- sts:AssumeRole
RoleName: DummyRole
Я знаю, что это немного нелепо с фиктивной лямбдой, но кажется, что это была бы очень полезная функциональность, чтобы иметь возможность хранить вычисленное значение для использования вокруг шаблона. Во втором примере выдается сообщение об ошибке: TestCustomResource - пользовательский ресурс не смог стабилизироваться в ожидаемое время.
(Возможно, ответ заключается в использовании нескольких шаблонов, которые зависят от предыдущих выходных значений CF или вложенных шаблонов.)