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

运行附加了 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

这里有点困惑,难道它不应该只是工作吗,因为我以我登录时所用的同一用户身份运行这个过程,而且实际上正如我在开头提到的那样工作?为什么它甚至要寻找凭据?


慕村9548890
浏览 107回答 1
1回答

缥缈止盈

好的,假设您有一个允许 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 IAMSecurityCredsC。一旦你拥有所有三个(令牌、密钥、秘密),你就可以运行这样的东西: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 ........`)而已 :)
打开App,查看更多内容
随时随地看视频慕课网APP