0

はおそらく、私がこれまでここに橋をつもりですが、HERESにどのような私が得た使用してEC2からAWS APIゲートウェイへのアクセス:AWS_IAMは認証のために設定されているIAM承認(NodeJS)

  • AWS APIゲートウェイ方法を。
  • そのメソッドへのアクセスを許可するポリシー。
  • そのポリシーが関連付けられているEC2ロール。
  • EC2がその役割を果たしました。

コード内でAccessKeyとSecretKeyをハードコーディングせずにそのAPIを呼び出すことができるように、NodeJSプログラム(またはそれに関する言語)をそのEC2で使用したいと考えています。

私はaws-sdkを使ってS3のレコードを取得/取得し、他のAWSの機能を実行しました。しかし、APIゲートウェイを呼び出すことはawsの外にあるようです-sdkスコープ。

難破船(私は私のアプリで私のHTTP呼び出しから使用NPM)となしのヘッダー結果とAPIを呼び出すには:そこに大きなショックはない

{ 
    "message": "Missing Authentication Token" 
} 

明白なことは何もありませんか?

+0

API -sdk.html)は、あなたの* APIにアクセスするための特別なSDKを構築/生成します。それを使ったことはありませんでしたが、あなたはそれを見てみるかもしれません。 –

答えて

0

だから、あなたにはhereを説明http://169.254.169.254/latest/meta-data/iam/security-credentials/Role_Name

であなたのEC2にアクセスする必要が表示されます。ここで

Signing AWS Requests with Signature Version 4を含む私の最終的なコードです:ゲートウェイは、[SDKジェネレータ](http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-generateを持って

var Moment = require('moment'); 
var Wreck = require('wreck'); 
var Crypto = require('crypto'); 

function getSignatureKey(key, dateStamp, regionName, serviceName) { 
    var kDate = Crypto.createHmac('sha256', 'AWS4' + key).update(dateStamp,'utf8').digest(); 
    var kRegion = Crypto.createHmac('sha256', kDate).update(regionName, 'utf8').digest(); 
    var kService = Crypto.createHmac('sha256', kRegion).update(serviceName, 'utf8').digest(); 
    var kSigning = Crypto.createHmac('sha256', kService).update('aws4_request', 'utf8').digest(); 
    return kSigning; 
} 

var assumed_role = 'MY_ROLE'; 
Wreck.get('http://169.254.169.254/latest/meta-data/iam/security-credentials/' + assumed_role, function(err, res, payload) { 
    var payload_obj = JSON.parse(payload.toString()); 
    var access_key = payload_obj.AccessKeyId; 
    var secret_key = payload_obj.SecretAccessKey; 
    var token = payload_obj.Token; 

    var payload = {} 
    payload.email = '[email protected]'; 
    payload.first_name = 'Devin'; 
    payload.last_name = 'Stewart'; 
    payload.full_name = 'Devin Stewart'; 

    var request_parameters = JSON.stringify(payload); 

    var method = 'POST'; 
    var api_id = 'MY_API_ID' 
    var service = 'execute-api'; 
    var region = 'us-east-1'; 
    var api_path = '/production/people'; 
    var host = api_id + '.' + service + '.' + region + '.amazonaws.com'; 
    var endpoint = 'https://' + host + api_path; 
    var content_type = 'application/json'; 

    var t = Moment.utc() 
    var amz_date = t.format('YYYYMMDD[T]HHmmss[Z]'); 
    var date_stamp = t.format('YYYYMMDD'); // Date w/o time, used in credential scope 

    var canonical_querystring = ''; 
    var canonical_headers = 'content-type:' + content_type + '\n' + 'host:' + host + '\n' + 'x-amz-date:' + amz_date + '\n' + 'x-amz-security-token:' + token + '\n'; 
    var signed_headers = 'content-type;host;x-amz-date;x-amz-security-token'; 
    var payload_hash = Crypto.createHash('sha256').update(request_parameters).digest('hex'); 
    var canonical_request = method + '\n' + api_path + '\n' + canonical_querystring + '\n' + canonical_headers + '\n' + signed_headers + '\n' + payload_hash; 

    var algorithm = 'AWS4-HMAC-SHA256'; 
    var credential_scope = date_stamp + '/' + region + '/' + service + '/' + 'aws4_request'; 
    var string_to_sign = algorithm + '\n' + amz_date + '\n' + credential_scope + '\n' + Crypto.createHash('sha256').update(canonical_request).digest('hex'); 

    var signing_key = getSignatureKey(secret_key, date_stamp, region, service); 
    var signature = Crypto.createHmac('sha256', signing_key).update(string_to_sign, 'utf8').digest('hex'); 

    authorization_header = algorithm + ' ' + 'Credential=' + access_key + '/' + credential_scope + ', ' + 'SignedHeaders=' + signed_headers + ', ' + 'Signature=' + signature; 
    var headers = { 
     'Content-Type':content_type, 
     'X-Amz-Date':amz_date, 
     'X-Amz-Security-Token':token, 
     'Authorization':authorization_header 
    }; 

    var options = {headers: headers, payload: request_parameters}; 
    Wreck.post(endpoint, options, function (err, res, payload) { 
     if (err) { 
      console.log(err.data.payload.toString()); 
     } else { 
      console.log(payload.toString()); 
     } 
    }); 
});