【问题标题】:AWS Cloudformation : Private Network : userdata not working : no outputAWS Cloudformation:私有网络:用户数据不工作:无输出
【发布时间】:2016-03-20 19:37:49
【问题描述】:

您好,我为 Amazon cloudformation 的实例资源编写了以下模板。当我声明 "AssociatePublicIpAddress": "true" 但是当我用 False 例如 "AssociatePublicIpAddress": "false" 声明相同的属性时,以下代码正在工作>。用户数据不工作。附上代码。对此有任何建议都会很好。

"InstanceABC": {
  "Type": "AWS::EC2::Instance",
  "Metadata": {
   "Comment": "Install prepration for CloudWatch Log Agent",
   "AWS::CloudFormation::Init": {
    "config": {
      "files": {
          "/var/log/abccw.conf": {
            "content": {"Fn::Join": ["",[
                        "[general]\n",
                        "state_file= /var/awslogs/agent-state\n",
                        "[/var/log/cfcw.log]\n",
                        "file = /var/log/cfcw.log\n",
                        "log_group_name = ",{"Ref": "CloudWatchLogGroupProtectV"},"\n",
                        "log_stream_name = ProtectVLog\n",
                        "datetime_format = %d/%b/%Y:%H:%M:%S"
            ]]},
            "mode": "000400",
            "owner": "root",
            "group": "root"
                  },
          "/etc/cfn/cfn-hup.conf": {
            "content": {"Fn::Join": ["",[
                        "[main]\n",
                        "stack=",{"Ref": "AWS::StackId"},"\n",
                        "region=",{"Ref": "AWS::Region"},"\n"
            ]]},
            "mode": "000400",
            "owner": "root",
            "group": "root"
          },
          "/etc/cfn/hooks.d/cfn-auto-reloader.conf": {"content": {"Fn::Join": ["",[
                                                                               "[cfn-auto-reloader-hook]\n",
                                                                               "triggers=post.update\n",
                                                                               "path=Resources.InstanceABC.Metadata.AWS::CloudFormation::Init\n",
                                                                               "action=/opt/aws/bin/cfn-init -s ",{"Ref": "AWS::StackId"}," -r InstanceABC "," --region     ",{"Ref": "AWS::Region"},"\n",
                                                                               "runas=root\n"
          ]]}}
   }}}
  },
  "Properties": {
    "ImageId": {"Ref": "someImageID"},
    "InstanceType": {"Ref": "someInstanceType"},
    "KeyName": {"Ref": "someKeyPairName"},
    "IamInstanceProfile": {"Ref": "IAMProfilesome"},
    "DisableApiTermination": "False",
    "Tags": [{"Key": "Name","Value": "ABCInstance"}],
    "NetworkInterfaces": [{"AssociatePublicIpAddress": "true","DeviceIndex": "0","DeleteOnTermination": "true","SubnetId": {"Ref": "SomeSubnet"},"GroupSet": [{"Ref": "SecurityGroupSome"}]}],
    "BlockDeviceMappings": [{"DeviceName": "/dev/xvda","Ebs": {"VolumeType": "gp2","DeleteOnTermination": "false","VolumeSize": "8"}}],
    "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [
        "#!/bin/sh \n",
        "# Get the latest CloudFormation package\n",
        "apt-get update\n",
        "apt-get -y install python-setuptools\n",
        "wget -P /root https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz\n",
        "mkdir -p /root/aws-cfn-bootstrap-latest\n",
        "tar xvfz /root/aws-cfn-bootstrap-latest.tar.gz --strip-components=1 -C /root/aws-cfn-bootstrap-latest\n",
        "easy_install /root/aws-cfn-bootstrap-latest/\n",
        "# Start cfn-init\n",
        "/usr/local/bin/cfn-init -s ",{"Ref": "AWS::StackId"}," -r InstanceABC "," --region ",{"Ref": "AWS::Region"}," || error_exit 'Failed to run cfn-init'\n",
        "# Start up the cfn-hup daemon to listen for changes to the EC2 instance metadata\n",
        "/usr/local/bin/cfn-hup || error_exit 'Failed to start cfn-hup'\n",
        "# Get the CloudWatch Logs agent\n",
        "wget https://s3.amazonaws.com/aws-cloudwatch/downloads/latest/awslogs-agent-setup.py\n",
        "# Install the CloudWatch Logs agent\n",
        "python awslogs-agent-setup.py -n -r ",{"Ref": "AWS::Region"}," -c /var/log/abccw.conf || error_exit 'Failed to run CloudWatch Logs agent setup'\n",
        "# All done so signal success\n",
        "/usr/local/bin/cfn-signal -e $? ","         --stack ",{"Ref": "AWS::StackName"},"         --resource InstanceABC ","         --region ",{"Ref": "AWS::Region"},"\n",
        "echo \"************************************************************\" >> /var/log/cfcw.log \n",
        "echo \"Instance ABC Logs: Start\" >> /var/log/cfcw.log \n",
        "echo \"------------------------------------------------\" >> /var/log/cfcw.log \n",
        "echo \"------------------------------------------------\" >> /var/log/cfcw.log \n",
        "echo \"Instance ABC Logs: End\" >> /var/log/cfcw.log \n",
        "echo \"************************************************************\" >> /var/log/cfcw.log \n",
    ]]}}
  }
}

提前致谢

【问题讨论】:

  • “用户数据不起作用”是什么意思?您是否看到错误消息?
  • 没有错误消息,但是在私有环境中创建实例时不会处理 userdata 中的脚本,因为我在 cloudwatch 和机器上都看不到任何输出。
  • 您查看过实例上的 /var/log/cloud-init.log 吗?
  • 是的,在查看 cloud-init.log 时,我发现我的 userdata 脚本已写入 /var/lib/cloud/instances//user-data.txt。好像没问题。因为我也检查过同样的
  • 在没有公网IP的情况下,您的实例还能上网吗? (如果有,请检查 NAT/VPC 权限)。我注意到您通过 HTTPS 协议而不是通过 CLI 使用 S3,这可能会根据该设置而改变,并导致脚本挂起和中断。

标签: amazon-web-services amazon-cloudformation amazon-cloudwatch


【解决方案1】:

cmets 中的@Robbie 走在了正确的轨道上。

实例无法连接到公共互联网以提取您在用户数据中引用的内容。如果您需要它工作并且希望它在私有子网中工作,您需要在您的 VPC 中有一台 NAT 机器,该机器能够代理进出互联网的流量。

【讨论】:

  • @Robbie,为了测试我已经删除了 https 请求以及 apt-get 请求,但是没有运气,仍然没有执行脚本,并且没有文件被创建为 /var/log/cfcw .log
  • 我找到了解决问题的方法。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 2019-07-19
  • 2021-09-05
  • 2020-12-21
相关资源
最近更新 更多