Как получить значение конфигурации json из шаблона CloudFormation? - PullRequest
1 голос
/ 12 марта 2020

У меня есть следующий шаблон облачной информации. MyCodePipeline имеет сценическое действие, называемое DeployAction. Одним из его значений конфигурации является StackName: TestStackName. Какую функцию я должен использовать, чтобы получить значение (TestStackName) этого ключа (StackName) из этого шаблона? Я не мог использовать! GetAtt, так как CodePipeline имеет только доступный атрибут Version.

Resources:

  MyCodePipeline:
    Type: AWS::CodePipeline::Pipeline
    Properties:
      RoleArn: !GetAtt MyCodePipelineRole.Arn
      ArtifactStore:
        Location: !Ref ArtifactsStore
        Type: S3
      Stages:
        - Name: Source
          Actions:
          - Name: SourceAction
            ActionTypeId:
              Category: Source
              Owner: ThirdParty
              Version: '1'
              Provider: GitHub
            OutputArtifacts:
              - Name: SourceArtifact
            Configuration:
              Owner: GitHubOwner
              Repo: GitHubRepo
              PollForSourceChanges: 'false'
              Branch: GitHubBranch
              OAuthToken: GitHubToken
            RunOrder: 1
        - Name: Deploy
          Actions:
            - Name: DeployAction
              ActionTypeId:
                Category: Deploy
                Owner: AWS
                Version: '1'
                Provider: CloudFormation
              Configuration:
                ActionMode: CREATE_UPDATE
                StackName: TestStackName --> I want to export this name

  MyCodePipelineRole:
    Type: AWS::IAM::Role
    Properties: 
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Principal:
            Service:
            - 'codepipeline.amazonaws.com'
            - 'cloudformation.amazonaws.com'
            - 'apigateway.amazonaws.com'
          Action:
          - 'sts:AssumeRole'

  ArtifactsStore:
    Type: AWS::S3::Bucket
    Properties:
      AccessControl: Private
      VersioningConfiguration:
        Status: Enabled
      BucketName: my-artifacts-store

Outputs:
  TestStackName:
    Description: MyCodePipeline.DeployActionStage.Configuration.TestStackName
    Value: ????? --> What should I use here to get the TestStackName?
    Export:
      Name: MyCodePipeline-DeployActionStage-Configuration-TestStackName

1 Ответ

1 голос
/ 12 марта 2020

Мы можем предоставить это имя как CodePipeline, так и выходным данным, извлекая его в раздел Mappings .

В приведенном ниже примере я создал структуру Mappings, которая содержит StackName. Чтобы использовать функцию !FindInMap , нам нужна двухуровневая карта , поэтому она выглядит немного сложной. Не стесняйтесь предлагать улучшения:)

Mappings:
  MetaInfo:
    Names:
      StackName: TestStackName

Resources:

  MyCodePipeline:
    Type: AWS::CodePipeline::Pipeline
    Properties:
      ...
      Stages:
        ...
        - Name: Deploy
          Actions:
            - Name: DeployAction
              ...
              Configuration:
                ActionMode: CREATE_UPDATE
                StackName: !FindInMap [MetaInfo, Names, StackName]
...

Outputs:
  TestStackName:
    Description: MyCodePipeline.DeployActionStage.Configuration.TestStackName
    Value: !FindInMap [MetaInfo, Names, StackName]
    Export:
      Name: MyCodePipeline-DeployActionStage-Configuration-TestStackName

Это дает мне следующие результаты в консоли CloudFormation:

Key: TestStackName
Value: TestStackName
Description: MyCodePipeline.DeployActionStage.Configuration.TestStackName
Export name: MyCodePipeline-DeployActionStage-Configuration-TestStackName
...