使用AWS Codebuild时如何读取SSM参数?
How to read SSM parameters when using AWS Codebuild?
我目前成功地将 codebuild 用于简单的构建任务(在非 vpc 配置中)。
但现在我正在尝试 运行 一个读取 SSM 参数值的构建任务,但它失败了,因为它无法加载任何凭据,明显的原因是:
com.amazonaws.auth.InstanceProfileCredentialsProvider@5754b242: Unable to load credentials from service endpoint
我分配给 codebuild 项目的 IAM 服务角色确实对我尝试读取的参数具有 ssm:GetParameters
权限(如果这是问题所在,我希望看到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 提供商链无法查找凭据。
如何从代码构建中读取我的 SSM 参数(无需硬编码或使用环境变量获取 SDK 凭据)?
请问您为什么不使用AWS CodeBuild
的内置方法?您可以通过 AWS CodeBuild
项目的构建规范从 SSM
中获取参数。在这种情况下,通过 Java SDK 的额外调用已过时。
version: 0.2
env:
parameter-store:
key: "value"
key: "value"
phases:
build:
commands:
- command
- command
parameter-store: Required if env is specified, and you want to
retrieve custom environment variables stored in Amazon EC2 Systems
Manager Parameter Store. Contains a mapping of key/value scalars,
where each mapping represents a single custom environment variable
stored in Amazon EC2 Systems Manager Parameter Store. key is the name
you will use later in your build commands to refer to this custom
environment variable, and value is the name of the custom environment
variable stored in Amazon EC2 Systems Manager Parameter Store.
您的 AWS Java SDK 可能已过时。在 CodeBuild 中检索凭证的最低版本是 1.11.16。
https://docs.aws.amazon.com/codebuild/latest/userguide/troubleshooting.html#troubleshooting-versions
MaiKaY
的答案是 "how to get SSM parameter values into your build" 问题的最佳解决方案(最好将构建规范绑定到 SSM
参数的名称而不是代码或构建脚本)。
但如果其他人在处理相同问题时偶然发现这个问题 - 问题出在最初问题的基础代码上,与 Clare Liguori
的答案有点相关。
我使用的是最新的 AWS SDK - 但我没有以正确的方式使用它。我正在使用 AWSSimpleSystemsManagementClient
class 的简单构造函数,这很少是正确的做法。
构建客户端的更好方法是使用 AWSSimpleSystemsManagementClientBuilder
class,例如:
AWSSimpleSystemsManagementClientBuilder.standard().build()
添加到 MaiKaY
答案,确保 ssm 参数存储中的参数采用 secureString 格式,而不是 string .我为此苦苦挣扎了好几天,最后通过 Codebuild console
添加了变量,它自动存储在 secureString
中
我目前成功地将 codebuild 用于简单的构建任务(在非 vpc 配置中)。
但现在我正在尝试 运行 一个读取 SSM 参数值的构建任务,但它失败了,因为它无法加载任何凭据,明显的原因是:
com.amazonaws.auth.InstanceProfileCredentialsProvider@5754b242: Unable to load credentials from service endpoint
我分配给 codebuild 项目的 IAM 服务角色确实对我尝试读取的参数具有 ssm:GetParameters
权限(如果这是问题所在,我希望看到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 提供商链无法查找凭据。
如何从代码构建中读取我的 SSM 参数(无需硬编码或使用环境变量获取 SDK 凭据)?
请问您为什么不使用AWS CodeBuild
的内置方法?您可以通过 AWS CodeBuild
项目的构建规范从 SSM
中获取参数。在这种情况下,通过 Java SDK 的额外调用已过时。
version: 0.2
env:
parameter-store:
key: "value"
key: "value"
phases:
build:
commands:
- command
- command
parameter-store: Required if env is specified, and you want to retrieve custom environment variables stored in Amazon EC2 Systems Manager Parameter Store. Contains a mapping of key/value scalars, where each mapping represents a single custom environment variable stored in Amazon EC2 Systems Manager Parameter Store. key is the name you will use later in your build commands to refer to this custom environment variable, and value is the name of the custom environment variable stored in Amazon EC2 Systems Manager Parameter Store.
您的 AWS Java SDK 可能已过时。在 CodeBuild 中检索凭证的最低版本是 1.11.16。 https://docs.aws.amazon.com/codebuild/latest/userguide/troubleshooting.html#troubleshooting-versions
MaiKaY
的答案是 "how to get SSM parameter values into your build" 问题的最佳解决方案(最好将构建规范绑定到 SSM
参数的名称而不是代码或构建脚本)。
但如果其他人在处理相同问题时偶然发现这个问题 - 问题出在最初问题的基础代码上,与 Clare Liguori
的答案有点相关。
我使用的是最新的 AWS SDK - 但我没有以正确的方式使用它。我正在使用 AWSSimpleSystemsManagementClient
class 的简单构造函数,这很少是正确的做法。
构建客户端的更好方法是使用 AWSSimpleSystemsManagementClientBuilder
class,例如:
AWSSimpleSystemsManagementClientBuilder.standard().build()
添加到 MaiKaY
答案,确保 ssm 参数存储中的参数采用 secureString 格式,而不是 string .我为此苦苦挣扎了好几天,最后通过 Codebuild console
添加了变量,它自动存储在 secureString