通过自定义 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