今回行う内容
Lambdaではトリガーを設定して処理を実行させることが出来ます。
この記事では20時に所望のec2インスタンスを停止させるという目的のもと、Lambdaの使い方を説明して行きます。
Lambdaの新規作成
今回はec2のstart,stopの権限を追加しなければならないので、カスタムロールを作成します。
新規Lambdaの作成から、以下のようにカスタムロールの作成を選択してください(名前は適当に決めてください。ランタイムはPython3.6にします)。 新しいIAMロールの作成を選び、ロール名を適当に設定します。ポリシードキュメントを表示、編集から以下のように書き換えます。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:*" }, { "Effect": "Allow", "Action": [ "ec2:Start*", "ec2:Stop*" ], "Resource": "*" } ] }
許可するとLambda作成画面で勝手に既存のロールとして選択されますので、このまま関数の作成を押します。これで関数の画面に飛びます。
ec2インスタンスを停止させるスクリプトを書く
さて、ec2にアクセス権を持つLambdaを作成できたので、具体的にインスタンスを停止させるスクリプトをPythonで書いていきます。 AWS用のboto3というライブラリを使います。また、以下対象のインスタンスID(i-*****************)をmy_idと書きます。
関数コードのlambda_function.pyを編集していきます。
一番シンプルに書くと以下のようになります。コピペしてください。
import boto3 import os def lambda_handler(event, context): instance_id = ['my_id'] ec2 = boto3.client("ec2") ec2.start_instances(InstanceIds=instance_id) return 'Hello from Lambda'
コピペできたら、右上の保存ボタンで内容を保存し、テストを選択してテストしましょう。以下のように表示されたら成功です。選択したインスタンスが起動していることを確認しましょう。
トリガーを設定し、目的を達成する
中身はできたので、これを実行するタイミングを決めて目的を達成しましょう。20時にこのスクリプトを起動するためにCloudWatch Eventを使用します。
サービス→管理ツール→CloudWatchに入り、左のイベント→ルールの作成を選択します。
今回はcron式によって指定します。詳しくは公式ドキュメントから確認してください。
cron式とターゲット(作成したLambda関数)を選択します。今回のcron式はcron(0 18 * * ? *)です。
詳細に飛び、適当に説明を追加した後ルールの作成をします。 これで完成です。
8:00にインスタンスを起動させたいなら、同じようにまずLambda関数を作り、CloudWatchでイベントを設定してあげれば大丈夫です。