1

我創建了AWS cloudformation,它創建啓動配置和自動調整組。在此次推出的用戶數據配置我已經配置了文件系統掛載的目標,我安裝了CloudWatch的代理:通過cloudformation啓動實例後userData未得到執行

代碼EDITED

"LaunchConfig":{ 
    "Type":"AWS::AutoScaling::LaunchConfiguration", 
    "Metadata" : { 
     "AWS::CloudFormation::Init" : { 
     "config" : { 
      "files" : { 
      "/etc/cwlogs.cfg": { 
       "content": { "Fn::Join" : ["", [ 
       "[general]", 
       "state_file = /var/awslogs/state/agent-state", 
       "[/var/log/syslog]", 
       "file = /tmp/", 
       "log_group_name = ecs-dataloader", 
       "log_stream_name = ECS-loader", 
       "datetime_format = %b %d %H:%M:%S" 
       ]]}, 
       "mode": "000755", 
       "owner": "root", 
       "group": "root" 
      }, 
      "/etc/ecs/ecs.config": { 
       "content": { "Fn::Join" : ["", [ 
       "ECS_CLUSTER=", { "Ref" : "ClusterName" } 
       ]]}, 
       "mode": "000755", 
       "owner": "root", 
       "group": "root" 
      } 
      }, 
      "commands": { 
      "Update": { 
       "command": "yum -y update" 
      }, 
      "InstallNfs":{ 
       "command": "yum -y install nfs-utils" 
      }, 
      "CreatFolder": { 
       "command": "mkdir -p /efs-mount-point/" 
      }, 
      "EditPerms": { 
       "command": "chown ec2-user:ec2-user /efs-mount-point/" 
      }, 
      "MountPoint": { 
       "command": { "Fn::Join" : ["", [ 
       "AZ=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)\n", 
       "echo LABEL=cloudimg-rootfs/ext4 defaults,discard 0 0\n", 
       "$AZ.",{ "Fn::FindInMap" : [ "FileSystemMap", {"Ref" : "EnvParam"}, "FileSystemID"] }, 
       ".efs.",{ "Ref" : "AWS::Region" },".amazonaws.com:/ /efs-script-import-tmp nfs4 nfsvers=4.1 0 0 >> /etc/fstab" 
       ]]} 
      }, 
      "Mount": { 
       "command": "mount -a -t nfs4" 
      }, 
      "CloudWatchAgent": { 
       "command": { "Fn::Join" : ["", [ 
       "curl https://s3.amazonaws.com/aws-cloudwatch/downloads/latest/awslogs-agent-setup.py -O\n", 
       "python ./awslogs-agent-setup.py --region ",{"Ref" : "AWS::Region"},"\n", 
       "chmod +x ./awslogs-agent-setup.py ./awslogs-agent-setup.py -n -r", 
       {"Ref" : "AWS::Region"}," -c /etc/cwlogs.cfg" 
       ]]} 
      } 
      }, 
      "services" : { 
      "sysvinit" : { 
       "awslogs" : { "enabled" : "true", "ensureRunning" : "true" } 
      } 
      } 
     } 
     } 
    }, 
    "Properties":{ 
     "ImageId":{ "Fn::FindInMap":[ "AWSRegionToAMI", { "Ref":"AWS::Region" }, "AMIID" ] }, 
     "SecurityGroups":[ { "Ref":"EcsSecurityGroup" } ], 
     "InstanceType": {"Ref":"InstanceType" }, 
     "IamInstanceProfile":{ "Ref":"EC2InstanceProfile" }, 
     "KeyName":{ "Fn::FindInMap" : [ "KeyPairMapping", {"Ref" : "EnvParam"}, "Key"] }, 
     "UserData":{ "Fn::Base64" : { 
     "Fn::Join" : ["", [ 
      "#!/bin/bash -xe\n", 
      "/opt/aws/bin/cfn-init -v ", 
      "   --stack ", { "Ref": "AWS::StackName" }, 
      "   --resource LaunchConfig", 
      "   --region ", { "Ref" : "AWS::Region" },"\n" 
     ]]} 
     } 
    } 
    } 

圖像的細節:"eu-west-1": { "AMIID":"ami-ba346ec9" },

運行模板後,資源被成功創建。所以我連接到由autoscaling組通過SSH創建的實例,以查看userData是否已正確運行並進行設置。 不幸的是,經過檢查,這是我在/ etc/fstab文件中發現:

