【问题标题】:Error [CredentialsError]: Missing credentials in config, but only when running on Fargate AWS错误 [CredentialsError]:配置中缺少凭据,但仅在 Fargate AWS 上运行时
【发布时间】:2020-10-04 07:39:00
【问题描述】:

我构建了一个 dockerfile 和 docker-compose.yml 文件来导入环境。环境是这样的:

AWS_ACCESS_KEY_ID=XXX
AWS_SECRET_ACCESS_KEY=XXX
ROLE_ARN=XXX
BUCKET_NAME=BUCKET
AWS_PROFILE=default
AWS_SDK_LOAD_CONFIG=1
AWS_SHARED_CREDENTIALS_FILE=[path]
AWS_CONFIG_FILE=[path]
AWS_REGION=region

当我尝试将文件上传到 S3 时,当我在我的 PC 上使用 docker-compose up 运行该 docker 时它运行良好,但每当我在 Fargate 上运行它时,我都会收到此错误

Error [CredentialsError]: Missing credentials in config, if using AWS_CONFIG_FILE, set AWS_SDK_LOAD_CONFIG=1
    at Request.extractError (/home/myuser/node_modules/aws-sdk/lib/protocol/query.js:50:29)
    at Request.callListeners (/home/myuser/node_modules/aws-sdk/lib/sequential_executor.js:106:20)
    at Request.emit (/home/myuser/node_modules/aws-sdk/lib/sequential_executor.js:78:10)
    at Request.emit (/home/myuser/node_modules/aws-sdk/lib/request.js:683:14)
    at Request.transition (/home/myuser/node_modules/aws-sdk/lib/request.js:22:10)
    at AcceptorStateMachine.runTo (/home/myuser/node_modules/aws-sdk/lib/state_machine.js:14:12)
    at /home/myuser/node_modules/aws-sdk/lib/state_machine.js:26:10
    at Request.<anonymous> (/home/myuser/node_modules/aws-sdk/lib/request.js:38:9)
    at Request.<anonymous> (/home/myuser/node_modules/aws-sdk/lib/request.js:685:12)
    at Request.callListeners (/home/myuser/node_modules/aws-sdk/lib/sequential_executor.js:116:18)
    at Request.emit (/home/myuser/node_modules/aws-sdk/lib/sequential_executor.js:78:10)
    at Request.emit (/home/myuser/node_modules/aws-sdk/lib/request.js:683:14)
    at Request.transition (/home/myuser/node_modules/aws-sdk/lib/request.js:22:10)
    at AcceptorStateMachine.runTo (/home/myuser/node_modules/aws-sdk/lib/state_machine.js:14:12)
    at /home/myuser/node_modules/aws-sdk/lib/state_machine.js:26:10
    at Request.<anonymous> (/home/myuser/node_modules/aws-sdk/lib/request.js:38:9)
    at Request.<anonymous> (/home/myuser/node_modules/aws-sdk/lib/request.js:685:12)
    at Request.callListeners (/home/myuser/node_modules/aws-sdk/lib/sequential_executor.js:116:18)
    at callNextListener (/home/myuser/node_modules/aws-sdk/lib/sequential_executor.js:96:12)
    at IncomingMessage.onEnd (/home/myuser/node_modules/aws-sdk/lib/event_listeners.js:307:13)
    at IncomingMessage.emit (events.js:322:22)
    at IncomingMessage.EventEmitter.emit (domain.js:482:12) {
  code: 'CredentialsError',
  time: 2020-06-11T12:47:25.609Z,
  requestId: '0d6fd3d4-df21-4195-a6e4-de470006429d',
  statusCode: 403,
  retryable: false,
  retryDelay: 80.8300420619739,
  originalError: {
    message: 'Could not load credentials from ChainableTemporaryCredentials',
    code: 'CredentialsError',
    time: 2020-06-11T12:47:25.609Z,
    requestId: '0d6fd3d4-df21-4195-a6e4-de470006429d',
    statusCode: 403,
    retryable: false,
    retryDelay: 80.8300420619739,
    originalError: {
      message: 'Missing credentials in config, if using AWS_CONFIG_FILE, set AWS_SDK_LOAD_CONFIG=1',
      code: 'CredentialsError',
      time: 2020-06-11T12:47:25.609Z,
      requestId: '0d6fd3d4-df21-4195-a6e4-de470006429d',
      statusCode: 403,
      retryable: false,
      retryDelay: 80.8300420619739,
      originalError: [Object]
    }
  }
}

这是我的凭据代码的一部分:

    var envCreds = new AWS.EnvironmentCredentials('AWS');
    s3.config.credentials = envCreds;
    s3.config.credentials = new AWS.ChainableTemporaryCredentials({
        params: {
            RoleArn: process.env.ROLE_ARN,
            region: process.env.AWS_REGION
        }
    });

我需要转换角色。我曾尝试使用 SharedIniFileCredentials 但没有运气,我总是得到 AccessDenied。

我使用控制台日志来记录凭据,唯一的区别是 region 在 Fargate 上设置为 ap-northeast-1,而在本地设置为 undefined。由于存储桶和 Fargate 在同一台服务器上。我真的不知道这个地区来自哪里以及这有什么关系。

这是一个错误还是我在某个地方错了?为什么它在我的 PC 上运行良好,但在 fargate 上却不行?是因为 Fargate 的环境冲突吗?几天来我一直在这个麻烦中,任何帮助将不胜感激。谢谢。

编辑:我想通了。不知何故,我的 Fargate 中的 Docker 使用了不同的环境变量,当我尝试使用这些变量时,我在本地得到了同样的错误。

【问题讨论】:

  • 您对任务中的所有凭据进行硬编码?通常对于 ecs,你使用task role 来授予它必要的权限。
  • @Marcin 我也尝试对它们进行硬编码,没有运气
  • 我的意思是你不应该这样做。这是非常糟糕的做法。应该使用任务角色。你试过使用它们吗?
  • 哦,我不知道容器和任务也需要角色,我认为完全权限就足够了。我认为这就是为什么在本地和 Fargate 上运行不同的原因。我会尽力。谢谢@Marcin
  • 没问题。如果您不介意,我将其作为答案。

标签: node.js amazon-web-services docker aws-fargate aws-sdk-js


【解决方案1】:

基于 cmets。

针对身份验证问题的建议解决方案是使用IAM Roles for Tasks,而不是将访问权限和密钥硬编码到代码中或将它们作为环境变量传递。

任务角色的使用符合 AWS 良好实践,即不对任何凭证进行硬编码,而是使用临时凭证:

借助 Amazon ECS 任务的 IAM 角色,您可以指定一个可由任务中的容器使用的 IAM 角色。应用程序必须使用 AWS 凭证签署其 AWS API 请求,并且此功能提供了一种管理凭证的策略供您的应用程序使用,类似于 Amazon EC2 实例配置文件为 EC2 实例提供凭证的方式。 p>

【讨论】:

  • 我不明白。我已经设置了对任务和容器具有完全权限的 IAM 角色,但它仍然不起作用。
  • @HùngNguyễn 您可能需要为您的应用调整 credentials provider
  • @HùngNguyễn ECS可以试试ECSCredentialsprovider。
  • 我使用这些被拒绝访问,我当前 id 的角色不包括将文件上传到 s3。这就是为什么我需要ChainableTemporaryCredentials
  • 哦,对了,将假定角色添加到信任策略是可行的。另外,如果您已经设置了从 fargate 上传文件到 s3 的完全权限,则无需再承担代码中的角色。
猜你喜欢
  • 2017-08-31
  • 2019-08-27
  • 2019-02-24
  • 2020-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多