AWS 元数据端点在 CodeBuild 中不可用

rod*_*ocf 5 amazon-ec2 amazon-web-services aws-codebuild

我有一个 django 应用程序,它有一个函数来确定它是否在 EC2 中运行:

def am_i_ec2():
    result = False
    meta = 'http://169.254.169.254/latest/meta-data/public-ipv4'
    try:
        result = urlopen(meta).status == 200
    except Exception:
        return result
    return True
Run Code Online (Sandbox Code Playgroud)

这显然在我的本地机器上运行良好。它还适用于管道最终将进行部署的 EC2:

Python 3.6.8 (default, Mar 18 2019, 18:57:19)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from urllib.request import urlopen
>>> def am_i_ec2():
...     result = False
...     meta = 'http://169.254.169.254/latest/meta-data/public-ipv4'
...     try:
...         result = urlopen(meta).status == 200
...     except Exception:
...         return result
...     return True
...
>>> am_i_ec2()
True
Run Code Online (Sandbox Code Playgroud)

但是,在 CodeBuild 阶段,我手动向构建规范添加了一条curl 行,我得到了以下结果:

[Container] 2019/07/28 21:36:11 Running command curl http://169.254.169.254/latest/meta-data/public-ipv4 
curl: (7) Couldn't connect to server 

[Container] 2019/07/28 21:36:11 Command did not exit successfully curl http://169.254.169.254/latest/meta-data/public-ipv4 exit status 7
Run Code Online (Sandbox Code Playgroud)

我假设所有网络部分都工作正常,因为在此实现之前,构建工作正常,并且在此之前进行了一些 pip 安装,因此它确实可以访问互联网。

我在这里缺少什么?

Mar*_*per 5

正如 Subin、另一篇 SO 文章 [1] 和其他人 [2][3] 已经指出的那样,您必须更改元数据端点才能使其工作。您的构建通常不在普通的 EC2 实例上运行,而是在 Docker 化环境或 AWS 实现的某种其他类型的容器中运行。

使用:http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI

参考

[1] /sf/answers/3292008401/
[2] https://blog.jwr.io/aws/codebuild/container/iam/role/2019/05/30/iam-role-inside -container-inside-aws-codebuild.html
[3] https://aws.amazon.com/blogs/devops/how-to-create-an-ami-builder-with-aws-codebuild-and-hashicorp-packer /(“创建构建规范”)