无法通过 cloudformation 在 Amazon ECS 优化的 AMI 上安装 cloudwatch 代理

Can't install cloudwatch agent by cloudformation on Amazon ECS-optimized AMI

我正在创建一个 cloudformation 模板,它创建了一些资源作为 EC2 实例,autoscaling grouplaunchConfiguration。 通过 launchConfiguration 资源的 userData 属性,我尝试安装 Cloudwatch agent 如下:

"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 LaunchCongig",
              "         --region ", { "Ref" : "AWS::Region" },"\n",
              "yum -y install wget\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"
            ]]}

ssh 进入实例后,我检查了文件 /var/log/cloud-init-output.log 以查看是否一切正常,但这是我得到的:

+ wget https://s3.amazonaws.com/aws-cloudwatch/downloads/latest/awslogs-agent-setup.py
--2017-02-17 14:36:10--  https://s3.amazonaws.com/aws-cloudwatch/downloads/latest/awslogs-agent-setup.py
Resolving s3.amazonaws.com (s3.amazonaws.com)... 52.216.226.59
Connecting to s3.amazonaws.com (s3.amazonaws.com)|52.216.226.59|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 47998 (47K) [text/x-python]
Saving to: ‘awslogs-agent-setup.py’

     0K .......... .......... .......... .......... ......    100%  196K=0.2s

2017-02-17 14:36:10 (196 KB/s) - ‘awslogs-agent-setup.py’ saved [47998/47998]

+ python ./awslogs-agent-setup.py -n -r eu-west-1 -c /etc/cwlogs.cfg

Step 1 of 5: Installing pip ...Traceback (most recent call last):
  File "./awslogs-agent-setup.py", line 1144, in <module>
    main()
  File "./awslogs-agent-setup.py", line 1140, in main
    setup.setup_artifacts()
  File "./awslogs-agent-setup.py", line 693, in setup_artifacts
    self.install_pip()
  File "./awslogs-agent-setup.py", line 600, in install_pip
    fail("Could not install pip. Please try again or see " + AGENT_SETUP_LOG_FILE + " for more details")
TypeError: fail() takes exactly 2 arguments (1 given)
+ error_exit 'Failed to run CloudWatch Logs agent setup'
/var/lib/cloud/instance/scripts/part-001: line 8: error_exit: command not found
Feb 17 14:36:12 cloud-init[2798]: util.py[WARNING]: Failed running /var/lib/cloud/instance/scripts/part-001 [127]
Feb 17 14:36:12 cloud-init[2798]: cc_scripts_user.py[WARNING]: Failed to run module scripts-user (scripts in /var/lib/cloud/instance/scripts)
Feb 17 14:36:12 cloud-init[2798]: 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 14:36:12 +0000. Datasource DataSourceEc2.  Up 85.78 seconds

这个脚本有什么问题?还有其他安装代理的方法吗? 谢谢。

编辑:

我发现这是因为 python-pip 包可能没有安装所以我将它添加到 userData:

  "yum -y install python-pip\n",

之后我再次播放模板,奇怪的是我得到了同样的错误。

我正在使用 Amazon ECS-optimized AMI

我通过yum awslogs直接安装代理解决了问题:

      "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",
          "yum -y install awslogs\n",
          "service awslogs start"
        ]]}

这是日志文件的输出:

Installed:
  awslogs.noarch 0:1.1.2-1.10.amzn1                                             

Dependency Installed:
  aws-cli.noarch 0:1.11.29-1.45.amzn1                                           
  aws-cli-plugin-cloudwatch-logs.noarch 0:1.3.3-1.15.amzn1                      
  freetype.x86_64 0:2.3.11-15.14.amzn1                                          
  libjpeg-turbo.x86_64 0:1.2.90-5.14.amzn1                                      
  mailcap.noarch 0:2.1.31-2.7.amzn1                                             
  python27-botocore.noarch 0:1.4.86-1.62.amzn1                                  
  python27-colorama.noarch 0:0.2.5-1.7.amzn1                                    
  python27-dateutil.noarch 0:2.1-1.3.amzn1                                      
  python27-docutils.noarch 0:0.11-1.15.amzn1                                    
  python27-futures.noarch 0:3.0.3-1.3.amzn1                                     
  python27-imaging.x86_64 0:1.1.6-19.9.amzn1                                    
  python27-jmespath.noarch 0:0.9.0-1.11.amzn1                                   
  python27-ply.noarch 0:3.4-3.12.amzn1                                          
  python27-pyasn1.noarch 0:0.1.7-2.9.amzn1                                      
  python27-rsa.noarch 0:3.4.1-1.8.amzn1                                         

Complete!
+ service awslogs start
Starting awslogs: [  OK  ]
Cloud-init v. 0.7.6 finished at Fri, 17 Feb 2017 15:33:42 +0000. Datasource DataSourceEc2.  Up 83.47 seconds

这样一切都很好。希望有一天能对某人有所帮助!

具体针对 ECS,请参阅 EC2 容器服务文档中的 Using CloudWatch Logs with Container Instances,了解有关配置 CloudWatch Logs 的详细信息。文档建议使用 yum install -y awslogs 而不是 Python 安装脚本。

文档在 Configuring CloudWatch Logs at Launch with User Data 部分提供了完整示例。

在您的情况下,由于您已经在 CloudFormation 中使用 cfn-initCloudFormation::Init 元数据管理配置文件,因此您不需要对 [=22] 中的配置文件进行任何复杂的解析=] 脚本,但您仍然可以使用该脚本作为参考。 User-Data 脚本中值得添加的一件事是 运行 chkconfig awslogs on 以确保服务在重启后 运行 在实例上继续。