
こんにちは、かなざわ(@ketancho)です。
突然ですが、初めて触れる AWS サービスを使い始めるときに、その最初の一歩が結構大変なんだよなー、と思ったことはないでしょうか?
最初の一歩さえ踏み出してしまえば、そのサービスの基本の動きやコンセプトが理解でき、そこを起点に周辺の機能や、他サービスとの連携が理解しやすく&試しやすくなると私は考えています。
共感いただける方がどれくらいいらっしゃるか分からないのですが、私と同じような想いをお持ちな方向けに、そのはじめの一歩を気軽に踏み出せるコンテンツを作っていきたい、そんなモチベーションで「AWS サービス はじめの一歩」シリーズを不定期連載していこうと思います。
▼ この記事のアジェンダ
- 「AWS サービス はじめの一歩」シリーズとは
- 5分で学ぶ AWS Lambda はじめの一歩
- 20分くらいで試す AWS Lambda はじめの一歩ハンズオン
- AWS Lambda はじめの一歩のまとめと Next Step のオススメ
「AWS サービス はじめの一歩」シリーズとは
5分くらいで読める*1 座学パートと、15〜20分ほどで実施できる*2 ハンズオン、合わせて 30分以内でその AWS サービスの基本のキを学び、はじめの一歩を踏み出せる、そんなコンテンツを目指して「AWS サービス はじめの一歩」シリーズを書いていきます。
あまりにも長いと「うっ」と私は思ってしまうので、その AWS サービスのコアだと(個人的に)考えている部分を抽出し、クイックにキャッチアップできるような内容を目指したいと思っています。
網羅性ではなく、まずは抑えたい部分に絞った、まさに「はじめの一歩」な方にお渡しできる記事にできればと考えています。
それではやっていきましょう!
5分で学ぶ AWS Lambda はじめの一歩

AWS Lambda の特徴を1枚のスライドで表すならこんなところでしょうか。1つ1つ見ていきたいと思います。
AWS Lambda は、サーバーを用意(管理)せずともプログラムを実行できる "サーバーレス" なコンピュートサービス
クラウド上で何かしらのプログラムを実行したいと思ったときに、どんな作業が必要でしょうか?
例えば、Python を動かしたいと思ったとします。サーバーを用意して、その上でプログラムを動かそうとしたときに、
- サーバー(例:Amazon EC2 インスタンス)を起動
- そのサーバーに接続
- Python 実行環境をインストール
- プログラムを配置(デプロイ)
という作業を経て、プログラムを実行することです。
一方、AWS Lambda の場合は、Lambda 関数と呼ばれるリソースを用意し、そこに Python プログラムをデプロイするだけで OK です。サーバーの構築・運用が不要なので、開発者の方はコードを書くことにより時間を割くことができます。
この "サーバーの用意や管理が不要" な特徴から、AWS Lambda は サーバーレス なサービスとも呼ばれます。
サーバーレスなのでサーバーの構築や運用を AWS 側におまかせできる点がメリットであり、その一方で AWS Lambda の実行環境に接続ができなかったりと、Amazon EC2 と比べると自由度は低いです。
先ほど、Lambda 関数にデプロイするコードの例として Python を挙げましたが、AWS Lambda はネイティブで、
- Java
- Go
- PowerShell
- Node.js
- C#
- Python
- Ruby
をサポートしています(執筆時現在)(参考情報)。
AWS Lambda はリクエスト数に応じて自動的にスケールする

前述の通り、AWS Lambda は Lambda 関数 という単位でリソースを管理し、それぞれにコードをデプロイできます。
Lambda 関数が呼び出されると、その Lambda 関数を実行するための環境が自動的に作られ、その上でコードが実行されます。(ある一定期間まではその環境は使い回され、そのうちなくなります。)
もし、複数のリクエストが同時に来たときは、そのリクエストが全て実行できるように実行環境が作られ、Lambda 関数が同時実行されます。
サーバーありな構成でもある一定量のリクエストまでは同時に捌くことができますが、その負荷が大きくなった場合に備えて、ロードバランサーを前段におき、コンピュートリソースを複数台にする。その台数も自動で増減させる設定をするなど、スケールのための設計・設定が必要です。
AWS Lambda を利用する場合、このスケールの部分についてもある程度は(後述します)サービス側に任せることができます。この点も、サーバーレスなサービスを選択するメリットで、開発者の方がよりコードの開発に注力することを後押しします。
AWS Lambda は他の AWS サービスと連携が豊富

