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