AWS CloudFormation, обновление стека не изменяет мою конфигурацию EC2

#amazon-web-services #nginx #amazon-ec2 #amazon-cloudformation

#amazon-web-services #nginx #amazon-ec2 #amazon-облачная информация

Вопрос:

Я пытаюсь убедиться, что моя CloudFormation создает стек, который можно изменить с помощью Update или наборов изменений. Я понимаю, что для достижения этой цели мне нужно использовать сценарии cfn-hup и init, и то, что у меня есть, похоже, работает с обновлением групп безопасности в моем файле CloudFormation, но это вообще не меняет фактическую инфраструктуру веб-сервера. Я думал, что смогу добавлять / удалять пакеты или обновлять файлы конфигурации, и эти изменения будут отражены.

Разве это невозможно? (Я использую Amazon Linux 2)

Вот мой файл. Я чувствую, что это должно обновлять конфигурационный файл nginx, если он когда-либо изменится?

Из того, что я могу сказать, читая документы AWS, используя services.sysvinit.nginx.files , затем следует отслеживать мою конфигурацию nginx, которая указана в списке, и перезагружать nginx после миграции, если обнаружено изменение. Он также должен обновлять файл nginx с любыми новыми изменениями в server {} блоке, который у меня есть.

 AWSTemplateFormatVersion: "2010-09-09"

Parameters:

  VPC:
    Description: "ID of VPC"
    Type: String

  AMI:
    Description: "ID of base image"
    Type: String

  KeyName:
    Description: "Name of an existing EC2 KeyPair to enable SSH access to the instance"
    Type: "AWS::EC2::KeyPair::KeyName"
    ConstraintDescription: "Must be the name of an existing EC2 KeyPair."

  InstanceType:
    Description: "Amazon Instance Type"
    Default: t2.micro
    Type: String

  SSHLocation:
    Description: "IP address range that can be used to SSH to EC2 Instance"
    Type: String
    MinLength: 9
    MaxLength: 18
    Default: 0.0.0.0/0

Resources:

  ApiEc2Instance:
    Type: AWS::EC2::Instance
    Metadata:
      AWS::CloudFormation::Init:
        configSets:
          InstallAndRun:
            - Configure
            - Install

        # install packages and setup files
        Install:
          packages:
            yum:
              php: []
              php-fpm: []
              php-mbstring: []
              php-bcmath: []
              php-pdo: []
              nginx: []

          files:
            /etc/nginx/conf.d/default.conf:
              content: !Sub |
                server {
                  listen 80;

                  root /var/www/html;

                  index index.php index.html index.htm;

                  gzip on;
                  gzip_vary off;
                  gzip_proxied static;
                  gzip_comp_level 6;
                  gzip_buffers 16 8k;
                  gzip_http_version 1.1;
                  gzip_types text/plain application/json;

                  charset utf-8;

                  location / {
                      try_files $uri $uri/ /index.php?$query_string;
                  }

                  location ~ .php$ {
                      try_files $uri /index.php =404;
                      fastcgi_split_path_info ^(. .php)(/. )$;
                      fastcgi_pass unix:/var/run/php-fpm/www.sock;
                      fastcgi_index index.php;
                      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                      include fastcgi_params;
                  }
                }

            /etc/php.d/default.ini:
              content: !Sub |
                display_errors = On

            /etc/cfn/cfn-hup.conf:
              content: !Sub |
                [main]
                stack=${AWS::StackId}
                region=${AWS::Region}
                verbose=1
                interval=5
              mode: 000400
              owner: root
              group: root

            /etc/cfn/hooks.d/cfn-auto-reloader.conf:
              content: !Sub |
                [cfn-auto-reloader-hook]
                triggers=post.update
                path=Resources.ApiEc2Instance.Metadata.AWS::CloudFormation::Init
                action=/opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource ApiEc2Instance --configsets InstallAndRun --region ${AWS::Region}
                runas=root
              mode: 000400
              owner: root
              group: root

          services:
            sysvinit:
              nginx:
                enabled: true
                ensureRunning: true
                files:
                  - /etc/nginx/conf.d/default.conf
              cfn-hup:
                enabled: true
                ensureRunning: true
                files:
                  - /etc/cfn/cfn-hup.conf
                  - /etc/cfn/hooks.d/cfn-auto-reloader.conf

        # configure any separate execution scripts
        Configure:
          commands:
            01_update_php:
              command: "amazon-linux-extras enable php7.4 nginx1 ansible2"
              test: "! grep -Fxq '[amzn2extra-php7.4]' /etc/yum.repos.d/amzn2-extras.repo"

    Properties:
      ImageId: !Ref "AMI"
      InstanceType: !Ref "InstanceType"
      SecurityGroupIds:
        - !Ref ApiSSHSecurityGroup
        - !Ref ApiWebSecurityGroup
      KeyName: !Ref KeyName
      Tags:
        - Key: Name
          Value: "API Sandbox"
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash -xe
          yum update -y aws-cfn-bootstrap

          # Install the files and packages from the metadata
          /opt/aws/bin/cfn-init -v 
            --stack ${AWS::StackName} 
            --resource ApiEc2Instance 
            --configsets InstallAndRun 
            --region ${AWS::Region}

          # Signal the status from cfn-init
          /opt/aws/bin/cfn-signal -e $? 
            --stack ${AWS::StackName} 
            --resource ApiEc2Instance 
            --region ${AWS::Region}

          #
          service nginx reload
    CreationPolicy:
      ResourceSignal:
        Timeout: PT5M

  ApiSSHSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: API SSH Admins
      GroupDescription: Enable public access via port 22
      VpcId: !Ref "VPC"
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: !Ref "SSHLocation"

  ApiWebSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: API Public Web
      GroupDescription: Enable public web access via multiple ports
      VpcId: !Ref "VPC"
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIp: 0.0.0.0/0
 

Комментарии:

1. Примером того, чего я пытаюсь достичь, было бы изменить строку gzip с gzip off на gzip on и загрузить новый конфигурационный yaml в виде набора изменений и выполнить его в стеке, чтобы изменить мою конфигурацию nginx и включить gzip

2. Вы проверяли какие-либо журналы? В /var/log должны быть /var/log для hup и userdata.

3. Также какой ami вы используете? Amazon Linux 2?

4. Привет, да, я проверил журналы. Все для первоначального создания было отличным, но выполнение набора изменений не внесло изменений в журналы. Я проверил cfn-init.log и cloud-init-output.log и cloud-init.log . Ничего не меняется. Даже если я добавлю / удалю новый пакет из пакетов. раздел yum.

5. Набор изменений не обнаружит никаких изменений в cfn-init. Вы должны попробовать на самом деле обновить стек.

Ответ №1:

На основе обсуждения в чате.

hup по умолчанию обновление занимает 15 минут. Таким образом, проблема была вызвана тем, что на этот раз не было ожидания, поскольку казалось, что hup это сбой или ничего не делает в течение 15 минут.

Время можно настроить с помощью interval переменной, как показано в документации.

Комментарии:

1. Спасибо @Marcin. 15-минутный интервал был неотъемлемой частью решения проблемы. Кажется, конфигурация всегда работала, я просто не стал дожидаться запуска cfn-hup, поскольку не знал об этом обновлении. Помечено как завершенное!