AWS Lambda は他の AWS サービスとの連携も豊富です。
例えば、Amazon S3 バケットにファイルが置かれたことをトリガーに Lambda 関数を起動する、といったような他の AWS サービス起点で Lambda 関数を実行できます。何かが発生したらコードを実行する、といったイベント駆動なアーキテクチャに AWS Lambda を組み込むことができるというわけですね。
また、Lambda 関数上のコードから、AWS SDK を利用することで、他の AWS サービスを呼び出すことができます。例えば、Amazon DynamoDB テーブルにデータを PUT する、Amazon Bedrock のモデルを利用する、などでしょうか。
▼ AWS SDK for Python (Boto3) を使った例
import boto3 client = boto3.client('dynamodb')
Lambda 関数から他の AWS サービス/リソースと連携するには、Lambda 関数に紐づく IAM ロールを更新し、そのサービスを呼び出す権限を付与する必要がある点は抑えておきましょう。
AWS Lambda はリクエストベースで料金が決まる

AWS Lambda はリクエストベースの課金体系となっており、
- どれくらいリクエスト数があったか
- 何秒実行されたか
の2つがベースとなります。1秒あたりの単価は、設定したメモリの量で変わってきます。
詳細は、AWS Lambda の料金ページ でご確認いただければと思いますが、ざっくりと理解するのであれば、あまり呼び出されなければ料金が抑えられる、たくさん呼び出されればそれなりに、となります。
作ったプロダクトや Web サービスの人気度合いに(ある程度)比例する、一蓮托生な(?)価格体系な点が個人的にはとても好みです。
抑えておきたい AWS Lambda の制限
そんな特徴を持つ AWS Lambda ですが、制限についても抑えておき、それを理解した上で適材適所に使っていく必要があります。
最大実行時間は15分まで
Lambda 関数ごとに、「これ以上時間がかかったら実行を終えてね」というタイムアウト値を設定することができるのですが、こちらの最大値は15分となります。そのため、15分を超える処理を1つの Lambda 関数にまとめることはできません。
例えば、大量のデータを処理する必要がある場合は、前処理としてデータを分け、並列に複数の Lambda 関数に処理をしてもらい、この15分制限に引っかからないように工夫する必要があります。もちろん、AWS Lambda 以外のコンピュートリソースを使うのも選択肢のひとつです。
同時実行数にも上限がある
「自動的にスケールする」という話を書きましたが、こちらにも上限があります。具体的には、お使いの AWS アカウント内のリージョンごとの同時実行数に制限があり、この値のデフォルトは 1,000 となります。(参考情報)
こちらは上限緩和の申請ができるので、Lambda 関数の呼び出され方をチェックし、必要に応じて申請を出しましょう。
以上で、AWS Lambda はじめの一歩の座学パートは終了です。5分で読み切れましたでしょうか?理解を定着させるために、ぜひこの後のハンズオンパートで手を動かしていただければと思います。
20分くらいで試す AWS Lambda はじめの一歩ハンズオン
それではクイックに AWS Lambda を試していきましょう。
- AWS アカウントは作成済み
- 十分な権限が与えられている IAM ユーザーでログイン済み
- 基本的には東京リージョン(ap-northeast-1)で作業
を前提として、作業を進めていきたいと思います。(なお、AWS アカウントの作り方や、IAM ユーザーの作成方法については、こちらの Udemy 講座 の Day1-1, Day1-2 で紹介しています。こちら無料でご覧いただけるプレビュー動画に設定していますのでので、よければご活用ください。)
下記の3つのハンズオンを用意していますので、順に試してみていただければと思います。
- AWS Lambda で Hello, World
- AWS Lambda から他のサービスを呼び出す
- AWS Lambda の関数 URL 機能を使って、ブラウザから Lambda 関数を実行する
AWS Lambda で Hello, World
AWS Lambda のサービス画面 に遷移してください。既に Lambda 関数があるかないかで画面が異なりますが、画面中央 or 右上にある「関数を作成」をクリックしてください。
- 関数名:
aws-lambda-1st-step-function - ランタイム:
Python 3.13
とし、「関数を作成」をクリックしましょう。