$ cat /etc/fstab 
    LABEL=cloudimg-rootfs / ext4 defaults,discard 0 0 


    $ cat /etc/ecs/ecs.config 
    cat: /etc/ecs/ecs.config: No such file or directory 

的實例未連接到file system,我試圖在cloudformation::init/etc/cwlogs.cfg創建該文件不存在,要麼(這是cloudwatch agent配置文件)。任何人都可以告訴我用戶數據中有什麼問題沒有被執行?

我試圖查看日誌文件,但:

$ cat /var/log/cfn-init.log 
cat: /var/log/cfn-init.log: No such file or directory 

這裏有什麼問題?

編輯

$ cat /var/log/cloud-init-ouput.log 
... 

Cloud-init v. 0.7.6 running 'modules:final' at Fri, 17 Feb 2017 11:43:42 +0000. Up 44.66 seconds. 
+ yum install -y aws-cfn-bootstrap/opt/aws/bin/cfn-init -v --stack Mystack --resource LaunchConfig --region eu-west-1 
Loading "priorities" plugin 
Loading "update-motd" plugin 
Config time: 0.009 
Command line error: no such option: --stack 
Feb 17 11:43:43 cloud-init[2814]: util.py[WARNING]: Failed running /var/lib/cloud/instance/scripts/part-001 [1] 
Feb 17 11:43:43 cloud-init[2814]: cc_scripts_user.py[WARNING]: Failed to run module scripts-user (scripts in /var/lib/cloud/instance/scripts) 
Feb 17 11:43:43 cloud-init[2814]: util.py[WARNING]: Running module scripts-user (<module 'cloudinit.config.cc_scripts_user' from '/usr/lib/python2.7/dist-packages/cloudinit/config/cc_scripts_user.pyc'>) failed 
Cloud-init v. 0.7.6 finished at Fri, 17 Feb 2017 11:43:43 +0000. Datasource DataSourceEc2. Up 45.18 seconds 

回答

1

下面是我解決問題的方法:在調用元數據之前更新用戶數據中的cloud-init,而不是在元數據中安裝cloudwatch代理,而是在用戶數據中執行。

  "UserData":{ "Fn::Base64" : { 
      "Fn::Join" : ["", [ 
       "#!/bin/bash -xe\n", 
       "yum -y install aws-cfn-bootstrap\n", 
       "/opt/aws/bin/cfn-init -v", 
       "   --stack ", { "Ref": "AWS::StackName" }, 
       "   --resource LaunchConfig", 
       "   --region ", { "Ref" : "AWS::Region" },"\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 /etc/cwlogs.cfg || error_exit 'Failed to run CloudWatch Logs agent setup'\n", 
       "service awslogs start" 
      ]]} 
1

用戶數據的日誌文件位於:

  • Linux的雲初始化:/var/log/cloud-init.log
  • 的Windows EC2Config:C:\cfn\log\cloud-init.log

檢查日誌文件中是否有任何內容。如果不是,則從模板傳遞用戶數據腳本時出現問題。 (爲什麼您在加入時有最初的空引號?)

+0

最初的空引號是分隔符。它是空的,因爲我不需要它在用戶數據腳本中。 – Somar

+0

剛剛檢查過'/ var/log/cloud-init.log'找不到那裏的用戶數據。 – Somar

+0

請檢查編輯。我已經更新了代碼。 – Somar

2

cfn-init僅在默認情況下安裝在Amazon Linux AMI上,因此如果您使用任何其他Image ID啓動EC2實例,則需要確保它是在調用之前正確安裝。有關更多信息,請參閱我的previous answer問題「Installing packages using apt-get in CloudFormation file」。

+0

不錯的發現!在Ubuntu雲圖像上顯示用戶數據[安裝](https://help.ubuntu.com/community/CloudInit),但不包含'cfn-init'。 –

+0

我將AMI映像更改爲Linux ECS優化映像,因爲我正在創建ECS羣集。我增強了模板,因爲我意識到我忘記了一些重要的命令。但沒有任何改變。我真的瘋了,我已經嘗試了一切 – Somar

+0

我試着@wjordan解決方案,通過保持Ubuntu映像並添加'cfn-init'安裝;但仍然沒有好結果。簡單的其他測試,我檢查是否安裝了'nfs-utils'軟件包:'rpm -q nfs-utils le paquet nfs-utils n'est pasinstallé' 它說它不是 – Somar