AWS Lambdaを使ってサーバレス!自動運用構築のために書き方解説

IT

・AWSサービスを利用している方
・AWSでの運用機能開発に悩んでいる方
・Lambdaに使い方がわからず困っている方

AWSでサーバを使用していこうとしている方にとっては、運用機能の開発は避けては通れない関門です。
Lambda関数を使用することで、運用機能の自動化はもちろん、アプリケーション領域もサーバ構築無しで実行することが可能なとなります。

便利なサービスのため色んな方にしようをオススメしたいのですが、AWS Lambdaとさらにプログラミングコードも書くことができる必要があるため、なかなかとっつきづらいかと思います。

そんな方にまず入門編として、簡単な自動運用機能の構築方法をご紹介したいと思います。

AWS Lambdaとは?

AWS Lambdaとは、「実行したいプログラミングコードを入力しておくだけで、AWSが勝手に実行してくれるサービス」です。
どういった点が優れているのかを見るために、AWS Lambdaを使わなかった場合と比較してみましょう。

AWS Lambdaを使わない場合は、プログラムを実行する環境を自分で作成する必要があります。

■メリット

  • 細かな設定が可能

■デメリット

  • 構築に時間がかかるのですぐにできない。
  • コンピューターの正常動作を監視する必要がある。

比較して、AWS Lambda を使用する場合は、アカウントの作成が環境構築と同義になります。

■メリット

  • 即時開始可能
  • 時間と労力が節約できる
  • 初期費用が安い
  • 実行環境の正常性を監視する必要がない

■デメリット

  • 細かい設定ができない
  • プログラミング言語も対応しているものに制限される

AWS Lambdaでは使える言語も多数あり、以下の言語環境をサポートしています。
逆にこれ以外を使用したい場合は、AWS Lambda上で実行環境を自身で作成することになるので少し手間が増えます。
それでも、実行環境を一から作成するのに比べると楽ではありますが。

・Java                  ・C#
・Go                     ・Python
・PowerShell         ・Ruby
・Node.js

AWS Lambdaの活用事例

AWS LambdaはAWS上の様々なサービスに対して操作を行うことが可能なので、想像力次第では何でもできるといっても過言ではありません。
色々なことができるサービスですが、実際にどのように使えるのか活用事例の一部を見ていきましょう。

EC2の自動起動/自動停止

AWSサービスを使用している人はEC2を使用していることも多いかと思います。
このEC2は使用している時間で課金されるため、使わない時間もずっと起動したままにしておくのは費用的にとても無駄になります。

そのため、使用したい時間だけ起動/停止を行うのが通常の使用方法になりますが、毎回起動したり、停止したりするのはなかなか手間がかかります。
例えば、自社の社員が使用する検証用のサーバなどであれば、基本的に使用するのは、9:00~20:00くらいでしょう。

であれば、AWS Lambdaの自動実行により、9:00になったら検証用サーバが起動し、20:00で自動で停止するように設定することで、停止し忘れも防止できますので、コスト削減につながる可能性があります。
時間もすぐに変更可能なので、21:00までは起動したままにしたいなどの変更も容易なので、利便性を高めることができます。

定期使用量送信

AWSの使用金額は毎日の使用量により課金されていきます。

その金額はAWSの管理画面から見ることが可能ですが、毎日確認するのは面倒です。
とはいえ、確認しないと間違えて大型のEC2を作成してしまったときなどに多額の使用量を払うことになってしまいます。

また、使用金額の予算がある場合は、1日の使用量が適正かを確認する必要もあるので、やはり日時でチェックしたい要望もあると思います。
この使用容量確認もAWS Lambdaを使用すると、定常的に使用金額を検索し、メールに送信するということが可能になります。

例えば、メールの送信先をAWS管理者と上長を入れておけば、月額だけでなく毎日定常的に使用量を確認することができるようになります。

AWS Lambdaの書き方

それでは、AWS Lambdaの書き方をご紹介していきます。
今回は、設定した「EC2インスタンスを自動停止するLambda」になります。

少し変更を加えれば、自動起動に変更することもできるので、是非使ってみてガンガン使いやすく改修してみてください。

Lambda関数作成

まずは、自身のAWSアカウントにログインして、AWSマネジメントコンソールにログインしましょう。
トップ画面に「Lambda」の文字があるので、リンクを押してAWS Lambdaの関数作成画面に遷移しましょう。

AWS Lambdaの関数作成画面に遷移するので、右上の「関数の作成」を押下しましょう。

関数の作成が開始されますので、以下の設定値を入力して、「関数の作成」を押しましょう。

設定情報 設定値 設定の意味
作成オプション 一から作成 Lambdaには簡単に使用できるようによく利用される使用例を関数として用意していますが、今回は一からPythonコードを書くので、「一から作成」にします。
関数名 <お好きな名前で> 関数の名前です。作成後に変更はできないので、暫定ではなくここで決めてください。
ランタイム Python 3.7 書くプログラミング言語を指定します。今回はPython3.7を選択しましょう。

値を設定して、「関数の作成」を押下すると、以下の画面に用に「正常に作成しました。」のメッセージとともに、コードを書く画面に遷移します。これで関数の作成は完了です。実際にプログラミングを書いていきましょう。

Pythonコードの作成

作成完了後の画面をスクロールしていくと、下にこのような画面があると思います。
ここがPythonのプログラムを書く場所になります。はじめから、Test用に「Hello from Lambda!」を出力するプログラムが書かれていますが、自分のコードで上書いていきましょう。

