AWS Lambdaでバッチを作ってみる
2018/08/31
最近、AWSサイトのロゴが変わりましたね。お気づきの方も多いかと思います。
随分とシンプルなデザインになりましたね。
AWSに限らず、NIKE、Google、Master、Microsoft、Twitter・・・、有名どころのロゴってどんどんシンプルなデザインになってますよね。
さて、今回はAWSのサーバレスアーキテクチャを担う「AWS Lambda(=ラムダ)」です。
サンプルとして、AWS Lambdaを利用したEC2サーバの再起動バッチを作ってみます。
サーバを定期再起動する必要がないようにサーバやアプリケーションの設定を行っていくのが本筋なのですが、そこは目をつぶって・・・
-------------------------------------------------------
①まずはAWSマネジメントコンソールにログインし、「Lambda」をクリック。
④トリガーの設定は後で行うので、ここではいったん何もせずに「次へ」をクリック。
⑤Lambda関数の基本設定です。
名前と説明は適当に決めて入力します。ランタイムについては、今回はPython2.7を利用します。
さらに入力をしますので、下にスクロールします。
⑥実行するLambda関数のコードを編集します。
コードエントリタイプは「コードをインラインで編集」を選択し、下のようにコードを入力します。
さらに設定しますので、下にスクロールしてください。
import boto3
# Enter the region your instances are in, e.g. 'us-east-1'
region = 'ap-northeast-1'
# Enter your instances here: ex. ['X-XXXXXXXX', 'X-XXXXXXXX']
instances = ['i-XXXXXXXXXXXXXXXXX']
def lambda_handler(event, context):
ec2 = boto3.client('ec2', region_name=region)
ec2.reboot_instances(InstanceIds=instances)
print 'rebooted your instances: ' + str(instances)
* 「region」は、再起動を行いたいEC2インスタンスが起動しているリージョンを設定します。
** 「i-XXXXXXXXXXXXXXXXX」の部分は、再起動を行いたいEC2インスタンスのインスタンスIDを設定します。
⑦Lambda関数のアクセス許可を設定します。このLambda関数からEC2を再起動できるようにIAMロールを割り当てます。
ロールで「カスタムロールの作成」を選択します。
自動的に別ウィンドウ(または別タブ)が立ち上がります。
⑧IAMロールの設定をしていきます。
IAMロールでは「新しいIAMロールの作成」を選択し、ロール名は適当に設定します。
引き続き「ポリシードキュメントを表示」をクリック。
⑨「編集」をクリックし、EC2の再起動を許可するポリシードキュメントを設定します。
設定し終わったら「許可」をクリックします。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:*"
},
{
"Effect": "Allow",
"Action": [
"ec2:RebootInstances"
],
"Resource": "*"
}
]
}
⑩既存のロールに⑨で設定したIAMロール名が設定されていることを確認して「次へ」をクリック。
⑫作成が完了しました。
引き続き動作確認をしますので、「テスト」をクリック。
⑬Lambdaはイベントを契機として起動するものとなりますので、テスト用のイベントを設定します。
ただ、今回はある日時になったら必ず実行する定期バッチのようなものとなりますので、ここでのテスト用のイベントメッセージは適当で大丈夫です。
特にこだわりがなければ、デフォルトの「Hello World」のテンプレートをそのまま利用しましょう。
あ、再起動のテストになりますので、対象EC2インスタンスが起動している状態にして、SSHもしくはリモートデスクトップなどでEC2に接続している状態にしているとわかりやすいですね (^-^)
選択後、「保存してテスト」をクリック。
⑭Lambda関数の実行に成功すると下のような画面になります。
同時に⑬で起動していたSSHやリモートデスクトップの接続が切れ、画面が消えたかと思います。
これでLambdaの設定は完了です。
引き続き、定期起動の設定をしていきます。
「トリガー」をクリック。
⑯点線の四角枠部分をクリックし、「CloudWatch Events」を選択します。
今回作成するLambda関数は、CloudWatch Eventというサービスから送信されるイベントを受けて起動する形となります。
⑱ルール名とルールの説明は適当に入力、ルールタイプは「スケジュール式」を選択します。
スケジュール式ではcronまたはrate式で起動ルールを設定します。
スケジュール式の仕様については以下のURLにあるAWSドキュメントを参照してください。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/tutorial-scheduled-events-schedule-expressions.html
ここに入力しているものは、「日本時間で毎月1日の5時(=世界標準時で毎月最終日の20時)」となります。
入力したら下のほうの「送信」をクリック。
これを応用すれば、EC2インスタンスの定期的な停止⇒起動制御も簡単にできますね!