我的应用程序需要在ec2实例上请求一个角色来配置会话还是将其留空



我正在尝试在我的应用程序中使用aws-sdk-go。它正在EC2实例上运行。现在,在配置文档的凭据中,https://docs.aws.amazon.com/sdk-for-go/api/,它说它将在中查找

*Environment Credentials - Set of environment variables that are useful when sub processes are created for specific roles.
* Shared Credentials file (~/.aws/credentials) - This file stores your credentials based on a profile name and is useful for local development.
*EC2 Instance Role Credentials - Use EC2 Instance Role to assign credentials to application running on an EC2 instance. This removes the need to manage credential files in production.`

最好的顺序不是相反的顺序吗?但我的主要问题是,我是否需要询问实例是否有角色,然后在它有角色时使用它来设置凭据?这就是我不确定我需要做什么以及如何做的地方。

我确实尝试了一个简单的测试,即创建一个空配置,基本上只设置区域,并在具有角色的实例上运行它,它似乎"起了作用",但在这种情况下,我不确定是否需要显式设置角色。

awsSDK.Config{
Region:      awsSDK.String(a.region),
MaxRetries:  awsSDK.Int(maxRetries),
HTTPClient:  http.DefaultClient,
}

我只是想确认一下这样做是否正确。我的想法是我需要做一些类似以下的事情

role = use sdk call to get role on machine
set awsSDK.Config { Credentials: credentials form of role,
...
}
issue service command with returned client.

任何更多的文档/指针都会很棒!

我从未使用过go SDK,但如果没有从任何其他来源找到凭据,我使用的AWS SDK会自动使用EC2实例角色。

下面是一篇AWS博客文章,解释了AWS SDK在获取凭据时所遵循的方法:https://aws.amazon.com/blogs/security/a-new-and-standardized-way-to-manage-credentials-in-the-aws-sdks/.特别是,请参见:

如果使用这样的代码,SDK会在订单:

  1. 在环境变量中。(如前所述,不是.NET SDK。)
  2. 在中央凭据文件(~/.aws/credentials或%USERPROFILE%.awscredentials)
  3. 在现有默认情况下,SDK特定配置文件(如果存在)。如果你有在进行这些更改之前一直在使用SDK
  4. 对于.NET SDK,在SDK存储区中(如果存在)
  5. 如果代码在EC2上运行例如,通过AmazonEC2的IAM角色。在这种情况下,代码得到来自实例元数据服务的临时安全凭证;这个凭据具有从以下角色派生的权限与实例关联

在我的应用程序中,当我需要连接到AWS资源时,我倾向于使用具有特定预定义IAM角色的访问密钥和密钥。假设我有这两个,我用来创建会话的代码是:

awsCredentials := credentials.NewStaticCredentials(awsAccessKeyID, awsSecretAccessKey, "")
awsSession = session.Must(session.NewSession(&aws.Config{
Credentials: awsCredentials,
Region:      aws.String(awsRegion),
}))

当我使用它时,这两个键通常被指定为任意一个环境变量(如果我部署到docker容器)。

一个完整的例子:https://github.com/retgits/flogo-components/blob/master/activity/amazons3/activity.go

最新更新