我构建了一个dockerfile和docker-come.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时,当我使用docker-compose up
在我的PC上运行那个对接器时,它工作得很好,但是每当我在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。
我使用控制台日志来记录凭据,唯一的区别是在Fargate上将region
设置为ap-northeast-1
,而在本地是undefined
。因为桶和Fargate在同一台服务器上。我真的找不出这个地区是从哪里来的,这是怎么回事。
这是个窃听器还是我哪里错了?为什么它在我的电脑上运行得很好,而不是法尔盖特?是因为法尔盖特的环境冲突吗?我在这个问题上已经有几天了,任何帮助都将受到感谢。谢谢。
编辑:我发现了,多亏了@Marcin。不应在Fargate任务中运行的Docker中设置任何凭据或角色。您需要创建一个具有足够AWS权限的任务角色,并将其分配给任务。当我在本地运行时,代码将使用角色arn假设默认配置文件,这样它就能正常工作。
同样,不要向代码提交任何凭据。
发布于 2020-06-15 03:03:01
基于这些评论。
针对身份验证问题提出的解决方案是使用任务的IAM角色,而不是将硬编码访问和秘密密钥作为env变量传递到代码中。
任务角色的使用符合AWS 良好实践的要求,即不要硬编码任何凭据,而是使用临时凭据:
使用用于Amazon任务的IAM角色,您可以指定一个IAM角色,该角色可由任务中的容器使用。应用程序必须用AWS凭据对其API请求进行签名,此特性提供了一种管理应用程序使用的凭据的策略,类似于AmazonEC2实例概要文件向EC2实例提供凭据的方式。
https://stackoverflow.com/questions/62378967
复制相似问题