我目前成功使用codebuild进行简单构建任务(在非vpc配置中)。
但是现在我正在尝试运行一个读取SSM参数值的构建任务,并且它因为无法加载任何凭据而失败,原因是:
com.amazonaws.auth.InstanceProfileCredentialsProvider@5754b242: Unable to load credentials from service endpoint
我已经分配给codebuild项目的IAM服务角色对{I}尝试阅读的参数具有ssm:GetParameters
权限(如果这是问题,我' d期望看到unauthorized
消息,而不是unable to load credentials
)。
我使用Java SDK进行SSM GetParameter调用,从EC2实例运行时,我已经确认该调用可用于读取SSM参数,因此我很确定问题这是Codebuild。
为了进一步诊断问题,我尝试添加一个构建命令来对AWS实例元数据地址执行curl
:
curl 169.254.169.254/latest/meta-data/iam/info
它不会像普通的EC2环境那样返回实例元数据,而是超时。
因此,问题的根源似乎是代码构建环境不能与AWS元数据查找地址一起使用,这会导致AWS提供商链无法查找凭据。
如何从codebuild读取我的SSM参数(没有硬编码或使用SDK凭据的环境变量)?
答案 0 :(得分:7)
我可以问你为什么不使用AWS CodeBuild
的内置方法?您可以通过SSM
项目的构建规范从AWS CodeBuild
获取参数。在这种情况下,通过Java SDK的附加调用已经过时。
version: 0.2
env:
parameter-store:
key: "value"
key: "value"
phases:
build:
commands:
- command
- command
parameter-store:如果指定了env,则是必需的 检索存储在Amazon EC2 Systems中的自定义环境变量 经理参数存储。包含键/值标量的映射, 其中每个映射表示一个自定义环境变量 存储在Amazon EC2 Systems Manager参数存储中。关键是名字 稍后您将在构建命令中使用它来引用此自定义 环境变量,value是自定义环境的名称 存储在Amazon EC2 Systems Manager参数存储中的变量。
答案 1 :(得分:1)
来自MaiKaY
的答案是解决问题的最佳解决方案"如何将SSM参数值纳入您的构建中#34; (更好的是将buildspec绑定到SSM
参数的名称而不是代码或构建脚本)。
但是如果其他人在处理同一问题时偶然发现了这个问题 - 问题在于最初问题的基础代码,与Clare Liguori
的答案有关。
我使用的是最近的AWS SDK - 但我并没有以正确的方式使用它。我使用的是AWSSimpleSystemsManagementClient
类的简单构造函数,这很少是正确的事情
构建客户端的更好方法是使用AWSSimpleSystemsManagementClientBuilder
类,如:
AWSSimpleSystemsManagementClientBuilder.standard().build()
答案 2 :(得分:0)
您的AWS Java SDK可能已过期。在CodeBuild中检索凭据的最低版本是1.11.16。 https://docs.aws.amazon.com/codebuild/latest/userguide/troubleshooting.html#troubleshooting-versions