【问题标题】:Userdata script not executed on AWS CloudFormation Template用户数据脚本未在 AWS CloudFormation 模板上执行
【发布时间】:2019-06-24 13:19:18
【问题描述】:

我正在尝试创建一个 CloudFormation 堆栈,该堆栈具有 UserData 脚本以在启动 EC2 实例时安装 java、tomcat、httpd 和 java 应用程序。 但是,使用所有资源成功创建了堆栈,但是当我连接到 EC2 实例以检查上述应用程序的配置时,我没有找到任何资源。我的用例是使用上述所有应用程序/软件启动一个实例,以自动安装。

UserData:
   Fn::Base64: 
    Fn::Join: 
    - ' '
    - - '#!/bin/bash -xe\n'

      - 'sudo yum update && install pip && pip install https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz\n'
      - 'date > /home/ec2-user/starttime\n'
      - 'sudo yum update -y aws-cfn-bootstrap\n'

        # Initialize CloudFormation bits\n
      - ' ' 
      - '/opt/aws/bin/cfn-init -v\n'
      - '             --stack\n'
      - '!Ref AWS::StackName\n'
      - '             --resource LaunchConfig\n'
      - 'ACCESS_KEY=${HostKeys}&SECRET_KEY=${HostKeys.SecretAccessKey}\n'

       # Start servers\n
      - 'service tomcat8 start\n'
      - '/etc/init.d/httpd start\n'

      - 'date > /home/ec2-user/stoptime\n'
Metadata: 
 AWS::CloudFormation::Init:
  config: 
   packages: 
    yum:
    - java-1.8.0-openjdk.x86_64: []   
    - tomcat8: []
    - httpd: []
   services:
    sysvinit:
     httpd:
      enabled: 'true'
      ensureRunning: 'true'
  files: 
  - /usr/share/tomcat8/webapps/sample.war:
    - source: https://s3-eu-west-1.amazonaws.com/testbucket/sample.war
    - mode: 000500
    - owner: tomcat
    - group: tomcat
   CfnUser:
    Type: AWS::IAM::User
    Properties: 
     Path: '/'  
     Policies: 
     - PolicyName: Admin
       PolicyDocument: 
        Statement:
        - Effect: Allow
          Action: '*'
          Resource: '*'
   HostKeys:
    Type: AWS::IAM::AccessKey
    Properties: 
      UserName: !Ref CfnUser

【问题讨论】:

  • 不清楚是什么问题。登录后会发生什么?这句话不完整。你看到了什么错误信息?
  • 另外,无论您遇到什么问题,不要在您的实例中注入访问密钥和密钥。而是创建一个角色并将该角色分配给您的 EC2 实例。 aws.amazon.com/blogs/aws/…
  • 问题是在创建堆栈时没有安装软件。查看 /var/log/cloud-init.log 文件后,我得到以下信息: cloud-init[3369]: util.py[WARNING]: Failed running /var/lib/cloud/instance/scripts/part-001 [1] util.py [DEBUG]:运行失败 /var/lib/cloud/instance/scripts/part-001 [1] Traceback(最近一次调用最后):文件“/usr/lib/python2.7/site-packages/cloudinit /util.py”,第 860 行,在 runparts subp(prefix + [exe_path], capture=False, shell=True) 文件“/usr/lib/python2.7/site-packages/cloudinit/util.py”,行2053,在 subp cmd=args)

标签: amazon-web-services amazon-ec2 amazon-cloudformation user-data cloud-init


【解决方案1】:

问题在于您格式化 UserData 的方式。我建议您先启动 EC2 实例并手动测试脚本。它有很多问题。

尝试像这样格式化您的 UserData:

UserData:
  Fn::Base64:
    !Sub |
      #!/bin/bash -xe

      # FIXME. This won't work either.
      # sudo yum update && install pip && pip install https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz

      date > /home/ec2-user/starttime
      sudo yum update -y aws-cfn-bootstrap

      # Initialize CloudFormation bits
      /opt/aws/bin/cfn-init -v \
        --stack ${AWS::StackName} \
        --resource LaunchConfig

      # FIXME. Not sure why these are here.
      # ACCESS_KEY=${HostKeys}
      # SECRET_KEY=${HostKeys.SecretAccessKey}

      # Start servers\n
      service tomcat8 start
      /etc/init.d/httpd start

      date > /home/ec2-user/stoptime

注意事项:

  • 您不能在此处使用!Ref 表示法进行插值。请注意,我将其更改为 ${AWS::StackName} 并注意整个块都在 !Sub 内。
  • 正如我的 cmets 所指出的,yum 更新行中包含无效命令。
  • 如 cmets 中所述,注入访问密钥是一种不好的做法。此外,此脚本中的任何内容似乎都不需要密钥。

另请注意,元数据中的文件部分被错误地指定为数组而不是哈希键。

应该是:

  files: 
    /usr/share/tomcat8/webapps/sample.war:
      source: https://s3-eu-west-1.amazonaws.com/testbucket/sample.war
      mode: '000500'
      owner: tomcat
      group: tomcat

【讨论】:

  • 非常感谢您的回答@Alex。我通过编辑您建议的脚本启动了一个实例。我不再在 /var/log/cloud-init.log 中遇到错误,它给了我一个良好的开端。但是,该实例上仍未安装应用程序。我在上面主要问题中提到的脚本的元数据部分是否遗漏了某些内容?请提出建议。
  • 您对 cfn-init 的调用是否指向正确的资源名称? docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/…应该是“包含元数据的资源的逻辑资源ID。”
  • 我更新后发现您的模板中存在另一个语法错误。
  • 您能否详细说明以下评论:您对 cfn-init 的调用是否指向正确的资源名称?它应该是“包含元数据的资源的逻辑资源 ID”。另外,我想知道您在我的脚本中跟踪的另一个语法错误。
  • 包含您的元数据块的资源的资源名称是什么。真的是“LaunchConfig”吗?
猜你喜欢
  • 2018-07-03
  • 2013-07-21
  • 2019-07-06
  • 2020-05-28
  • 1970-01-01
  • 2017-07-02
  • 2019-09-22
  • 2022-12-17
  • 1970-01-01
相关资源
最近更新 更多