読者です 読者をやめる 読者になる 読者になる

bauer's diary

凡人の凡人による凡人のための備忘録

AWS LambdaでサーバーレスにEC2メンテナンスをslackに通知する 〜その2〜

登場人物おさらい

4は少し長くなりそうなので、この記事では1, 2, 3を行います。

  1. Lambdaを実行するIAMにアタッチするポリシー
  2. スケジュール実行に必要なCloudWatch Events設定
  3. SlackのIncoming Webhooks設定/Webhook URL取得
  4. Lambda Functionの作成・実装

尚、設定用のIAM Userは事前に作成済で、ログインした上で操作している前提とします。

1. Lambda実行用の独自ポリシー作成

ポリシー要件は下記の通りです。

  1. CloudWatch Logsへのログ出力
  2. VPC内で実行可能
  3. EC2メンテナンスの情報が取得可能

AWSコンソールにて "IAM" を選択し、ロールの設定画面を開きます。
f:id:kitakitabauer:20170405223658p:plain

ポリシーをアタッチするIAMロールは、Lambda関数を作成すると自動的に作成されるデフォルトの"lambda_basic_execution"にします。
もちろん先にLambda関数を作成せずに、同名・別名で新規作成してもかまいません。
f:id:kitakitabauer:20170405223703p:plain

ポリシーの作成は "ロール" の下の "ポリシー" → "ポリシーの作成" から行います。
f:id:kitakitabauer:20170405224030p:plain

既存のポリシーからコピーしたり、ジェネレータを使うやり方もありますが、
ここでは "独自のポリシーを作成" を選択します。
f:id:kitakitabauer:20170405224146p:plain

選択後表示された入力欄をそれぞれ埋めていきます。
ポリシー名:EC2FullAccess
説明:EC2 フルアクセス

ポリシードキュメントはこちらです。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt14811776XXXXX",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "ec2:*"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        }
    ]
}

インスタンスの状態を確認するためには "ec2:DescribeInstanceStatus" が許可されている必要があります。
Lambda作成時にVPCを指定して作成されるロール "AWSLambdaVPCAccessExecutionRole" には上記が付かないため、別のロールにアタッチしています。

ここでは"ec2:*"としてしまっていますが、もちろん今回必要と思われる下記アクションを一つ一つ指定してもかまいません。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt14811776XXXXX",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "ec2:CreateNetworkInterface",
                "ec2:DescribeNetworkInterfaces",
                "ec2:DeleteNetworkInterface",
                "ec2:DescribeInstanceStatus"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        }
    ]
}


作成したポリシーを先程のロールにアタッチしたら完了です。
f:id:kitakitabauer:20170405224607p:plain

2. CloudWatch Eventsにルールを作成

CloudWatch Eventとは、AWSのシステムイベントのほぼリアルタイムなストリームを、Lambda関数や、Amazon SNS のトピック、Amazon Kinesis Streamsに振り分けることが可能なサービスです。

f:id:kitakitabauer:20170405220302p:plain:w1200
Cron 式に下記を記述します。

0 1 ? * MON-FRI *

この設定により、1日1回、月〜金の10時ごろに実行されます。
グリニッジ標準時で記述するので、日本標準時(UTC+0900)だと +9時間となります。
f:id:kitakitabauer:20170405220510p:plain:w1200

実際は、次回作成するLambda関数を準備してから、CloudWatch Eventのターゲットに指定します。
関数作成後にこの作業を行うことだけ覚えておいてください。

3. SlackのIncoming Webhooks設定/Webhook URL取得

Incoming Webhooksとは、外部ソースからのメッセージをSlackに投稿するWebhookです。
設定・URL取得方法は下記がわかりやすかったので参考にしてください。
docs.hatenablog.jp

ここで取得したURLを、Lambda関数のslack通知ロジックに指定することになります。


今回はここまでです。
次回の記事はこちら。
kitakitabauer.hatenablog.com