はじめに
Node.jsでAWS Lambdaファンクションを作成した時、AWS Key Management Service(KMS)で暗号化した文字列をkms.decryptにより復号化する例です。
概要
AWS Lambdaファンクション作成時、サーバ接続用パスワード、Slackをはじめとする外部サービス連携用のトークン文字列といった認証情報やクレデンシャルをプログラム内に書いておきたい事があるかと思います。
時には、Lambdaファンクションに、パスワードやトークン文字列を平文のまま書くのではなく、パスワードやトークン文字列を暗号化して書いておきたい事があるかもしれません。
このページでは、AWS KMSにより暗号化したトークン文字列をLambdaファンクション(Node.js)に記述する事で、Lambdaファンクション実行時に暗号化したトークン文字列を復号化する例について記載します。
参考サイト
KMSによるパスワードやトークン文字列の暗号化手順はクラスメソッド様の記事を参考にさせて頂きました。
http://dev.classmethod.jp/cloud/decrypt-sensitive-data-with-kms-on-lambda-invocation/
KMSで認証情報を暗号化しLambda実行時に復号化する
LambdaファンクションでKMSにより暗号化した文字列を復号化するサンプルコード
Lambdaファンクション作成にあたり、まずはaws kms encryptコマンドで「example_password」というトークン文字列を暗号化するとします。
後述のLambdaファンクションサンプルコード中の「kmsEncyptedToken」には、aws kms encryptコマンドにより「example_password」を暗号化した文字列(CiC** ~ **I=)をセットします。
Lambdaファンクションは
ランタイムは「Node.js」
Handlerは「index.handler」
Roleは「lambda_basic_execution」
Advanced settingsは「No VPC」
を選択して作成します。
Lambda(node.js)でKMSにより暗号化した文字列を復号化するサンプルコードは以下になります。
var AWS = require('aws-sdk');
exports.handler = function(event, context){
var token;
var kmsEncyptedToken = "CiC**********************************************************************************************I=";
var encryptedBuf = new Buffer(kmsEncyptedToken, 'base64');
var cipherText = {CiphertextBlob: encryptedBuf};
var kms = new AWS.KMS({ region: 'ap-northeast-1' });
kms.decrypt(cipherText, function (err, data) {
if (err) {
console.log("token string decrypt error: " + err);
context.fail(err);
} else {
token = data.Plaintext.toString('ascii');
console.log('token string = ' + token);
}
});
};
Lambdaファンクションを実行し、「Log output」に「example_password」と文字列が表示されていれば、KMSで暗号化したトークン文字列の復号化は正常です。
START RequestId: 28f3900b-fb59-11e5-8a6a-3f80f8c61572 Version: $LATEST
2016-04-05T18:06:47.427Z 28f3900b-fb59-11e5-8a6a-3f80f8c61572 token string = example_password
END RequestId: 28f3900b-fb59-11e5-8a6a-3f80f8c61572
REPORT RequestId: 28f3900b-fb59-11e5-8a6a-3f80f8c61572 Duration: 853.67 ms Billed Duration: 900 ms Memory Size: 128 MB Max Memory Used: 19 MB