『LambdaからセキュアにRDSに接続する』で作成したSecurity Groupを削除する

こんにちは、中の人です。

今回は、 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として保存します。

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  /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を有効化する事で、途中の動作を確認することも出来ます。

前回の記事で作ってしまった余計なセキュリティグループを消すためのスクリプトでした。

次回、お楽しみに!

この記事を書いた人

aws-recipe-user