2017-01-31 13 views
0

AWS Lambda関数からAWS Key Management Service(KMS)を使用していくつかの環境変数を解読し、解読された資格情報を使用してツイートを投稿しようとしています。しかし、Twitterオブジェクトを利用する前に、環境変数の暗号化が解除されていません。これにより、認証が失敗する原因となります。Node.jsを使用して非同期オブジェクトを構築する

メンバ関数を呼び出す前に、Twitterオブジェクトが完全にインスタンス化され/初期化されていることを確認するにはどうすればよいですか?代わりに私は約束を使用すべきですか?

var AWS = require('aws-sdk'); 
var Twitter = require('twitter'); 
var s3 = new AWS.S3(); 
var kms = new AWS.KMS(); 

function DecryptEnvironmentVariable(creds, varname) { 
    console.log(`Decrypting environment variable named ${varname}`); 
    console.log(process.env[varname]); 

    params = { 
     CiphertextBlob: process.env[varname] 
    } 
    kms.decrypt(params, function (err, data) { 
     if (err) { 
      console.log(err); 
     } 
     else { 
      console.log("Successfully decrypted envrionment variable."); 
      return data.Plaintext; 
     } 
    }); 
} 

exports.tweet = function (event, context) { 
    // Instantiate the Twitter object 
    var twitterclient = new Twitter({ 
     consumer_key: DecryptEnvironmentVariable('TWITTER_CONSUMER_KEY'), 
     consumer_secret: DecryptEnvironmentVariable('TWITTER_CONSUMER_SECRET'), 
     access_token_key: DecryptEnvironmentVariable('TWITTER_ACCESS_TOKEN_KEY'), 
     access_token_secret: DecryptEnvironmentVariable('TWITTER_ACCESS_TOKEN_SECRET'), 
    }) 

    // Post a new tweet 
    twitterclient.post('statuses/update', { status: "messagegoeshere" }) 
    .then(function(tweet) { 
     console.log("Tweet was successfully posted!"); 
    }) 
    .catch(function(error) { 
     console.log("Error occurred while posting tweet. :("); 
     console.log(error); 
    }); 
} 

答えて

1

DecryptEnvironmentVariable実際には返信なので、実際にあなたがしようとしている方法で使用することはできません。

あなたは(あなたがnodejsの現在のバージョンを使用していると仮定すると)おそらくそれを行うの最も簡単な方法はPromise.allとなり、複数の非同期操作の結果を取得する必要がありますので:

var AWS = require('aws-sdk'); 
var Twitter = require('twitter'); 
var s3 = new AWS.S3(); 
var kms = new AWS.KMS(); 

function DecryptEnvironmentVariable(creds, varname) { 
    return new Promise(function (resolve, reject) { 
    console.log(`Decrypting environment variable named ${varname}`); 
    console.log(process.env[varname]); 

    params = { 
     CiphertextBlob: process.env[varname] 
    } 
    kms.decrypt(params, function (err, data) { 
     if (err) { 
     console.log(err); 
     reject(err); 
     } 
     else { 
     console.log("Successfully decrypted envrionment variable."); 
     resolve(data.Plaintext); 
     } 
    }); 
    }); 
} 

exports.tweet = function (event, context) { 
    // Instantiate the Twitter object 
    var tasks = [ 
    DecryptEnvironmentVariable('TWITTER_CONSUMER_KEY'), 
    DecryptEnvironmentVariable('TWITTER_CONSUMER_SECRET'), 
    DecryptEnvironmentVariable('TWITTER_ACCESS_TOKEN_KEY'), 
    DecryptEnvironmentVariable('TWITTER_ACCESS_TOKEN_SECRET') 
    ]; 

    return Promise.all(tasks).then(function (keys) { 

    var twitterclient = new Twitter({ 
     consumer_key: keys[0], 
     consumer_secret: keys[1], 
     access_token_key: keys[2], 
     access_token_secret: keys[3] 
    }); 

    // Post a new tweet 
    return twitterclient.post('statuses/update', { status: "messagegoeshere" }); 
    }) 
    .then(function(tweet) { 
    console.log("Tweet was successfully posted!"); 
    }) 
    .catch(function(error) { 
    console.log("Error occurred while posting tweet. :("); 
    console.log(error); 
    }); 
} 
+2

FYI AWS SDKは約束をサポートしているので、新しいPromiseですべてをラップするのではなく、 'DecryptEnvironmentVariable'関数で' return kms.decrypt(params).promise() 'のようなことをするだけです。 – idbehold

+0

ニース、私はドキュメントをチェックしたときにそれを見ていませんでしたが、もう一度私はあまりにもハードに見えませんでした – rossipedia

+1

ドキュメントは少し隠されています。基本的に、['KMS.decrypt()'](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/KMS.html#decrypt-property)は、[AWS.Request'](https: //docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Request.html)インスタンスには['promise()'メソッドがあります(https://docs.aws.amazon.com/AWSJavaScriptSDK/latest /AWS/Request.html#promise-property)。 – idbehold

0

AWSラムダsupports environment variables natively。したがって、KMSで自分で暗号化/復号化する必要はありません。組み込みの環境変数を使用すると、通常どおりの場所にアクセスするだけで、より簡単で同期的に使用することができます。process.env.TWITTER_CONSUMER_KEY

関連する問題