その後、「Getting started」というポップアップが出る方がいるかも知れませんが、そのまま閉じていただいて大丈夫です。
少し画面をスクロールしていただくと、コードが表示されていると思います。こちらが Lambda 関数上で実行するコードになります。今回はランタイムとして Python を選択しているので、Python で書かれたコードがデフォルトで入力されているはずです。このコードソースを修正することで、Lambda 関数上で動くプログラムを更新することができます。

それではコードを修正していきましょう。今回は下記のコードに置き換えていただければと思います。
import json def lambda_handler(event, context): msg = event['msg'] return { 'statusCode': 200, 'body': json.dumps('Hello from ' + msg + '!') }
Lambda 関数が呼び出されると、lambda_handler 関数が呼び出されます(こちらはデフォルト設定で変更可能です)*3。lambda_handler 関数は引数で event が渡されるのですが、こちらは Lambda 関数の呼び出し元から与えられる引数になります。今回は、この event 引数から msg という引数を受け取り表示する、という簡単なプログラムにしています。
修正が終わりましたら、忘れずに「Deploy」ボタンをクリックし、デプロイしましょう。左側に、まだデプロイしてない変更があるよ!と出ているときは要注意です。

続いて、テスト実行していきましょう。Lambda 関数の画面からテスト実行する際には、テストイベントを渡す必要があります。このテストイベントを作る手順は幾つかあるのですが、今回はコードソース画面の左下にある Create new test event をクリックして作成を進めていきます。

右側に Create new test event という小さい枠が出てくると思いますので、こちらでテストイベントを作成していきます。Event Name は Test とし、Event JSON には、
{ "msg": "AWS Lambda 1st step" }
としてください。入力が終わりましたら、右上の「Save」ボタンを忘れずに押しましょう。

ここまでで準備が整いましたので、左側にある「Test」ボタンをクリックします。
下部に Status: succedded と表示され、Response に先ほどテストイベントで渡した JSON の情報を含む文言が表示されていれば成功です🎉

左下に表示されているテストイベント Test をクリックし、テストイベントの JSON を修正して実行することで、Response も変わることを確認してもいいかもしれません。
AWS Lambda から他のサービスを呼び出す
無事に Lambda 関数の Hello, World ができましたので、少しだけ発展させたハンズオンをやっていきます。AWS SDK for Python (Boto3) を用いて、他の AWS サービスを呼び出してみます。
今回は Amazon Comprehend という AWS が提供する自然言語処理サービスを Lambda 関数から呼び出してみようと思います。Amazon Comprehend はマネジメントコンソールから使うことができ、Real-time analysis 画面 に遷移していただき、Input テキストに文言を入力、「Analyze」ボタンをクリックしていただくと、

様々な Insights を得ることができます。例えば、Sentiment タブでは、入力したテキストの感情分析、ポジティブかネガティブかといったことを分析してくれます。API の結果として受け取る場合はこういう返り値になるよ、ということも右下に示されていますが、Lambda 関数から Comprehend を呼び出したときには、このようなレスポンスを受け取る形になります。

それでは Lambda 関数を修正していきましょう。先ほど作成した Lambda 関数 aws-lambda-1st-step-function を更新していきます。ソースコードを修正する前に、Lambda 関数から Comprehend を呼び出す許可を与える必要があります。そのために Lambda 関数に紐づいている IAM ロールをアップデートしていきます。
Lambda 関数の画面中央の「設定」タブを選択後、左のメニューから「アクセス権限」をクリックします。すると、その Lambda 関数にアタッチされている IAM ロールが表示されるので、リンクをクリックしてください。

別窓で IAM ロールの画面が開きます。現在は、Lambda 関数を実行するための最低限の権限のみが割り当てられています。今回は、AWS がデフォルトで用意している IAM ポリシーを追加していくので、右側の「許可を追加」から「ポリシーをアタッチ」としてください。

既存の IAM ポリシーを選択する画面に遷移するので、検索窓に Comprehend と入力後、リストに表示される ComprehendReadOnly に✓を入れ、「許可を追加」をクリックしてください。

