Функция формирования облака из пользовательского ресурса - PullRequest
0 голосов
/ 03 июля 2018

У меня есть шаблон 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 или вложенных шаблонов.)

1 Ответ

0 голосов
/ 03 июля 2018

Не используйте пользовательский ресурс для поддельных целей.

Функция должна «перезвонить» CloudFormation, когда операция будет завершена. Ваш пользовательский ресурс не имеет кода, поэтому он никогда не перезвонит, поэтому ваш шаблон никогда не завершится.

Если ваш первый пример работает, придерживайтесь его. Ваш второй вариант (кроме неработающего) труден для понимания и поддержки будущими ИТ-специалистами.

Всегда обращайтесь за легким будущим обслуживанием к элегантным хакерам. (Говорит человек, которому приходилось поддерживать элегантные хаки других людей.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...