从 Go 中的 ec2 元数据服务获取 aws 凭据

Posted

技术标签:

【中文标题】从 Go 中的 ec2 元数据服务获取 aws 凭据【英文标题】:get aws credentials from ec2 metadata services in Go 【发布时间】:2022-01-15 12:42:34 【问题描述】:

如何让 GO SDK 从AWS 提供的Instance Metadata Service (169.254.169.254) 中获取AWS 的访问密钥。

我查看了官方AWS SDKgo 文档,似乎只有从环境变量中获取访问密钥的方法,但没有来自IMS 的凭据检索器。

这是如何在 go 中完成的?

【问题讨论】:

我冒昧地重写了您的问题,这样它就不会询问有关图书馆的建议。这类问题很快就结束了。 LMK 如果您觉得我的编辑对您的问题的描述不准确 不,这样更好,谢谢 【参考方案1】:

我查看了官方 AWS SDK 的 go 文档,似乎只有从环境变量中获取访问密钥的方法,但没有来自 IMS 的凭据检索器。

你只是错过了它。 Go SDK 支持实例元数据服务以及所有其他常见的凭证提供程序。

来自https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html

如果您已将实例配置为使用 IAM 角色,则开发工具包会自动将这些凭证用于您的应用程序。

您无需执行任何操作即可对其进行配置。它应该可以工作。如果您遇到问题,请确保您没有手动配置某些其他凭据源。

通常你不需要做更多的事情,比如:

  sess := session.Must(
    session.NewSessionWithOptions(session.Options
      SharedConfigState: session.SharedConfigEnable,
    ),
  )

无论有没有 CLI 配置、元数据服务或环境变量,它都应该可以在任何地方运行。

【讨论】:

从这个会话对象中获取credentials 的正确方法是什么? 您要解决什么问题,导致您想从会话对象中获取凭据? 我正在尝试从实例元数据提供程序获取 AccessKeyIDSecretKey 等凭据。 如果您想直接检索凭证,则没有理由使用 aws sdk。在 GO 中,使用 net/httphttp.Get("https://169.254.169.254/latest/meta-data/iam/security-credentials"),然后使用 http.Get 将特定于实例配置文件角色的结果。相反,如果您使用的是 aws sdk,则没有理由触摸凭据,也不会产生任何好处。 我想创建一个v4.Signer,我需要传递一个凭据对象v4.NewCredentials(cred??)。我如何获得 creds 对象?

以上是关于从 Go 中的 ec2 元数据服务获取 aws 凭据的主要内容,如果未能解决你的问题,请参考以下文章

从 Docker 容器中获取 AWS 实例元数据?

AWS - 从EC2连接到SQS

无法访问 AWS ECS EC2 实例中的端口

将Rstudio与PostgreSQL在AWS EC2中连接

EC2-classic 中的源端点的 AWS DMS 问题

有没有办法在 ec2 实例中获取实例 ID [重复]