では、今回使う「自動停止」のPythonコードは以下になります。
以下のコードをプログラムを書く場所に入力し、右上の「保存」を押すと、「自動停止」のプログラミングの出来上がりです。

 #使用ライブラリのインポート
 import json
 import boto3
 import os

 def lambda_handler(event, context):
         #処理開始
         print(“[INFO]Start Function”)

         #初期変数宣言
         ec2_client = boto3.client(“ec2”)
         InstanceIdList = os.environ[‘InstanceID’].split(“,”)
         print(“[INFO]TargetInstances:”+str(InstanceIdList));

         #指定されたインスタンス全てに停止処理
         for i in range(0,len(InstanceIdList)):
                 print(“[INFO]Stop processing starts. : “ + str(InstanceIdList[i]))
                 ec2_client.stop_instances(InstanceIds=[InstanceIdList[i]])
                 print(“[INFO]Stop processing is complete. : “ + str(InstanceIdList[i]))

         #処理終了
         print(“[INFO]All processing is complete.”);
         return 0

使い方は簡単で、Lambda関数を作成している今の画面を下にスクロールしていくと「環境変数」という項目があるので、そこに以下を入力してください。カンマ区切りで指定した全てのEC2インスタンスを停止してくれます。

環境変数 設定値 説明
InstanceID <停止対象①のインスタンスID>,<停止対象②のインスタンスID>・・・・ カンマ区切りで停止したい対象のインスタンスIDを入力します。

権限設定

ここまできたらもう一息です。
このままテストに行きたいのですが、今のままでは失敗してしまいます。というのもこの実行するLambdaにEC2インスタンスを停止する権限を付けてあげないと、権限がないため停止が拒否されてしまいます。

なので、Lambda関数の作成画面を更に下にスクロールしていき、「実行ロール」を見ましょう。ここで、このLambdaが実行できる操作を許可・不許可している「IAMロール」を指定しています。赤枠のリンクを押下して、ロールの編集画面に移動しましょう。

ロールの編集画面に移動したら、「インラインポリシーの追加」を押下します。

ここで、停止権限を付与してあげることで先ほどから作っているLambda関数がEC2インスタンスの停止処理が行えるようになります。以下の通りの設定値を入力し、「ポリシーの確認」を押下しましょう。

設定名 設定値
サービス EC2
アクション StopInstances
リソース 全てのリソース

作成するポリシーの名前を聞かれるの、お好きな名前を付けてあげましょう。今回は「EC2StopPolicy」としておきました。

テスト実行

さて、ここまでの作業がうまく行っているのかを確認するテストの実行を行いましょう。Lambda関数の環境変数に記入してあるインスタンスIDが起動していることを確認しておきましょう。起動していない場合でも失敗はしませんが、正常に停止処理ができたのかわからなくなってしまいます。

私もテスト用にEC2インスタンスを2つ用意しておきました。

テストを実行し、この2つのインスタンスが停止すれば成功です。
テスト実行は作成したLambda関数の画面上部にある「テスト」を押下します。

初めての実行の場合は、「テストイベントの作成」が求められます。
特に何も変える必要が無いので、このまま名前だけ付けて、保存しましょう。

これでテストが実行可能なので、テストを行います。
以下のようにグリーンの結果で「実行結果:成功」となれば無事に実行成功です。

対象にしていたEC2インスタンスを見てみましょう。
停止していれば、作成したLambdaは正常に作成できています。

AWS Lambdaの定期実行方法

ここまでで、指定したEC2インスタンスをLambda実行することで停止できるようになりました。しかし、まだこのままでは手動で「Lambda関数」の画面からテスト実行しなくてはいけません。指定した日時で自動実行できるようにするにはもう1つ設定が必要になります。

それが「AWS CloudWatch」サービスになります。
このサービスには、決まった時間にLambdaを実行してくれるトリガー機能を持っています。このサービスに先ほど作成したLambdaを毎時20:00に実行するように設定することで、毎日20:00に自動的にEC2インスタンスを停止してくれるようにできます。

それでは、CloudWatchの設定を行っていきましょう。

イベントルール作成

いつものAWSマネジメントコンソールの「サービス」の中から「CloudWatch」を探して押下してください。
すると、CloudWatchのダッシュボードに遷移しますので、右側のメニューの中で「ルール」を押下してください。

ルールの画面上部に「ルールの作成」があるので、押下してください。
これでLambdaを定期実行するルールの作成画面に遷移するので、次の項から実際に設定値を入力していきましょう。

 

設定値入力

以下の設定値を入力して、今回作成した「TestFunction」を定期実行できるようにしましょう。

設定名 設定値 説明
イベントソース スケジュール 時刻をトリガーに実行するので、「スケジュール」を選択します。
時刻記入方式 cron式 時刻は、cron式で記入します。
定期実行時刻 00 11 ? * * * 時刻は世界標準時で入力するので、-9時間した時間を記入します。(20時なら11を入力。)
関数 TestFuncion 実行するLambda関数です。名前を変えている場合は、それを選択して下さい。

最後にルール名を設定して、「ルールの作成」を押下すれば完了です。
これで、毎日20:00に対象のEC2インスタンスを自動で停止してくれます。

まとめ

便利なサービスAWS Lambdaについてご紹介してきましたが、いかがでしたでしょうか?

Pythonに触れたことがある人にとってもAWSサービスの知識部分が多いため、なかなか難しかった野ではないかと思います。
逆にAWS基盤の構築を行ったことがある人にとっては、プログラムをコピペするだけだったので理解しやすいかと思います。

ただ、今回はプログラムをコピーするだけで構いませんが、中身を理解し、改修ができるようになると大きな武器となると思いますので、Pythonの勉強も行っていくことをオススメします。

 

コメント

タイトルとURLをコピーしました