これで Lambda 関数の権限アップデートは完了です。続いて、Lambda 関数のコードを修正し、Comprehend の機能を呼び出していきましょう。
前述の通り、Lambda 関数から AWS SDK を利用していくのですが、少しだけドキュメントの読み方についてもご説明します。今回は Python を使いますので、AWS SDK for Python、Boto3 のドキュメント を使って説明します。(なお、画面は都度更新されうるので、見た目に差分があるかもしれません。)
ここからは私の普段づかいの方法になるので、必ずしもこのように使わないとならない、というわけではありませんので、皆さまも使いやすい方法をあみ出していただければと思います。普段私は、Lambda 関数から使いたいサービスがある場合、左側の検索窓にそのサービス名を打ち込むところから始めます。今回は Comprehend と入力し、Enter を押します。

検索ワードに該当するページ一覧が出てくるので、そのサービスのトップページらしきものを探して(多くのケースで一番上にでてくる印象です)、選択します。

そのサービスのページの上部には、そのサービスのクライアントの宣言の仕方が書いてあります。そして、そのクライアントのメソッドとして、そのサービスの各種機能が提供されているので、使いたい機能を探していく形になります。

今回は detect_sentiment メソッドを使いたいので、該当ページに遷移します。
各メソッドページには、
- Request Syntax
- Response Syntax
- 発生しうる例外
- メソッドによっては Example
の順で表記されています。
私は、Example がある場合(例:DynamoDB の get_item)は、まずそれを見て使うイメージを掴むことが多いです。
ですが、今回使う detect_sentiment にはそれがないので、Request Syntax パートと、Response Syntax パートを眺めて、そのメソッドの使い方を把握します。とりあえず試してみる場合は、Request Syntax の [REQUIRED] がついている必須項目だけ埋めて、試し打ちしてしまうことも多いです。
それでは Lambda 関数の画面に戻って、コードをアップデートしていきましょう!今回はソースコードを下記のように修正します。
import json import boto3 comprehend_client = boto3.client('comprehend') def lambda_handler(event, context): msg = event['msg'] response = comprehend_client.detect_sentiment(Text=msg, LanguageCode='ja') sentiment = response['Sentiment'] return { 'statusCode': 200, 'body': json.dumps(msg + ' => ' + sentiment, ensure_ascii=False) }
event 引数から msg を受け取り、それを detect_sentiment メソッドに渡しています。その後、レスポンスのうち Sentiment 部分だけを取得し、表示ししています。(実際の案件では例外処理をすべきですが、今回は省略しています。)
コードをアップデートしましたら、デプロイするのを忘れないように気をつけましょう。

Lambda 関数を実行する前に、テストイベントを更新します。左下の Test の右側にある鉛筆マークをクリックし、右側の JSON を
{ "msg": "AWS Lambda の第一歩を踏み出しました!楽しいです!" }
に修正、そして右上の「Save」ボタンをクリックしてください。

その後、「Invoke」ボタンをクリックすると、下部に実行結果が表示されます。おそらく POSITIVE なメッセージだという評価が Response として返ってきているのではないでしょうか?🎉

以上が、AWS Lambda から他のサービスを呼び出す ハンズオンでした!
AWS Lambda の関数 URL 機能を使って、ブラウザから Lambda 関数を実行する
最後に、AWS Lambda の関数 URL 機能を使ったハンズオンをやっていきましょう。
座学パートでも触れましたが、様々な AWS サービス・機能をトリガーに Lambda 関数を起動することができます。Lambda 関数を呼び出すことができるサービスは、こちらの公式ドキュメント でも一覧としてまとめられています。
よくある AWS Lambda のユースケースとして、Web API のバックエンドがあります。その際は、Amazon API Gateway と連携することで、「このリソースに対して、このメソッドで呼び出されたら、この Lambda 関数を呼び出す」という設定をすることができます。
この Amazon API Gateway と AWS Lambda を連携するハンズオンは、Udemy で提供中の動画講座 の中でも紹介しているのですが、それをここでやるには紙面(?)が足りません。
そこで、ここでは AWS Lamdba の関数 URL 機能を使って、専用の HTTPS エンドポイントを提供し、外部から HTTPS リクエストで Lambda 関数を呼び出すハンズオンをしていこうと思います。
今回は、URL の末尾に ?msg=ほげほげ と呼び出すことで、そのテキストがポジティブかどうかをレスポンスするように仕上げていきます。
まず、Lambda 関数の画面の、「設定」タブに移ってください。左側のメニューから「関数 URL」をクリックし、「関数 URL を作成」としましょう。

