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 安装,因此它确实可以访问互联网。
我在这里缺少什么?
正如 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 /(“创建构建规范”)
| 归档时间: |
|
| 查看次数: |
1448 次 |
| 最近记录: |