node.js - 适用于 Node.js 的 AWS 开发工具包在 ECS 中运行时未获取凭证

标签 node.js amazon-web-services amazon-ecs aws-sdk-js aws-sdk-nodejs

我有这个代码:

const uploadAllToS3 = () => {
    console.log("upload useless file to s3, just to test access rights");
    new AWS.S3().putObject({
        Bucket: scheduledJobsConstants.s3BucketName(),
        Key: `test/${new Date()}.txt`, Body: "Hello!",
    }, (err) => {
        console.log(`env:${inspect(process.env)}
        provider:${AWS.CredentialProviderChain.defaultProviders}
        cred:${inspect(AWS.config.credentials)}
        err:${inspect(err)}`.replace(/(\r\n|\n|\r)/gm, ""));
    });
};

当此代码在 ecs 中运行时(假设具有访问 S3 存储桶的角色),我将在日志中获取以下内容:

日志的环境部分:

env: {
    PATH: '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin',
    HOSTNAME: '485bbd95f87d',
    AWS_CONTAINER_CREDENTIALS_RELATIVE_URI: '/v2/credentials/be3d4d7c-28b6-47e6-8081-cd746d95cb28',
    ECS_CONTAINER_METADATA_FILE: '/opt/ecs/metadata/8c0b731d-49ce-4e19-bf79-64087b433876/ecs-container-metadata.json',
    NODE_VERSION: '8.9.4',
    YARN_VERSION: '1.3.2',
    NPM_CONFIG_PROGRESS: 'false',
    HOME: '/root'
  }

“AWS_CONTAINER_CREDENTIALS_RELATIVE_URI”存在于环境变量中,因此我认为 SDK 应该能够识别它。

日志的提供程序部分只是 sdk 代码中定义的 4 个函数,如果在环境变量中看到“AWS_CONTAINER_CREDENTIALS_RELATIVE_URI”,其中第 4 个函数将返回“ECSCredentials”。

奇怪的是,ECS 中日志的 cred 部分为“null”。 当我在本地运行此程序时(我手动承担角色),日志的可信部分是“EnvironmentCredentials”,并且文件被上传到 S3。

日志的错误部分是:

{ Forbidden: null 
at Request.extractError (/app/node_modules/aws-sdk/lib/services/s3.js:557:35) 
at Request.callListeners (/app/node_modules/aws-sdk/lib/sequential_executor.js:105:20) at Request.emit (/app/node_modules/aws-sdk/lib/sequential_executor.js:77:10) 
at Request.emit (/app/node_modules/aws-sdk/lib/request.js:683:14) 
at Request.transition (/app/node_modules/aws-sdk/lib/request.js:22:10) 
at AcceptorStateMachine.runTo (/app/node_modules/aws-sdk/lib/state_machine.js:14:12) 
at /app/node_modules/aws-sdk/lib/state_machine.js:26:10 
at Request.<anonymous> (/app/node_modules/aws-sdk/lib/request.js:38:9) 
at Request.<anonymous> (/app/node_modules/aws-sdk/lib/request.js:685:12) 
at Request.callListeners (/app/node_modules/aws-sdk/lib/sequential_executor.js:115:18) 
message: null, 
code: 'Forbidden', 
region: null, 
time: 2018-01-14T06:30:00.490Z, 
requestId: '4E7121D88BA0FEF1', 
extendedRequestId: 'D5uiXf5EI/OLHeaPhYX67C384ba3SF1I950N78hJWw8Vv4XGQ0opSLOQlXaxVFW31g252dx8YUc=', 
cfId: undefined, 
statusCode: 403, 
retryable: false, 
retryDelay: 118.50320949834776 }

我的代码或环境变量有什么问题吗?

我应该打印更多日志来帮助诊断此问题吗?

请指教,谢谢。

==========更新==========

我已经在ECS中运行了这段代码 const curlCommand = `curl http://169.254.170.2${process.env.AWS_CONTAINER_CREDENTIALS_RELATIVE_URI}`; exec(curlCommand, (错误, 标准输出, 标准错误) => { console.log(`${curlCommand} err:${error} 输出:${stdout} stderr:${stderr}`); });

我得到的结果是: { "SecretAccessKey": "长字符串", "Token": "很长的字符串", "过期": "2018-01-14T08:55:04+0000", "AccessKeyId": "短字符串" }

如果 sdk 调用了 http://169.254.170.2 ${process.env.AWS_CONTAINER_CREDENTIALS_RELATIVE_URI},它应该得到正确的响应。

最佳答案

简单的答案就是这样做

AWS.config.credentials = new AWS.ECSCredentials(options);

可能是因为 aws-sdk 凭证的凭证未配置/配置不正确。

关于node.js - 适用于 Node.js 的 AWS 开发工具包在 ECS 中运行时未获取凭证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48247353/

相关文章:

css - 在 Netbeans 8.2 中解析 Bootstrap 4 时出错

javascript - 如何使用 MongoDB 验证输入?

amazon-web-services - 具有相同任务但不同docker镜像的ECS更新服务

amazon-web-services - 如果您不使用 git,有没有办法部署到 Elastic Beanstalk?

json - 如何将 AWS Cloudformation 的 YAML 连接格式写入 Terraform 格式?

amazon-web-services - 如何在 aws ecs update-service cli 命令中添加等待功能?

amazon-web-services - 如何从前端容器访问Docker API容器?

node.js - 使 pm2 登录到控制台

javascript - 带有 promise/async-await 的回调上下文

asp.net - 将在 docker (windows) 容器中运行的 webapp 连接到在 AWS 私有(private)子网上运行的 SQL Server