関数 URL は認証の設定もできますが、今回は認証なしで関数 URL を叩ける設定にしていきます。(特定の人のみに必要な情報を返したいシーンでは、必ず認証をつけるようにしてください。)
認証タイプを「None」とし、右下の「保存」をクリックします。

すると、関数 URL が払い出されます。早速この URL を叩いてみていただければと思いますが、Internal Server Error となるはずです。

Lambda 関数のどの部分でエラーが出ているか確認したいところです。これまで、AWS Lambda の画面で関数のテスト実行をしてきましたので、すぐにログが確認できましたが今回はそうはいきません。そこで、このタイミングで、Lambda 関数のログの確認方法についてもハンズオンしたいと思います。
まず、Lambda 関数の画面で「モニタリング」タブに遷移します。その右上にある「CloudWatch ログを表示」をクリックしてください。

すると、別タブで Amazon CloudWatch の画面が開くと思います。ログストリームが幾つか表示されていると思うので、その中で一番上のログストリームのリンクをクリックしてください。

すると、エラーログが確認できるはずです。現状は event 引数に msg という要素がある前提で Lambda 関数を実装しているのですが、関数 URL を叩いて Lambda 関数を呼び出した場合、その要素は渡されないのでエラーとなっています。

もし、このタイミングで URL の末尾に ?msg=ほげほげ をつけて実行したとしてもエラーになるでしょう。このように URL の末尾にパラメータをつけた場合、 queryStringParameters という形でイベント引数に値が渡されるため、現在の event 引数の取り扱い方だと、URL 末尾の文字列を取ることができないからです。
では、そのようにイベント引数が渡される前提で Lambda 関数を修正しましょう。前述の queryStringParameters から値を取得するようにしています。ソースコードを変更後は、デプロイを忘れずにお願いします。
import json import boto3 comprehend_client = boto3.client('comprehend') def lambda_handler(event, context): msg = event['queryStringParameters']['msg'] response = comprehend_client.detect_sentiment(Text=msg, LanguageCode='ja') sentiment = response['Sentiment'] return { 'statusCode': 200, 'body': json.dumps(msg + ' => ' + sentiment, ensure_ascii=False) }
その後、関数 URL の末尾に ?msg=Lambdaを使ってます! をつけて再度 URL を叩いてみてください。下記のように "NEUTORAL" と判定されたのではないでしょうか?🎉

末尾を ?msg=Lambda楽しいです! にするとどうでしょうか?POSITIVE と判定されるんじゃないかと思います🎉

このように、クエリパラメータとして渡された情報を Amazon Comprehend に渡し、その結果を Response として返すよう Lambda 関数を実装できたととが分かると思います。
以上で AWS Lambda の3つのハンズオンを終えたいと思います。最後まで完走いただき、ありがとうございます!
AWS Lambda はじめの一歩のまとめと Next Step のオススメ
このように AWS Lambda は、様々な AWS サービス・機能から呼び出され、他の AWS サービス・機能と連携しながら、コードを記述、そして実行することができます。サーバーレスなコンピュートリソースなので、実行環境の用意や、大量に呼び出されたときの拡張性を(ある程度)AWS Lambda 側に任せることができる点がメリットです。
個人的には何かを作るときにはまず AWS Lambda でロジック部分を動かせないかな?と考えた上で、制約にひっかかる要件がありそうだったら、別のコンピュートリソースを検討する、という流れで構成を考えています。それを考えるためにも、ぜひ AWS Lambda を色々な形でお使いいただくことで、良い点も制約も理解を深めていただくといいと思います。
もし、AWS Lambda が面白い!と思っていただいた方は、下記のオンデマンド講座にて AWS Lambda を中心とした様々なハンズオンを提供しています。今回、取り上げきれなかった Amazon API Gateway、NoSQL DB サービスである Amazon DynamoDB、認証・認可のための Amazon Cognito をはじめとした、各種 AWS サービスを組み合わせたハンズオンを提供していますので、よろしければ紹介記事を覗いていっていただけたら嬉しいです。
以上、AWS Lambda はじめの一歩でした!少しでも多くの方の歩みに貢献できたら嬉しいです。それでは、また別の記事でお会いしましょう!
かなざわ(@ketancho)
