python - 通过自定义 AMI 获取 EC2 实例的 AWS CloudFormation 中的用户数据不起作用

标签 python amazon-web-services flask amazon-ec2 aws-cloudformation

我无法弄清楚为什么用于在 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/

相关文章:

grails - 测试在Amazon和Codeship上失败

python - 带有 Flask 应用程序的 uwsgi 给出 "callable not found or import error"

jquery - Flask URL 路由 : url_for only passes first argument

python - EEG 信号的带宽

algorithm - Amazon SQS 可见性超时是如何实现的?

python - 让两个函数定期运行不同的 'sampling' 次

amazon-web-services - Route 53 如何收费?

python 在双for循环中遍历CTE?

c# - "No module named fcntl"当 py 脚本从 c# 运行但从 Windows 命令行运行时

python - 如何使用 numba 优化 numpy.packbits?