AWS JAVA SDK - 我可以在同一个 aws 帐户内使用 aws sdk 运行 以编程方式访问其他服务而无需硬编码凭据吗?

AWS JAVA SDK - Can i programmatically access other services using aws sdk running inside same aws account without hard coding credentials?

我在 Fargate 集群中有 java 代码 运行,我需要使用 aws sdk 从 java 代码中访问其他 aws 服务。 现在我在 java class 中硬编码了 access/secret/token 并且它工作正常。

BasicSessionCredentials sessionCredentials = new BasicSessionCredentials(accessKey, secretAccessKey, token);

由于我是 运行 java 来自同一个 aws 帐户的代码,所以有没有更好的方法让我不必对凭据进行硬编码?

是的,您始终可以为您的任务分配任务角色。然后,SDK 将自动计算凭据并在发出请求时使用它们。

信任策略看起来像这样:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "ecs-tasks.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

那么您需要指定政策文件。有了这个,SDK 就会计算出重置。您可以在此处的 AWS 文档中找到更多信息:https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html

我在构建目标服务客户端时使用 DefaultAWSCredentialsProviderChain.java 让它工作。与此同时,我在附加到调用服务的角色中添加了目标服务的权限。 例如 - 如果 ECS 任务中的代码 运行 需要调用 SSM 服务,请向附加到 ECS 任务的角色添加权限以对 SSM 执行操作,并从代码而不是硬编码凭据使用下面提到的代码:

AWSSimpleSystemsManagement awsSimpleSystemsManagement = AWSSimpleSystemsManagementClient.builder()
                .withCredentials(new DefaultAWSCredentialsProviderChain());