为了账号安全,请及时绑定邮箱和手机立即绑定

从调用 aws cli 的程序访问 AWS 服务

从调用 aws cli 的程序访问 AWS 服务

Go
慕村9548890 2023-01-03 14:13:32
运行附加了 IAM 角色的 EC2 实例,允许将文件复制到 S3 存储桶或从中读取文件。当登录到 EC2 实例(通过 ssh)时,我可以使用aws s3 ...命令执行所有这些任务。没有凭据,因为它正在使用角色。Env 根本没有与 aws 相关的任何内容。但是,如果我运行一个程序(用 GO 编写),它只执行以下操作:exec.Command("bash", "-c", "aws s3 ls ....")我得到Partial credentials found in env, missing: AWS_SECRET_ACCESS_KEY这里有点困惑,难道它不应该只是工作吗,因为我以我登录时所用的同一用户身份运行这个过程,而且实际上正如我在开头提到的那样工作?为什么它甚至要寻找凭据?
查看完整描述

1 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

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


例如,在我的情况下(golang),我会做这样的事情:


一种。获取令牌:


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 ........`)

而已 :)


查看完整回答
反对 回复 2023-01-03
  • 1 回答
  • 0 关注
  • 133 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信