こんにちは、Mashです。
本記事は私自身がAWSサービスをお勉強で触ってみた経験を Mash式AWSチュートリアル と題して共有するシリーズです。
今回はAWS Lambda編の第1回となります。
キホンのキから説明しています。これからAWSサービスを検証しながら学習される方には
参考にしていただけるかと思いますので、ぜひ最後までお付き合いください。
What is AWS Lambda?
それじゃあ早速!
といきたいところですが、いちおうチュートリアルと銘打ってますのでLambdaの概要説明から。
Lambdaとは
まず読み方ですよね。これ、ラムダと読みます。
LambdaはAWSが提供している サーバレスコンピューティングサービス です。
通常、プログラムを動かすためにはサーバを用意して、動かしたい言語に対応した実行環境をインストールしておく必要があります。
しかしLambdaのようなサーバレスコンピューティングの技術を利用すれば、利用者はサーバを用意(構築)する必要がなく、またプログラムが完成したあともサーバのお守り(運用)をする必要がありません。
これは利用者からムダな労力を排除し、自社ビジネスの拡大に最も重要な プログラム開発 に注力できることを意味しています。
利用料金
Lambdaの料金詳細はこちらのAWS公式ページをご覧ください。
課金ポイントはざっくり2点です。
- プログラム実行時間
- プログラムが使用するメモリ量
例として、
- 実行時間 :10000ミリ秒(10秒)
- 使用メモリ:128MB
この条件では1000回実行してやっと$0.02になります。
これはLambda以外のサービスでも同じなのですが、サービスをデプロイしたリージョン外と通信を行う場合はその通信にも課金されます。
本ブログ内で紹介するようなプログラムでは課金の心配ありません。
ちなみに、Lambdaには1ヶ月単位の無料枠が存在します。
AWS Lambda の無料利用枠には、1 か月ごとに 100 万件の無料リクエスト、および 40 万 GB-秒のコンピューティング時間が、それぞれ含まれます。
AWS Lambda料金ページより
この無料枠のおかげで、私が検証目的でガシガシ触るくらいでは一切課金されておりません。
ありがたや~
Lambdaを動かしてみる
さて、能書きはこれくらいにしてLambdaを触っていきましょう。
お決まりのHello World!から、、、
といいたいところですがそれじゃあつまらんすぎるので、LambdaからEC2のインスタンスIDを取得するプログラムを作ってみます。
Lambda関数を作成する
AWSコンソールからLambdaページへアクセスします。Lambdaと検索すれば出てきます。
続いて画面右上に [関数の作成] ボタンがあるのでクリックします。

関数の作成 画面では、一から作成 を選択し、関数名とランタイム(使用言語)、実行ロールを設定します。
今回は以下のようにして進めます。
設定項目 | 設定値 |
関数名 | get-ec2-list |
ランタイム | Python 3.8 |
実行ロール | 基本的なLambdaアクセス権限で新しいロールを作成 |

Hello Worldする
以上で関数作成に最低限必要なステップが完了しています。超簡単。
さて、それではHello Worldしてみましょう(やるんかい)。
デフォルト状態ですでにコードが書かれていますね。ちょっとreturnの中身だけ書き換えましょうか。
import json def lambda_handler(event, context): # TODO implement return { 'statusCode': 200, 'body': "test" }
まずは正しくLambda関数が作成できているか、Hello Worldして確認してみます。
画面右上の [テスト] ボタンをクリックします。

まだテストイベントが一つもないので、 新しいテストイベントの作成 が選択されているかと思います。
イベントテンプレートはデフォルトのhello-worldで。
他のAWSサービスと連携する場合は、豊富なテンプレートから選択することで、手間を省けます。
イベント名はただの名称ですので任意の値でOKです。
で、画面下部に表示されているJSONはいったんそのままで大丈夫です。詳しくは次の記事で説明したいと思います。
ここまでできたら画面右下の [作成] ボタンをクリックしましょう。

それではもう一度 [テスト] ボタンをクリックしてください。
このようにグリーンで 成功 と表示されていればOKです。
実行結果(returnで返された値)や課金に関係する稼働時間と割当メモリ量、ログなどを確認することができます。

ちなみに、わざと文法ミスでエラーを起こした場合はこのような画面になります。

EC2のインスタンス情報を取得する
それではもう少しちゃんとしたプログラムを作成してみます。
関数コード セクションのコードをすべて削除して、下記コードをコピペしてください。
コード修正後は関数コードセクションの [Save] もしくは画面右上の [保存] をクリックします。
import json import boto3 def lambda_handler(event, context): id_list = [] ec2 = boto3.resource('ec2') instances = ec2.instances.all() for instance in instances: id_list.append(instance.id) return { 'statusCode': 200, 'body': id_list }
boto3 はAWSリソースを操作するためのPythonライブラリです。
ぜひ使いこなせるようになりましょう!(自己暗示。。。)
さてさて
コードが書けましたのでさきほど同様にテストしてみます。
すると、残念ながらエラーになってしまいました。(一部抜粋)
"errorMessage": "An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation.",
"errorType": "ClientError",
エラーメッセージから原因の推測ができますでしょうか。
すこーし記事を読み返して考えてみてください。
答えは Lambdaの権限不足 です。みなさん正解しましたか?
AWSでは、AWS各サービスに対して別のサービスへのアクセス権限を割り当てることが可能です。
これを IAMロール と呼びます。
今回Lambda関数作成中に ロール を作成するシーンがありましたが、あれではLambda関数を実行するための最低限の権限しかなく、EC2の情報にアクセスする権限が不足しているんですね。
IAM のお話はそれだけで記事が何本も書けてしまうので今回は詳細割愛します。
IAMロールにポリシーを追加する
ここから、今回のプログラムが動くための権限を付与する手順をご紹介します。
EC2の情報が取得できる権限があればOKでしたね。
まずはAWSコンソールで一度Lambdaの画面から離れ、 IAM へアクセスし、左側メニューの ロール にてさきほど作成したLambda関数名で検索します。
するとIAMロールがヒットしますので、こちらをクリックします。

[ポリシーをアタッチします] をクリックします。

検索欄に ec2readonly と入力すれば該当するポリシーがひとつになります。
AmazonEC2ReadOnlyAccess にチェックを入れて、画面下部 [ポリシーのアタッチ] をクリックします。

↓このように表示されれば権限付与は成功です。

この作業により、get-ec2-list-xxxx というロールに、EC2読み取り権限 が付与された状態になりました。
AWSに限ったことではありませんが、セキュリティの観点からアクセス権限は必要最小限に留めることが推奨されます。
今回はEC2の情報取得さえできればよいので EC2ReadOnlyAccess ポリシーを付与しました。EC2を作成したりはできなくてよいということですね。
検証中は余計なエラーでハマりたくないのでフル権限ですすめる というのも考え方の一つではありますが、本番ではNGです。
再度Lambdaを実行する
権限付与が完了しましたので、AWSコンソールからLambda編集画面へ戻り、改めてテストを実行します。

権限エラーが解消され、実行結果では3台のEC2インスタンスIDが取得できていることも確認できました!
次回予告
今回の記事では関数の作成から実行するところまでが確認できました。
ただ、実際に動かしたいプログラムはWebブラウザからポチポチ実行するはずがありませんよね。
次回は、AWSの他のサービスをトリガーにしてLambdaを実行する方法をご紹介したいと思います。
今回は以上です。
それじゃあまたね。