こんにちは、中の人です。
今回は、AWS Lambda Advent Calendar 2014に投稿した記事『LambdaからセキュアにRDSに接続する』で作ったセキュリティグループを一括削除してみたいと思います。
※本当は同じスクリプトで削除できればいいのですが…。方法がわかったら変更します。
○今回のスクリプトの注意点
1. ホスト名で判断して削除するので、EC2等でパブリックアクセスしている場合にはポリシーが削除されちゃうため使えません。
2. IP⇒ホスト名の変換用にDNSのパッケージをインストールしますが、サイズが大きいため圧縮に時間がかかる&初回実行時はTimeoutを長め(30秒程度)に取る必要があります。
○Lambdaのプログラム
Lambdaでは
1. DBが所属するセキュリティグループからポリシーを取得
2. ポート 3306でIPアドレスのポリシーのみホスト名を参照
3. ホスト名に”amazon”を含むならポリシーの削除
という流れになります。
事前準備としてDNSパッケージをインストールします。
サーバ上で以下を実施します。
1 |
$ npm install dns |
以下のプログラムをindex.jsとして保存します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
console.log('Loading event'); var aws = require('aws-sdk'); var dns = require('dns'); var ec2 = new aws.EC2({apiVersion: '2014-10-01'}); // 対象のセキュリティグループ名 var groupID = "sg-fc18ec98"; exports.handler = function(event, context) { var params = { DryRun: false, GroupIds: [ groupID ] }; ec2.describeSecurityGroups(params, function(err, data) { if (err) console.log(err, err.stack); // an error occurred else{ // console.log(data); // console.log(data["SecurityGroups"][0]["IpPermissions"]["0"]); var IpPermissions = data["SecurityGroups"][0]["IpPermissions"]; // Objectの値を取得 Object.keys(IpPermissions).forEach(function (key) { // console.log(IpPermissions[key]); IpProtocol = IpPermissions[key]["IpProtocol"]; FromPort = IpPermissions[key]["FromPort"]; ToPort = IpPermissions[key]["ToPort"]; UserIdGroupPairs = IpPermissions[key]["UserIdGroupPairs"]; IpRanges = IpPermissions[key]["IpRanges"]; // 3306(MySQL)かつIPアドレスの場合にはパラメーターの削除をする。 if(IpProtocol == "tcp" && FromPort == 3306 && IpRanges.length > 0){ Object.keys(IpRanges).forEach(function (key) { // 削除するCIDR CidrIp = IpRanges[key]["CidrIp"]; addresses = CidrIp.split("/")[0]; // dnsモジュールでホスト名を取得 dns.reverse(addresses, function (err, hostname) { if (err) { throw err; } // ホスト名にamazonを含む場合のみ削除 result = hostname.toString().search( /amazon/ ); if (result > 0 ){ var params = { GroupId: groupID, IpPermissions: [ { FromPort: 3306, ToPort: 3306, IpProtocol: 'TCP', IpRanges: [ { CidrIp: CidrIp }, ] }, ], }; ec2.revokeSecurityGroupIngress(params, function(err, data) { if (err) console.log(err, err.stack); // an error occurred else console.log(data); // an error occurred context.done(); }); } }); }); } }); } }); }; |
続いてindex.jsと先ほどインストールしたDNSのパッケージのあるnode_modulesをまとめてzip化します。
圧縮ファイルの中身が以下の様になっていればOKです。
1 2 3 |
index.js /node_modules /dns |
lambda上にzip形式でアップして実行してみましょう。
この時にTimeoutの設定を30秒に変えることを忘れないようにして下さい。
Logs
—-
START RequestId: d90fe207-81c3-11e4-a97d-3d95cee205e2
2014-12-12T05:58:15.051Z d90fe207-81c3-11e4-a97d-3d95cee205e2 {}
END RequestId: d90fe207-81c3-11e4-a97d-3d95cee205e2
REPORT RequestId: d90fe207-81c3-11e4-a97d-3d95cee205e2 Duration: 1457.44 ms Billed Duration: 1500 ms Memory Size: 128 MB Max Memory Used: 18 MB
プログラム上にコメントアウトされているconsole.logを有効化する事で、途中の動作を確認することも出来ます。
前回の記事で作ってしまった余計なセキュリティグループを消すためのスクリプトでした。
次回、お楽しみに!