首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在AWS中为本地使用AWS临时凭据,而为prod使用实例角色?

如何在AWS中为本地使用AWS临时凭据,而为prod使用实例角色?
EN

Stack Overflow用户
提问于 2022-03-03 21:26:09
回答 1查看 1.2K关注 0票数 1

我了解如何在我的SDK中使用AWS临时凭据,这些凭据来自这个问题这个问题这份文件。很简单,真的:

代码语言:javascript
复制
import { fromSSO } from "@aws-sdk/credential-providers";
const client = new FooClient({ credentials: fromSSO({ profile: "my-sso-profile" }) });

这段代码在我的本地计算机和我的队友的计算机中都能很好地工作(只要他们用AWS登录到AWS )。但是,我完全不清楚如何修改它,以便它既可以在具有AWS的本地计算机上工作,也可以在具有实例角色的EC2实例上工作。很明显,EC2实例不应该访问AWS,而是应该从附加到其相关实例角色的IAM策略获得其权限。但是,考虑到这两种情况,我的代码会是什么样的呢?

我正在疯狂地捅这个:

代码语言:javascript
复制
import { fromInstanceMetadata, fromSSO } from "@aws-sdk/credential-providers";
const isEc2Instance = "I HAVE NO IDEA WHAT TO DO HERE";
let credentials;
if (isEc2Instance) {
  credentials = fromInstanceMetadata({
    // Optional. The connection timeout (in milliseconds) to apply to any remote requests.
    // If not specified, a default value of `1000` (one second) is used.
    timeout: 1000,
    // Optional. The maximum number of times any HTTP connections should be retried. If not
    // specified, a default value of `0` will be used.
    maxRetries: 0,
  });
} else {
  credentials = fromSSO({ profile: "my-sso-profile" });
}
const client = new FooClient({ credentials: credentials });

从实例元数据获取凭据的代码来自这里,因此它可能是正确的。但是,正如第2行所述,我不知道该如何确定是否应该使用AWS或InstanceMetadata或其他什么东西(可能用于其他平台,例如,如果这段代码部署在EC2中用于dev env,ECS/EKS用于prod env?)。

也许这个假设声明不是正确的方法。我很乐意考虑另一种选择。

那么,根据运行的平台,编写从正确源获取AWS凭据的代码的正确方法是什么?

是的,由于这些凭据对于应用程序中任何一个AWS客户端都是一样的,因此获取凭据的代码应该被抽象出来,如果CredentialsHelper中的语句听起来不那么糟糕,那么5,但是我不想让这个问题过于复杂。

代码是JavaScript,我正在寻找在Node.js中工作的东西,但我认为在任何语言中逻辑都是一样的。

EN

回答 1

Stack Overflow用户

发布于 2022-03-11 19:02:19

您需要在代码中添加DefaultAWSCredentialsProviderChain。这将在本地获取您的凭据,并在使用EC2使用EKS部署时使用实例凭证。

此外,将此片段添加到代码中:

代码语言:javascript
复制
private def getProvider(awsConfig: AWSConfig): Either[Throwable, AWSCredentialsProvider] = {
    def isDefault(key: String): Boolean = key == "default"
    def isIam(key: String): Boolean = key == "iam"
    def isEnv(key: String): Boolean = key == "env"

    ((awsConfig.accessKey, awsConfig.secretKey) match {
      case (a, s) if isDefault(a) && isDefault(s) =>
        new DefaultAWSCredentialsProviderChain().asRight
      case (a, s) if isDefault(a) || isDefault(s) =>
        "accessKey and secretKey must both be set to 'default' or neither".asLeft
      case (a, s) if isIam(a) && isIam(s) =>
        InstanceProfileCredentialsProvider.getInstance().asRight
      case (a, s) if isIam(a) && isIam(s) =>
        "accessKey and secretKey must both be set to 'iam' or neither".asLeft
      case (a, s) if isEnv(a) && isEnv(s) =>
        new EnvironmentVariableCredentialsProvider().asRight
      case (a, s) if isEnv(a) || isEnv(s) =>
        "accessKey and secretKey must both be set to 'env' or neither".asLeft
      case _ =>
        new AWSStaticCredentialsProvider(
          new BasicAWSCredentials(awsConfig.accessKey, awsConfig.secretKey)
        ).asRight
    }).leftMap(new IllegalArgumentException(_))
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71343989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档