【问题标题】:Fetch userData on EC2 machine boot up在 EC2 机器启动时获取 userData
【发布时间】:2018-06-28 10:39:13
【问题描述】:

我有一个触发 EC2 机器开始使用 amiId 的 Lambda。当 lambda 执行时,它还会将一些 userData 发送到将要启动的 EC2 机器实例。

现在,当我尝试获取将在 EC2 上执行的 nodeJs 代码中的 userData 时,它返回状态 200 但响应正文为空。

我正在使用带有 superagent npm 模块的 api“http://169.254.169.254/latest/user-data”来发出请求。以下是请求代码:

 request.get(config.awsUserDataUrl)
        .then((response) => {
            const schema = joi.object().keys({
                bucketname: joi.string().min(3).max(30).required(),
                // alphanumeric string of 24 characters in length
                jobid: joi.string().regex(/^[0-9a-fA-F]{24}$/),
                appid: joi.string().min(3).max(30).required(),
                snstopic: joi.string().min(3).max(60).required(),
                filepath: joi.string().min(3).max(60).required(),
            });
            logger.info('response', JSON.stringify(response.body));
            logger.info('response.body', response.body);
            logger.info('response.status', response.status);
            const result = joi.validate(response.body, schema);
            if (result.error === null) {
                logger.info('result', result);
                resolve(response.body);
            } else {
                logger.info('result.error', result.error);
                reject(result.error);
            }
        })
        .catch((err) => {
            logger.info('err.message', err.message);
            logger.info('err.response', err.response);

            // err.message, err.response
            reject(err);
        });

注意:我没有在 Lambda 环境变量中为 EC2 分配任何 IAM 角色。在 EC2 中没有得到响应 userData 的问题是否是由于角色未分配给 EC2 造成的?

【问题讨论】:

  • 您可以从 AWS 控制台查看已启动实例的用户数据吗?
  • 是的,我可以在 AWS 控制台中看到。
  • 该 url 仅在从实例内部调用时才有效。你是从 Lambda 调用它吗?
  • @RodrigoM 我调用的 url 来自部署在 ami 由 Lambda 烘焙的 EC2 机器上的节点代码。
  • 访问用户数据不需要 IAM 角色。使用curl 进行测试。

标签: amazon-web-services amazon-ec2 lambda aws-lambda


【解决方案1】:

这很糟糕,但我认为您需要在调用之前放置一个忙等待循环,当元数据 URL 调用开始给出 HTTP 200 响应时退出。

我对元数据 URL 的一个奇怪的怪癖是它并不总是在启动时“立即”存在。我使用的一个基于 shell 的初始化脚本有一段代码,例如:

while [ ! "$(/usr/bin/curl -s -o /dev/null -w '%{http_code}' http://169.254.169.254/2009-04-04/meta-data/placement/availability-zone)" = "200" ]
do
    echo "[Kira] Waiting for AWS metadata to exist"
    sleep 2
done

它只是忙着等待,直到数据可用。我不认为 URL 的选择是相关的——我特别使用那个只是因为我的脚本需要首先知道 AZ。

【讨论】:

    猜你喜欢
    • 2013-06-15
    • 2011-11-12
    • 2020-11-28
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    相关资源
    最近更新 更多