クラウドインテグレーションサービス「雲斗」のブログ

芝公園にある創研情報株式会社がAWS を 中心にクラウドの基本から便利な使いかたまでをお伝えしていきます。

Amazon CloudWatch AWS Lambda

AWS Lambdaでバッチを作ってみる

2018/08/31

最近、AWSサイトのロゴが変わりましたね。お気づきの方も多いかと思います。
随分とシンプルなデザインになりましたね。
AWSに限らず、NIKE、Google、Master、Microsoft、Twitter・・・、有名どころのロゴってどんどんシンプルなデザインになってますよね。

さて、今回はAWSのサーバレスアーキテクチャを担う「AWS Lambda(=ラムダ)」です。
サンプルとして、AWS Lambdaを利用したEC2サーバの再起動バッチを作ってみます。
サーバを定期再起動する必要がないようにサーバやアプリケーションの設定を行っていくのが本筋なのですが、そこは目をつぶって・・・

-------------------------------------------------------

①まずはAWSマネジメントコンソールにログインし、「Lambda」をクリック。
lambdaキャプチャ

②Lambdaの設定画面です。「関数の作成」をクリック。lambdaキャプチャ

③「一から作成」をクリック。lambdaキャプチャ

④トリガーの設定は後で行うので、ここではいったん何もせずに「次へ」をクリック。lambdaキャプチャ

⑤Lambda関数の基本設定です。
名前と説明は適当に決めて入力します。ランタイムについては、今回はPython2.7を利用します。
さらに入力をしますので、下にスクロールします。lambdaキャプチャ

⑥実行するLambda関数のコードを編集します。
コードエントリタイプは「コードをインラインで編集」を選択し、下のようにコードを入力します。
さらに設定しますので、下にスクロールしてください。
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ロールを割り当てます。
ロールで「カスタムロールの作成」を選択します。
自動的に別ウィンドウ(または別タブ)が立ち上がります。lambdaキャプチャ

⑧IAMロールの設定をしていきます。
IAMロールでは「新しいIAMロールの作成」を選択し、ロール名は適当に設定します。
引き続き「ポリシードキュメントを表示」をクリック。lambdaキャプチャ

⑨「編集」をクリックし、EC2の再起動を許可するポリシードキュメントを設定します。
設定し終わったら「許可」をクリックします。lambdaキャプチャ

{
  "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キャプチャ

⑪「関数の作成」をクリック。lambdaキャプチャ

⑫作成が完了しました。
引き続き動作確認をしますので、「テスト」をクリック。lambdaキャプチャ

⑬Lambdaはイベントを契機として起動するものとなりますので、テスト用のイベントを設定します。
ただ、今回はある日時になったら必ず実行する定期バッチのようなものとなりますので、ここでのテスト用のイベントメッセージは適当で大丈夫です。
特にこだわりがなければ、デフォルトの「Hello World」のテンプレートをそのまま利用しましょう。
あ、再起動のテストになりますので、対象EC2インスタンスが起動している状態にして、SSHもしくはリモートデスクトップなどでEC2に接続している状態にしているとわかりやすいですね (^-^)
選択後、「保存してテスト」をクリック。lambdaキャプチャ

⑭Lambda関数の実行に成功すると下のような画面になります。
同時に⑬で起動していたSSHやリモートデスクトップの接続が切れ、画面が消えたかと思います。
これでLambdaの設定は完了です。
引き続き、定期起動の設定をしていきます。
「トリガー」をクリック。
lambdaキャプチャ

⑮「トリガーを追加」をクリック。lambdaキャプチャ

⑯点線の四角枠部分をクリックし、「CloudWatch Events」を選択します。
今回作成するLambda関数は、CloudWatch Eventというサービスから送信されるイベントを受けて起動する形となります。lambdaキャプチャ

⑰ルールに「新規ルールの作成」を選択します。lambdaキャプチャ

⑱ルール名とルールの説明は適当に入力、ルールタイプは「スケジュール式」を選択します。
スケジュール式ではcronまたはrate式で起動ルールを設定します。
スケジュール式の仕様については以下のURLにあるAWSドキュメントを参照してください。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/tutorial-scheduled-events-schedule-expressions.html
ここに入力しているものは、「日本時間で毎月1日の5時(=世界標準時で毎月最終日の20時)」となります。
入力したら下のほうの「送信」をクリック。lambdaキャプチャ
lambdaキャプチャ

⑲下のようになったら定期起動の設定完了です!lambdaキャプチャ

これを応用すれば、EC2インスタンスの定期的な停止⇒起動制御も簡単にできますね!

-Amazon CloudWatch, AWS Lambda

Bitnami