#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 и включить gzip2. Вы проверяли какие-либо журналы? В /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, поскольку не знал об этом обновлении. Помечено как завершенное!