我们正在使用kube2iam在容器中传递ec2角色。偶尔我们会得到:
Error: Failed to list store contents: NoCredentialProviders: no valid providers in chain. Deprecated.
For verbose messaging see aws.Config.CredentialsChainVerboseErrors
但是如果我们重新启动容器,则会获取凭据。
似乎我们在kube2iam takes time传递凭据时遇到了问题。
我确实发现this commit使得超时时间更短。
所以问题是:
有没有办法在aws-sdk-go中引入类似于AWS_METADATA_SERVICE_TIMEOUT
/ AWS_METADATA_SERVICE_NUM_ATTEMPTS
的延迟重试?
答案 0 :(得分:2)
Go AWS SDK没有直接的AWS_METADATA_SERVICE_TIMEOUT/AWS_METADATA_SERVICE_NUM_ATTEMPTS
概念,但是确实有类似的概念。
默认情况下,创建EC2Metadata
类型(默认凭据链使用)时,在http.Client
上创建a timeout override of 1 second is set。如果您的kube2iam
在这段时间内没有响应,则凭据调用将失败。
创建EC2MetadataDisableTimeoutOverride
时,可以使用aws.Config
上的session.Session
选项禁用此行为。这样做时,超时将与http.DefaultClient
的行为匹配。
示例:
cfg := aws.NewConfig().
WithEC2MetadataDisableTimeoutOverride(true).
WithCredentialsChainVerboseErrors(true)
sess, _ := session.NewSession(cfg)
db := dynamodb.New(sess) // etc.