登录
首页 >  Golang >  Go问答

通过使用程序调用 AWS CLI 访问 AWS 服务

来源:stackoverflow

时间:2024-03-05 22:00:26 495浏览 收藏

有志者,事竟成!如果你在学习Golang,那么本文《通过使用程序调用 AWS CLI 访问 AWS 服务》,就很适合你!文章讲解的知识点主要包括,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

正在运行附加了 iam 角色的 ec2 实例,该角色允许将文件复制到 s3 存储桶或从 s3 存储桶读取文件。

登录 ec2 实例(通过 ssh)后,我可以使用 aws s3 ... 命令执行所有这些任务。没有凭据,因为它正在使用角色。 env 根本没有任何与 aws 相关的东西。 但是,如果我运行一个程序(用 go 编写),它会执行以下操作:

exec.Command("bash", "-c", "aws s3 ls ....")

我在 env 中找到了 部分凭证,缺少:aws_secret_access_key

这里有点困惑,难道它不应该工作吗,因为我以与我登录的用户相同的用户身份运行这个进程,并且实际上正如我在开始时提到的那样工作?为什么它还要寻找凭据?


正确答案


好的,假设您有一个角色(我们称之为 ec2s3accessrole)允许 ec2 实例访问 s3 存储桶,您需要遵循此文档:https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html

例如,就我而言(golang),我会做这样的事情:

a.获取令牌:

cmd := exec.command("bash", "-c", `curl -x put http://169.254.169.254/latest/api/token -h "x-aws-ec2-metadata-token-ttl-seconds: 600"`)

b.使用 (a) 中的令牌获取凭证

type iamsecuritycreds struct {
code            string    `json:"code"`
lastupdated     time.time `json:"lastupdated"`
type            string    `json:"type"`
accesskeyid     string    `json:"accesskeyid"`
secretaccesskey string    `json:"secretaccesskey"`
token           string    `json:"token"`
expiration      time.time `json:"expiration"`
}
...

cmd := exec.command("bash", "-c", `curl -h "x-aws-ec2-metadata-token: `+token+`" -v http://169.254.169.254/latest/meta-data/iam/security-credentials/ec2s3accessrole`)
...
json.unmarshal into iamsecuritycreds

c.一旦你拥有了所有三个(令牌、密钥、秘密),你就可以运行如下所示的代码:

cmd := exec.Command("bash", "-c", `AWS_DEFAULT_REGION=us-east-1 AWS_ACCESS_KEY_ID=` + creds.AccessKeyID + ` AWS_SECRET_ACCESS_KEY=` + creds.SecretAccessKey + ` AWS_SESSION_TOKEN="` + creds.Token + `" aws s3 ........`)

就是这样:)

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《通过使用程序调用 AWS CLI 访问 AWS 服务》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>