通过自定义 AMI 的 EC2 实例的 AWS CloudFormation 中的用户数据不起作用
User Data in AWS CloudFormation for an EC2 Instance through a custom AMI not working
我无法弄清楚为什么 shell 脚本中用于在 AWS CloudFormation 中创建 EC2 实例用户数据的 echo 命令不是 运行ning。虽然“sudo systemctl”命令正在运行。
我也试过“sudo echo”,但没用。
没有错误。使用“sudo systemctl”命令在启动时设置为 运行 的 python flask 应用程序工作正常。但是没有创建 .env 文件。
我正在使用来自 AMI 目录的免费亚马逊 Linux 图像:
Amazon Linux 2 AMI (HVM) - 内核 5.10,SSD 卷类型 ami-0c02fb55956c7d316(64 位 (x86))
ImageId 是我在上面提到的 AMI 的基础上为 python flask 应用程序创建的自定义 AMI 的引用。
~/webapp/release is my working directory
# Create EC2 Instance
EC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: !Ref ImageId
InstanceType: t2.micro
KeyName: csye6225
UserData:
Fn::Base64:
!Sub |
#!/bin/bash
cd ~/webapp/release
echo "DB_HOST=\"${DatabaseInstance.Endpoint.Address}\"" >> .env
echo "DB_PORT=\"${DatabaseInstance.Endpoint.Port}\"" >> .env
echo "DB_DATABASE=\"${DatabaseName}\"" >> .env
echo "DB_USERNAME=\"${DatabaseUser}\"" >> .env
echo "DB_PASSWORD=\"${DatabasePassword}\"" >> .env
echo "FILESYSTEM_DRIVER=\"s3\"" >> .env
echo "AWS_BUCKET_NAME=\"${S3Bucket}\"" >> .env
cd /etc/systemd/system
sudo systemctl daemon-reload
sudo systemctl enable flaskapp.service
sudo systemctl start flaskapp.service
sudo systemctl status flaskapp.service
BlockDeviceMappings:
- DeviceName: /dev/xvda
Ebs:
VolumeType: "gp2"
DeleteOnTermination: "true"
VolumeSize: "20"
NetworkInterfaces:
- AssociatePublicIpAddress: "true"
DeviceIndex: "0"
SubnetId: !Ref PublicSubnet2
GroupSet: [!Ref SSHSecurityGroup]
IamInstanceProfile: !Ref DemoInstanceProfile
Tags:
- Key: Name
Value: !Sub "${AWS::StackName}-EC2"
错误日志来自 /var/log/cloud-init-output.log:
Cloud-init v. 19.3-45.amzn2 running 'modules:final' at Fri, 25 Mar 2022 00:46:29 +0000. Up 19.92 seconds.
Created symlink from /etc/systemd/system/multi-user.targer.wants/flaskapp.service to /etc/systemd/system/flaskapp.service.
⬤ flaskapp.service - Flask App service
Loaded: loaded (/etc/systemd/system/flaskapp.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2022-03-25 UTC; 45ms ago
Main PID: 3382 ((bash))
CGroup: /system.slice/flaskapp.service
|__3382 (bash)
默认情况下,用户数据作为 root
执行。 cd ~/webapp/release
将转换为 cd /root/webapp/release
,导致您的错误。
您必须确保您的 webapp/release
在 /root
中或者您使用应用程序的绝对路径,例如:
cd /home/ec2-user/webapp/release
按照@Marcin 的建议,修复了用户数据脚本第一行中文件路径的问题。但是用户数据脚本仍然没有执行。由于我的 AMI 是自定义 AMI,因此我必须添加以下修复程序才能使其正常工作。
为此查找了更多资源,最终 this solution 完美解决。
我的用户数据脚本现在有以下命令:
#!/bin/bash
cd /home/ec2-user/webapp
sudo rm -rf /var/lib/cloud/instance
sudo rm -rf /var/lib/cloud/instances
echo -n "" > .env
echo DB_HOST=${DatabaseInstance.Endpoint.Address} >> .env
echo DB_PORT=${DatabaseInstance.Endpoint.Port} >> .env
echo DB_DATABASENAME=${DatabaseName} >> .env
echo DB_USERNAME=${DatabaseUser} >> .env
echo DB_PASSWORD=${DatabasePassword} >> .env
echo FILESYSTEM_DRIVER=s3 >> .env
echo BUCKET=${S3Bucket} >> .env
echo FLASK_ENV=development >> .env
cd /etc/systemd/system
sudo systemctl daemon-reload
sudo systemctl enable flaskapp.service
sudo systemctl start flaskapp.service
sudo systemctl status flaskapp.service
我无法弄清楚为什么 shell 脚本中用于在 AWS CloudFormation 中创建 EC2 实例用户数据的 echo 命令不是 运行ning。虽然“sudo systemctl”命令正在运行。
我也试过“sudo echo”,但没用。
没有错误。使用“sudo systemctl”命令在启动时设置为 运行 的 python flask 应用程序工作正常。但是没有创建 .env 文件。
我正在使用来自 AMI 目录的免费亚马逊 Linux 图像:
Amazon Linux 2 AMI (HVM) - 内核 5.10,SSD 卷类型 ami-0c02fb55956c7d316(64 位 (x86))
ImageId 是我在上面提到的 AMI 的基础上为 python flask 应用程序创建的自定义 AMI 的引用。
~/webapp/release is my working directory
# Create EC2 Instance
EC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: !Ref ImageId
InstanceType: t2.micro
KeyName: csye6225
UserData:
Fn::Base64:
!Sub |
#!/bin/bash
cd ~/webapp/release
echo "DB_HOST=\"${DatabaseInstance.Endpoint.Address}\"" >> .env
echo "DB_PORT=\"${DatabaseInstance.Endpoint.Port}\"" >> .env
echo "DB_DATABASE=\"${DatabaseName}\"" >> .env
echo "DB_USERNAME=\"${DatabaseUser}\"" >> .env
echo "DB_PASSWORD=\"${DatabasePassword}\"" >> .env
echo "FILESYSTEM_DRIVER=\"s3\"" >> .env
echo "AWS_BUCKET_NAME=\"${S3Bucket}\"" >> .env
cd /etc/systemd/system
sudo systemctl daemon-reload
sudo systemctl enable flaskapp.service
sudo systemctl start flaskapp.service
sudo systemctl status flaskapp.service
BlockDeviceMappings:
- DeviceName: /dev/xvda
Ebs:
VolumeType: "gp2"
DeleteOnTermination: "true"
VolumeSize: "20"
NetworkInterfaces:
- AssociatePublicIpAddress: "true"
DeviceIndex: "0"
SubnetId: !Ref PublicSubnet2
GroupSet: [!Ref SSHSecurityGroup]
IamInstanceProfile: !Ref DemoInstanceProfile
Tags:
- Key: Name
Value: !Sub "${AWS::StackName}-EC2"
错误日志来自 /var/log/cloud-init-output.log:
Cloud-init v. 19.3-45.amzn2 running 'modules:final' at Fri, 25 Mar 2022 00:46:29 +0000. Up 19.92 seconds.
Created symlink from /etc/systemd/system/multi-user.targer.wants/flaskapp.service to /etc/systemd/system/flaskapp.service.
⬤ flaskapp.service - Flask App service
Loaded: loaded (/etc/systemd/system/flaskapp.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2022-03-25 UTC; 45ms ago
Main PID: 3382 ((bash))
CGroup: /system.slice/flaskapp.service
|__3382 (bash)
默认情况下,用户数据作为 root
执行。 cd ~/webapp/release
将转换为 cd /root/webapp/release
,导致您的错误。
您必须确保您的 webapp/release
在 /root
中或者您使用应用程序的绝对路径,例如:
cd /home/ec2-user/webapp/release
按照@Marcin 的建议,修复了用户数据脚本第一行中文件路径的问题。但是用户数据脚本仍然没有执行。由于我的 AMI 是自定义 AMI,因此我必须添加以下修复程序才能使其正常工作。
为此查找了更多资源,最终 this solution 完美解决。
我的用户数据脚本现在有以下命令:
#!/bin/bash
cd /home/ec2-user/webapp
sudo rm -rf /var/lib/cloud/instance
sudo rm -rf /var/lib/cloud/instances
echo -n "" > .env
echo DB_HOST=${DatabaseInstance.Endpoint.Address} >> .env
echo DB_PORT=${DatabaseInstance.Endpoint.Port} >> .env
echo DB_DATABASENAME=${DatabaseName} >> .env
echo DB_USERNAME=${DatabaseUser} >> .env
echo DB_PASSWORD=${DatabasePassword} >> .env
echo FILESYSTEM_DRIVER=s3 >> .env
echo BUCKET=${S3Bucket} >> .env
echo FLASK_ENV=development >> .env
cd /etc/systemd/system
sudo systemctl daemon-reload
sudo systemctl enable flaskapp.service
sudo systemctl start flaskapp.service
sudo systemctl status flaskapp.service