我无法弄清楚为什么用于在 AWS CloudFormation 中创建 EC2 实例用户数据的 shell 脚本中的 echo 命令没有运行。当“sudo systemctl”命令正在运行时。
我也尝试过“sudo echo”,但没有成功。
没有错误。使用“sudo systemctl”命令设置为在启动时运行的 python Flask 应用程序工作正常。但没有创建 .env 文件。
我正在使用 AMI 目录中的免费 Amazon 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
关于python - 通过自定义 AMI 获取 EC2 实例的 AWS CloudFormation 中的用户数据不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71610764/