【发布时间】: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