AWS LambdaでサーバーレスにEC2メンテナンスをslackに通知する 〜その2〜
登場人物おさらい
4は少し長くなりそうなので、この記事では1, 2, 3を行います。
- Lambdaを実行するIAMにアタッチするポリシー
- スケジュール実行に必要なCloudWatch Events設定
- SlackのIncoming Webhooks設定/Webhook URL取得
- Lambda Functionの作成・実装
尚、設定用のIAM Userは事前に作成済で、ログインした上で操作している前提とします。
1. Lambda実行用の独自ポリシー作成
ポリシー要件は下記の通りです。
- CloudWatch Logsへのログ出力
- VPC内で実行可能
- EC2メンテナンスの情報が取得可能
AWSコンソールにて "IAM" を選択し、ロールの設定画面を開きます。
ポリシーをアタッチするIAMロールは、Lambda関数を作成すると自動的に作成されるデフォルトの"lambda_basic_execution"にします。
もちろん先にLambda関数を作成せずに、同名・別名で新規作成してもかまいません。
ポリシーの作成は "ロール" の下の "ポリシー" → "ポリシーの作成" から行います。
既存のポリシーからコピーしたり、ジェネレータを使うやり方もありますが、
ここでは "独自のポリシーを作成" を選択します。
選択後表示された入力欄をそれぞれ埋めていきます。
ポリシー名: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:*:*:*" } ] }
作成したポリシーを先程のロールにアタッチしたら完了です。
2. CloudWatch Eventsにルールを作成
CloudWatch Eventとは、AWSのシステムイベントのほぼリアルタイムなストリームを、Lambda関数や、Amazon SNS のトピック、Amazon Kinesis Streamsに振り分けることが可能なサービスです。
Cron 式に下記を記述します。
0 1 ? * MON-FRI *
この設定により、1日1回、月〜金の10時ごろに実行されます。
グリニッジ標準時で記述するので、日本標準時(UTC+0900)だと +9時間となります。
実際は、次回作成するLambda関数を準備してから、CloudWatch Eventのターゲットに指定します。
関数作成後にこの作業を行うことだけ覚えておいてください。
3. SlackのIncoming Webhooks設定/Webhook URL取得
Incoming Webhooksとは、外部ソースからのメッセージをSlackに投稿するWebhookです。
設定・URL取得方法は下記がわかりやすかったので参考にしてください。
docs.hatenablog.jp
ここで取得したURLを、Lambda関数のslack通知ロジックに指定することになります。
今回はここまでです。
次回の記事はこちら。
kitakitabauer.hatenablog.com