【问题标题】:EC2 instance loads my user-data script but doesn't run itEC2 实例加载我的用户数据脚本但不运行它
【发布时间】:2014-02-04 14:44:02
【问题描述】:

代码:

#!/usr/bin/env python

import boto.ec2

conn_ec2 = boto.ec2.connect_to_region('us-east-1') # access keys are environment vars

my_code = """#!/usr/bin/env python

import sys

sys.stdout = open('file', 'w')
print 'test'
"""
reservation = conn_ec2.run_instances(image_id = 'ami-a73264ce',
                                     key_name = 'backendkey',
                                     instance_type = 't1.micro',
                                     security_groups = ['backend'],
                                     instance_initiated_shutdown_behavior = 'terminate',
                                     user_data = my_code)

使用正确的设置启动实例(它是公共 Ubuntu 12.04,64 位,映像),我可以正常 SSH 进入它。用户数据脚本似乎已正确加载:我可以在 /var/lib/cloud/instance/user-data.txt(以及 /var/lib/cloud/instance/scripts/part-001)和 EC2 控制台上看到它。

但就是这样,脚本似乎没有被执行。在this answer 之后,我检查了/var/log/cloud-init.log 文件,但它似乎不包含任何与我的脚本相关的错误消息(好吧,也许我遗漏了一些东西-here is a gist 的内容是cloud-init.log)。

我错过了什么?

【问题讨论】:

  • 您的file 正在创建吗?您是否尝试过完整路径/tmp/file,以便检查文件是否正在创建。
  • 不,file 未创建。甚至没有完整路径(谢谢提醒,顺便说一句)。
  • 您是否尝试过运行 bash 脚本?或者您可以尝试从 AWS 控制台创建一个实例(从 AWS 控制台传递用户数据),看看您的脚本是否有问题。
  • 刚刚做了。有效!我使用了my_code = '''#!/bin/sh mkdir /home/ubuntu/testfolder''',删除了编码,当我通过 SSH 连接到机器时,testfolder 就在那里。我想知道为什么 Python 脚本不起作用。我想我可以将它保存到 S3 存储桶中,然后从 bash 脚本中调用它,但是我仍然无法让 Python 脚本直接工作。
  • 这是另一个奇怪的地方:在 Ubuntu 上,`my_code = '''#!/bin/sh mkdir /home/ubuntu/testfolder''' 仅在分成两行时才有效,使用 shebang 行单独作为第一行。但在 Amazon Linux 上,它可以作为单线运行,没有任何问题。

标签: python-2.7 amazon-web-services amazon-ec2 boto


【解决方案1】:

这可能不再相关,但是。 我刚刚将 boto 与 ubuntu 和用户数据一起使用,虽然文档说用户数据必须是 base64 编码的,但它只有在我将 64 位参数作为常规字符串传递时才对我有用。

我从文件中读取用户数据的内容(使用 fh.read()),然后将其作为 user_data 参数传递给 run_instances。

【讨论】:

  • 你是对的。同样的事情也发生在我身上。当我尝试使用 base64 字符串时,它对我不起作用。但是当我通过纯字符串时它工作正常。谢谢,我终于知道该怎么做了。
【解决方案2】:

我认为它不适合你,因为用户数据不能像你使用 "#!/usr/bin/env python" 那样使用任何 shebang 在帮助页面http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html 上有两个例子,一个是标准的“#!/bin/bash”,另一个看起来是人工的“#cloud-config”。可能只有 2 个可用的 shebangs。 bash 对我有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-14
    • 2021-06-09
    • 2022-01-23
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 2021-02-01
    • 2021-06-16
    相关资源
    最近更新 更多