【问题标题】:AWS SDK and NODE JS --> UnknownEndpointAWS SDK 和 NODE JS --> UnknownEndpoint
【发布时间】:2019-01-15 20:28:16
【问题描述】:

我已遵循此指南:https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/ec2-example-creating-an-instance.html

当我运行下面的代码时 - 我收到 UnknowEndPoint 错误。

  1. 我创建了一个 AWS IAM 用户并将该用户添加到策略名称为“IAMFullAccess”的组中 - 我不知道其他适合哪种策略(我可以在 AWS 控制面板中看到我的凭证具有以编程方式使用 - 所以我想这部分效果很好......)?

  2. 我已将我的凭据放在 .aws 文件夹中名为凭据的文件中。

  3. 我不确定在下面的“KeyName”中实际放入什么 - 目前我已经输入了通过单击仪表板中的一个现有 AWS EC2 实例找到的密钥对名称。这是正确的吗?

我需要编辑一些安全组或类似的东西 - 以便能够将 NodeJS 连接到我的 AWS 账户吗?否则我不知道该怎么办?

在 start.js 文件中:

process.env.AWS_SDK_LOAD_CONFIG=1;    
var AWS_SDK = require('./aws_sdk');
var aws_sdk = new AWS_SDK();

aws_sdk.CopyInstance();

在 aws_sdk.js 文件中:

function AWS_SDK() {

    this.CopyInstance = function() {

        try {

            // Load the AWS SDK for Node.js
            var AWS = require('aws-sdk');

            //Set the region
            AWS.config.update({region: 'us-east-2a'});

            var instanceParams = {
                ImageId: 'ami-0...',
                InstanceType: 't1.micro',
                KeyName: '<Key_name>',
                MinCount: 1,
                MaxCount: 1
            };

            // Create a promise on an EC2 service object
            var instancePromise = new AWS.EC2({apiVersion: '2016-11-15'}).runInstances(instanceParams).promise();

            // Handle promise's fulfilled/rejected states
            instancePromise.then(
                function (data) {
                    console.log(data);
                    var instanceId = data.Instances[0].InstanceId;
                    console.log("Created instance", instanceId);
                    // Add tags to the instance
                    var tagParams = {
                        Resources: [instanceId], Tags: [
                            {
                                Key: 'Name',
                                Value: 'SDK Sample'
                            }
                        ]
                    };

                    // Create a promise on an EC2 service object
                    var tagPromise = new AWS.EC2({apiVersion: '2016-11-15'}).createTags(tagParams).promise();
                    // Handle promise's fulfilled/rejected states
                    tagPromise.then(
                        function (data) {
                            console.log("Instance tagged");
                        }).catch(
                        function (err) {
                            console.error(err, err.stack);
                        });
                }).catch(
                function (err) {
                    console.error(err, err.stack);
                });
        }
        catch(e){
            wl.info('Error: ' + e);
        }
    } 

function create() {

    if(globalAWS === null)
        globalAWS = new AWS_SDK();

    return globalAWS;
}

module.exports = create;

错误:

{ UnknownEndpoint:无法访问的主机:ec2.us-east-2a.amazonaws.com'. This service may not be available in theus-east-2a' 区域。 在 Request.ENOTFOUND_ERROR (D:\Workspace\BitBucket\Test\node_modules\aws-sdk\lib\event_listeners.js:486:46) 在 Request.callListeners (D:\Workspace\BitBucket\Test\node_modules\aws-sdk\lib\sequential_executor.js:106:20) 在 Request.emit (D:\Workspace\BitBucket\Test\node_modules\aws-sdk\lib\sequential_executor.js:78:10) 在 Request.emit (D:\Workspace\BitBucket\Test\node_modules\aws-sdk\lib\request.js:683:14) 在 ClientRequest.error (D:\Workspace\BitBucket\Test\node_modules\aws-sdk\lib\event_listeners.js:325:22) 在客户端请求。 (D:\Workspace\BitBucket\Test\node_modules\aws-sdk\lib\http\node.js:93:19) 在 ClientRequest.emit (events.js:182:13) 在 ClientRequest.EventEmitter.emit (domain.js:442:20) 在 TLSSocket.socketErrorListener (_http_client.js:391:9) 在 TLSSocket.emit (events.js:182:13) 消息:'无法访问的主机:ec2.us-east-2a.amazonaws.com\'. This service may not be available in theus-east-2a\' 区域。',代码:'UnknownEndpoint',
地区:'us-east-2a',主机名:'ec2.us-east-2a.amazonaws.com',
可重试:true,originalError:{错误:getaddrinfo ENOTFOUND ec2.us-east-2a.amazonaws.com ec2.us-east-2a.amazonaws.com:443 在 GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:57:26) 信息: 'getaddrinfo ENOTFOUND ec2.us-east-2a.amazonaws.com ec2.us-east-2a.amazonaws.com:443', 错误号:'ENOTFOUND', 代码:“网络错误”, 系统调用:'getaddrinfo', 主机名:'ec2.us-east-2a.amazonaws.com', 主机:'ec2.us-east-2a.amazonaws.com', 端口:443, 地区:'us-east-2a', 可重试:真, 时间:2019-01-14T20:03:42.177Z },时间:2019-01-14T20:03:42.177Z } 'UnknownEndpoint:无法访问的主机: ec2.us-east-2a.amazonaws.com\'. This service may not be available in theus-east-2a\' 区域。\n 在 Request.ENOTFOUND_ERROR (D:\Workspace\BitBucket\Test\node_modules\aws-sdk\lib\event_listeners.js:486:46)\n 在 Request.callListeners (D:\Workspace\BitBucket\Test\node_modules\aws-sdk\lib\sequential_executor.js:106:20)\n 在 Request.emit (D:\Workspace\BitBucket\Test\node_modules\aws-sdk\lib\sequential_executor.js:78:10)\n 在 Request.emit (D:\Workspace\BitBucket\Test\node_modules\aws-sdk\lib\request.js:683:14)\n 在 ClientRequest.error (D:\Workspace\BitBucket\Test\node_modules\aws-sdk\lib\event_listeners.js:325:22)\n 在客户端请求。 (D:\Workspace\BitBucket\Test\node_modules\aws-sdk\lib\http\node.js:93:19)\n 在 ClientRequest.emit (events.js:182:13)\n 在 ClientRequest.EventEmitter.emit (domain.js:442:20)\n at TLSSocket.socketErrorListener (_http_client.js:391:9)\n 在 TLSSocket.emit (events.js:182:13)'

进程以退出代码 0 结束

如果我将 REGION 更改为“us-east-2”(删除末尾的“a”),错误将变为:

{ Unsupported: The requested configuration is currently not supported. Please check the documentation for supported configurations.
    at Request.extractError (D:\Workspace\BitBucket\Test\node_modules\aws-sdk\lib\services\ec2.js:50:35)
    at Request.callListeners (D:\Workspace\BitBucket\Test\node_modules\aws-sdk\lib\sequential_executor.js:106:20)
    at Request.emit (D:\Workspace\BitBucket\Test\node_modules\aws-sdk\lib\sequential_executor.js:78:10)
    at Request.emit (D:\Workspace\BitBucket\Test\node_modules\aws-sdk\lib\request.js:683:14)
    at Request.transition (D:\Workspace\BitBucket\Test\node_modules\aws-sdk\lib\request.js:22:10)
    at AcceptorStateMachine.runTo (D:\Workspace\BitBucket\Test\node_modules\aws-sdk\lib\state_machine.js:14:12)
    at D:\Workspace\BitBucket\Test\node_modules\aws-sdk\lib\state_machine.js:26:10
    at Request.<anonymous> (D:\Workspace\BitBucket\Test\node_modules\aws-sdk\lib\request.js:38:9)
    at Request.<anonymous> (D:\Workspace\BitBucket\Test\node_modules\aws-sdk\lib\request.js:685:12)
    at Request.callListeners (D:\Workspace\BitBucket\Test\node_modules\aws-sdk\lib\sequential_executor.js:116:18)
  message:
   'The requested configuration is currently not supported. Please check the documentation for supported configurations.',
  code: 'Unsupported',
  time: 2019-01-14T20:31:55.954Z,
  requestId: '815a44e2-5d0d-453e-a4ff-6faac2695064',
  statusCode: 400,
  retryable: false,
  retryDelay: 51.269952198296934 } 'Unsupported: The requested configuration is currently not supported. Please check the documentation for supported configurations.\n    at Request.extractError (D:\\Workspace\\BitBucket\\Test\\node_modules\\aws-sdk\\lib\\services\\ec2.js:50:35)\n    at Request.callListeners (D:\\Workspace\\BitBucket\\Test\\node_modules\\aws-sdk\\lib\\sequential_executor.js:106:20)\n    at Request.emit (D:\\Workspace\\BitBucket\\Test\\node_modules\\aws-sdk\\lib\\sequential_executor.js:78:10)\n    at Request.emit (D:\\Workspace\\BitBucket\\Test\\node_modules\\aws-sdk\\lib\\request.js:683:14)\n    at Request.transition (D:\\Workspace\\BitBucket\\Test\\node_modules\\aws-sdk\\lib\\request.js:22:10)\n    at AcceptorStateMachine.runTo (D:\\Workspace\\BitBucket\\Test\\node_modules\\aws-sdk\\lib\\state_machine.js:14:12)\n    at D:\\Workspace\\BitBucket\\Test\\node_modules\\aws-sdk\\lib\\state_machine.js:26:10\n    at Request.<anonymous> (D:\\Workspace\\BitBucket\\Test\\node_modules\\aws-sdk\\lib\\request.js:38:9)\n    at Request.<anonymous> (D:\\Workspace\\BitBucket\\Test\\node_modules\\aws-sdk\\lib\\request.js:685:12)\n    at Request.callListeners (D:\\Workspace\\BitBucket\\Test\\node_modules\\aws-sdk\\lib\\sequential_executor.js:116:18)'

更新 1:

我将 REGION 从更改为“us-est-2”,现在还更新了我的 ~/.aws/config 文件(在该文件仅包含 1 行/行之前:“region=us-west-2”):

[default]
region=us-west-2
output=json

现在我收到此错误(当我尝试在 CMD 中对其进行解码时) - 我仍然不明白我必须赋予/授予我的 IAM-AWS 用户哪些额外角色才能阅读错误消息?

An error occurred (AccessDenied) when calling the DecodeAuthorizationMessage operation: User: arn:aws:iam::0046xxxxxxx:user/user_name is not authorized to perform: sts:DecodeAuthorizationMessage

【问题讨论】:

  • runInstances 的文档解释说 KeyName 是“密钥对的名称”。
  • 谢谢 - 那么它应该是正确的:)
  • 我怀疑“不支持”错误是因为您正在启动的实例类型在该区域/AZ 中不可用。请注意,t1.micro 是上一代实例,已被 t2.micro 取代,因此请使用它。

标签: node.js amazon-web-services amazon-ec2 aws-cli


【解决方案1】:

您已将 AWS 区域配置为 us-east-2a。那不是一个区域,那是一个可用区。您的区域应配置为us-east-2

【讨论】:

  • 谢谢。但是后来我收到了第二条错误消息?它不支持什么?
【解决方案2】:

在我添加 IAM 角色后:“AdministratorAccess”所有问题都消失了 :) 现在的问题是 - 实际上需要授予哪些角色才能使其工作...“AdministratorAccess”只是用于测试目的.

【讨论】:

    猜你喜欢
    • 2016-10-13
    • 1970-01-01
    • 2017-10-17
    • 2020-08-01
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 2017-12-06
    • 2016-12-18
    相关资源
    最近更新 更多