如何在使用AWS Codebuild时读取SSM参数?

时间:2018-04-25 07:15:04

标签: amazon-web-services aws-codebuild

我目前成功使用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凭据的环境变量)?

3 个答案:

答案 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参数存储中的变量。

有关更多信息,请查看Build Specification Reference for AWS CodeBuild

答案 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