Рефакторинг повторных параметров в шаблоне формирования облаков? - PullRequest
0 голосов
/ 20 января 2019

Я ищу способ рефакторинга повторного импорта значений в моем шаблоне Cloud Formation.

У меня есть следующий шаблон, который настраивает простое приложение:

Parameters:
  KeyName:
    Description: Name of an existing EC2 KeyPair to enable SSH access into the server
    Type: AWS::EC2::KeyPair::KeyName
  S3StackName:
    Description: Name of S3 Stack
    Type: String

Resources:
  EC2Instance:
    Type: AWS::EC2::Instance
    Metadata:
      AWS::CloudFormation::Init:
        config:
          packages:
            yum:
              httpd: []
              php: []
          files:
            /var/www/html/index.html:
              source:
                Fn::Sub:
                  - https://s3.amazonaws.com/${bucketName}/index.html
                  - bucketName:
                      Fn::ImportValue:
                        !Sub "${S3StackName}-s3Bucket"
            /var/www/html/styles.css:
              source:
                Fn::Sub:
                  - https://s3.amazonaws.com/${bucketName}/styles.css
                  - bucketName:
                      Fn::ImportValue:
                        !Sub "${S3StackName}-s3Bucket"
            /var/www/html/script.js:
              source:
                Fn::Sub:
                  - https://s3.amazonaws.com/${bucketName}/script.js
                  - bucketName:
                      Fn::ImportValue:
                        !Sub "${S3StackName}-s3Bucket"
          services:
            sysvinit:
              httpd:
                enabled: true
                ensureRunning: true
      AWS::CloudFormation::Authentication:
        S3AccessCreds:
          type: S3
          roleName: !Ref EC2InstanceRole
          buckets:
            -
              Fn::ImportValue:
                  !Sub "${S3StackName}-s3Bucket"
    Properties:
      IamInstanceProfile: !Ref EC2InstanceProfile
      InstanceType: t2.micro
      ImageId: ami-1853ac65
      SecurityGroupIds:
        - !Ref MySecurityGroup
      KeyName: !Ref KeyName
      UserData:
        'Fn::Base64':
          !Sub |
            #!/bin/bash -xe
            # Ensure AWS CFN Bootstrap is the latest
            yum install -y aws-cfn-bootstrap
            # Install the files and packages from the metadata
            /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource EC2Instance  --region ${AWS::Region}

  MySecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Open Ports 22 and 80
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: '22'
        ToPort: '22'
        CidrIp: 0.0.0.0/0
      - IpProtocol: tcp
        FromPort: '80'
        ToPort: '80'
        CidrIp: 0.0.0.0/0

Outputs:
  Website:
    Description: The Public DNS for the EC2 Instance
    Value: !Sub 'http://${EC2Instance.PublicDnsName}'

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

Fn::Sub:
  - https://s3.amazonaws.com/${bucketName}/index.html
  - bucketName:
      Fn::ImportValue:
        !Sub "${S3StackName}-s3Bucket"

Этот шаблон используется в общем 4 раза в шаблоне, который я разместилвыше.Я хочу упростить это, я не повторяю один и тот же блок YAML снова и снова.

Моей первой мыслью было добавление значения в раздел метаданных шаблона, но это не сработало, так какраздел ресурсов не может !Ref из раздела метаданных.

Как уменьшить количество повторяющихся YAML в этом шаблоне?

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Вы можете использовать параметры:

Пример:

Parameters:
  FunctionRepeat:
    Fn::Sub:
      - https://s3.amazonaws.com/${bucketName}/index.html
      - bucketName:
          Fn::ImportValue:
            !Sub "${S3StackName}-s3Bucket"

Затем вы можете использовать этот блок где угодно.

Пример:

files:
  /var/www/html/index.html:
    source:
      Ref: FunctionRepeat
  /var/www/html/styles.css:
    source:
      Ref: FunctionRepeat
  /var/www/html/script.js:
    source:
      Ref: FunctionRepeat

Для получения дополнительной информации вы можете перейти к:

0 голосов
/ 20 января 2019

Этого можно достичь с помощью макроса CloudFormation. Это сообщение в блоге дает хороший обзор макросов.Вы можете определить макрос, который вызывает простую лямбда-функцию и преобразует шаблон, так что вы можете делать много интересных вещей с помощью макросов.Вот несколько примеров на GitHub .

Другой вариант исследования - это cfndsl , язык, специфичный для предметной области, который немного упрощает некоторые вещи, такие как параметры и шаблоны.

...