LoginSignup
6
7

More than 5 years have passed since last update.

[AWS] Lambda(Python)とカスタムメトリクスを使って、VPN接続を監視する [CloudWatch]

Last updated at Posted at 2016-05-30

こんにちは。
AWSでVPN接続をしたときに何かしらの監視の仕組みは必要だと思ったので、LambdaとCloudWatchのカスタムメトリクスを使って監視してみました!
コードに関しては、勉強不足です。ごめんなさい。
もっと汎用的で見やすいコードが書けるように勉強します!

1.今回やること

・LambdaでVPNの接続ステータスの値を取得。
・取得した値をCloudWatchにプット。
・カスタムメトリクスの値は、UPしているVPNトンネルの本数。
 Ex)VPNトンネル2本ともアップしている場合、「2」を入れる。
・Lambdaのスケジュール機能を使って5分ごとにVPNの接続ステータスを確認。

2.前提

・VPN1本、VPNトンネル2本の環境を想定してスクリプトを作っています。

3.コード

pprintは、デバック用に残してあります。動作には特に関係ありません。

def lambda_handler(event, context):
    import boto3
    import datetime
    #import pprint

    i = 0
    ec2 = boto3.client('ec2')
    cloudwatch = boto3.client('cloudwatch')
    #pp = pprint.PrettyPrinter(indent=4)


    #Check VPN Status
    response = ec2.describe_vpn_connections()


    Vpn1 = response["VpnConnections"][0]["VgwTelemetry"][0]["Status"]
    Vpn2 = response["VpnConnections"][0]["VgwTelemetry"][1]["Status"]


    if Vpn1 == "UP":
                i = i + 1
    if Vpn2 == "UP":
                i = i + 1

    #PutMetricData
    PutMetricData = cloudwatch.put_metric_data(
                Namespace='VPN',
                MetricData=[
                            {
                                        'MetricName': 'vpnConnection',
                                        'Timestamp': datetime.datetime.utcnow(),
                                        'Value': i,
                                        'Unit': "Count"
                            },
                ]
    )

    PutMetricData

4.ロール権限

Lambdaに設定するロールは以下のようになります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "cloudwatch:PutMetricData"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeVpnConnections"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

4.Lambdaファンクション作成

Lambdaファンクションの作成までやっていきます。

・[Lambda]をクリックします。
001.png

・[Create a Lambda function]をクリックします。
002.png

・テンプレートは使用しないので、[Skip]をクリックします。
003.png

・[Name][Description]に任意の値を入力し、 [Runtime]で「Python2.7」を選びます。
 [Lambda function code]に、「3.コード」のコードをコピー&ペーストします。
004.png

・権限の設定をします。[Role]で「Create new role」- [Basic execution role]を選びます。
005.png

・[新しいIAMロール作成]を選び、[ロール名]に任意の値を入力します。
 そのあと、 [編集]をクリックし、「4.ロール権限」の値をコピー&ペーストします。
006.png

・実行時間の設定をします。[Timeout]の時間を「30」に設定し、[Next]をクリックします。
 #もしかするともっと短くてもいいかもしれません。
007.png

・プレビューが表示されるので内容を確認して、[Create function]をクリックします。
008.png

・これでLambdaファンクションの作成は完了です。
009.png

5.Lambdaスケジュール登録

次にスケジュールの登録をします。

・[Event sources]-[Add event source]をクリックします。
010.png

・[Cloudwatch Events - Schedule]をクリックします。
011.png

・[Rule name][Rule description]に任意の値を入力します。
 [Schedule expression]で「rate(5 minutes)」を選択し、[Submit]をクリックします。
 スケジュールの詳しい内容は、こちらをご参照ください。
012.png

・これでスケジュール登録も完了です。
013.png

・CloudWatchのカスタムメトリクスの値を確認すると、5分ごとに値が入っていますね。
 #VPNトンネルが両方ダウンしているので0を返しています。
CloudWatch_Management_Console.png

6.最後に

・通知をする場合は、CloudWatchからアラートの設定をすればできますね。

・AWS内部の情報はAmazon側から提供されていない限りユーザー自身で監視しなければならないので、Lambdaを使った監視はすごく良いのではないかと思います。何かを監視するためだけにサーバーを立てていると費用もかかりますからね。もっともっとLambdaをうまく使えるように勉強します!

簡単となりますが、以上となります。
ご指摘事項などありましたら、ご連絡お願いいたします。

99.参考

http://boto3.readthedocs.io/en/latest/reference/services/ec2.html#EC2.Client.describe_vpn_connections
http://boto3.readthedocs.io/en/latest/reference/services/cloudwatch.html#CloudWatch.Client.put_metric_data
https://siguniang.wordpress.com/2014/12/19/publish-custom-metrics-to-cloudwatch-with-awscli/
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-scheduled-events.html

参考にさせていただきました。ありがとうございます。

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7