Лучшая практика для создания файла в экземпляре AWS EC2 с использованием формирования облака - PullRequest
0 голосов
/ 10 декабря 2018

Есть много вариантов сделать это, и я не знаю, какой из них лучший.Сначала я попытался сделать следующее:

ServiceInstance:
Type: "AWS::EC2::Instance"
Properties:
  ImageId: !Ref AmiId, !Ref LatestOnescoutAmi ]
  InstanceType: !Ref InstanceType
  SubnetId: !ImportValue vpc-stack-PublicASubnet
  SecurityGroupIds:
    - !Ref ServiceSecurityGroup
  KeyName: !Ref KeyName
  UserData:
    'Fn::Base64': !Sub |
      #cloud-config
      write_files:
        - path: /etc/sysconfig/cloudformation
          permissions: 0644
          owner: root
          content: |
            STACK_NAME=${AWS::StackName}
            AWS_REGION=${AWS::Region}
        - path: /etc/datadog-agent/conf.d/mysql.d/conf.yaml
          permissions: 0644
          owner: dd-agent
          content: |
            init_config:
            instances:
            - server: some-db-host
              user: some-admin
              pass: some-password
              port: 3306
              tags:
              - dbinstanceidentifier:someide

      runcmd:
        ## enable datadog agent
        - systemctl start datadog-agent
        - systemctl start application.service

, но затем мой /etc/datadog-agent/conf.d/mysql.d/conf.yaml вырос, и у меня есть около 13 блоков, и нехорошо помещать их жестко в шаблоне.Лучше оставить шаблон универсальным и передать конфигурационный файл в качестве параметра.Но, согласно этому ответу здесь , невозможно передать файл или содержимое файла в формирование облака.

Способ, описанный выше, является самым простым, который я вижу среди других двух вариантов, которые я могу себе представитьо.

  1. Сохраните конфигурацию в SSM, а затем верните ее при запуске ec2.
  2. Создайте группу автоматического масштабирования и запуска, которая принимает путь к файлу, но это более сложночем мне нужно:

    LaunchConfig:
        Type: AWS::AutoScaling::LaunchConfiguration
        Metadata:
          AWS::CloudFormation::Init:
            configSets:
              service_configuration:
              - datadog_setup
            datadog_setup:
              files:
                /etc/datadog-agent/conf.d/mysql.d/conf.yaml:
                  content: "@file://./config/conf-${Env}.yaml"
                  mode: "000644"
                  owner: "root"
                  group: "root"
              commands:
                start_datadog:
                  command: service datadog-agent start
    

Есть идеи, как сделать это простым, универсальным и безопасным способом?Приведенный пример будет оценен.Заранее спасибо.

1 Ответ

0 голосов
/ 13 декабря 2018

Как мне удалось сделать это другим способом, я создал корзину S3, а затем создал роль для своего экземпляра ec2, которая может получить доступ к этой корзине s3 и может загружать файлы, затем в своем разделе runcmd я загрузил этот файл.

  ServiceInstance:
    Type: "AWS::EC2::Instance"
    Properties:
      InstanceType: !Ref InstanceType
      IamInstanceProfile: !Ref InstanceProfile
      UserData:
        'Fn::Base64': !Sub |
          #cloud-config
          write_files:
          - path: /etc/sysconfig/cloudformation
            permissions: 0644
            owner: root
            content: |
              STACK_NAME=${AWS::StackName}
              AWS_REGION=${AWS::Region}
          runcmd:
          - aws s3 cp s3://${ArtifactsBucketName}/dd-get-secrets.py /home/ec2-user/dd-get-secrets.py

  InstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: /
      Roles: [!Ref IAMRole]

  IAMRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
        - Effect: Allow
          Principal:
            Service: [ec2.amazonaws.com]
          Action: ['sts:AssumeRole']
      Path: /
      Policies:

      - PolicyName: allow-downloading-dd-templates
        PolicyDocument:
          Statement:
          - Effect: Allow
            Action:
            - s3:GetObject
            - s3:ListBucket
            Resource: !Sub "arn:aws:s3:::${ArtifactsBucketName}/*"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...