【AWSサービス 基礎編】 AWS Lambda で関数を作成しイベント駆動で実行する

目次

概要

AWS Lambda は、サーバーのプロビジョニングや管理なしにコードを実行できるサーバーレスコンピューティングサービスです。コードをアップロードするだけで、Lambda がコードの実行に必要なすべてのインフラストラクチャを管理します。

従来のサーバーベースのアーキテクチャでは、リクエストの有無にかかわらずサーバーを稼働させ続ける必要がありました。Lambda を使うことで、リクエストが発生したときだけコードが実行され、使用した分だけ課金されるため、コスト効率が大幅に向上します。

本記事では、Lambda 関数の基本的な作成方法と、イベント駆動での実行を体験します。

この記事のメリット

  • AWS Lambda の基本概念(関数、トリガー、実行ロール)を理解できる
  • マネジメントコンソールから Lambda 関数を作成・実行する手順を習得できる
  • テストイベントを使った関数の動作確認方法を体験できる
  • CloudWatch Logs で実行ログを確認する方法を理解できる
  • イベント駆動アーキテクチャの基本的な考え方を把握できる

キャラクター紹介

クラウド資格実践ラボの基礎学習記事では、ルクシーちゃんと代表の土肥が対話形式で AWS 認定試験で必要な知識をハンズオンとともに解説していくブログです。これからこのブログを案内する2人を紹介します。

ルクシーちゃん

クラウド資格に挑戦中の好奇心旺盛なナビゲーター。初学者目線で「これってなんだろう?」と素朴な疑問を投げかけ、知識を引き出していく役どころ。難しい内容も、ルクシーちゃんと一緒なら一歩ずつ理解できると思います!

土肥(とひ)

株式会社Luxyの代表であり同社の元エンジニア。これまでオンプレとAWS環境のインフラを担当。AWS認定資格の学習で得た知識をハンズオンとともに解説するのが得意。直近では新人の教育なども行っており、これから技術を学ぼうという方が納得できるように解説できることに喜びを感じているとのこと。

技術解説

AWS Lambda とは

Luxyちゃん

とひさん、AWS Lambda ってよく聞くんですけど、どういうサービスなんですか?

土肥

Lambda は「イベント駆動型のサーバーレスコンピューティングサービス」だよ。ざっくり言うと、サーバーを自分で用意しなくても、コードをアップロードするだけで実行できる仕組みなんだ。

Luxyちゃん

サーバーレスということは、裏側のサーバーは AWS が全部管理してくれるんですか?

土肥

そのとおり。OS のパッチ当てやスケーリングも AWS が面倒を見てくれるから、開発者はコードを書くことに集中できるんだ。対応するランタイムも Python、Node.js、Java、Go、.NET など幅広いよ。

Luxyちゃん

へぇ、いろんな言語が使えるんですね!でも「イベント駆動」ってどういう意味ですか?

土肥

何かのイベント、つまり「きっかけ」が起きたときに自動的にコードが実行される仕組みのことだよ。Lambda 関数は以下のようなイベントソースからトリガーされるんだ。

  • Amazon S3 のオブジェクト作成・削除
  • Amazon API Gateway への HTTP リクエスト
  • Amazon EventBridge のスケジュールルール
  • Amazon DynamoDB Streams のレコード変更
  • Amazon SNS の通知
Luxyちゃん

S3 にファイルをアップロードしたら自動で処理が走る、みたいなことができるんですね!

土肥

そうそう、まさにそういう使い方が得意なサービスなんだ。

Lambda 関数の構成要素

Luxyちゃん

Lambda 関数を作るときに、どんな要素を設定する必要があるんですか?

土肥

Lambda 関数は主に以下の要素で構成されているよ。表にまとめるとこんな感じだね。

要素説明
関数コード実行されるプログラムコード
ランタイムコードの実行環境(Python 3.13、Node.js 22.x など)
ハンドラーLambda が呼び出すエントリーポイント(例: lambda_function.lambda_handler
実行ロールLambda 関数が AWS リソースにアクセスするための IAM ロール
トリガー関数を起動するイベントソース
メモリ・タイムアウト割り当てるメモリ量(128 MB〜10,240 MB)と最大実行時間(最大15分)
Luxyちゃん

けっこう項目が多いですね。メモリとタイムアウトも設定するんですか?

土肥

うん。メモリは 128 MB から最大 10,240 MB まで設定できて、タイムアウトは最大 15 分だよ。メモリを増やすと CPU パワーも比例して上がるから、処理が重い関数はメモリを多めに割り当てるといいんだ。

Luxyちゃん

なるほど、メモリの設定がパフォーマンスにも影響するんですね!

ハンドラーの仕組み

Luxyちゃん

さっきの表にあった「ハンドラー」って、もう少し詳しく教えてもらえますか?

土肥

ハンドラーは Lambda 関数の「入口」にあたる部分だよ。イベントが発生すると、Lambda サービスがこのハンドラーを呼び出して処理が始まるんだ。Python の場合は、こんなシグネチャになるよ。

def lambda_handler(event, context):
    # event: トリガー元から渡されるイベントデータ
    # context: 実行環境に関するメタデータ
    return {
        'statusCode': 200,
        'body': 'Hello from Lambda!'
    }
Luxyちゃん

eventcontext という2つの引数を受け取るんですね。それぞれ何が入っているんですか?

土肥

event にはトリガー元のサービスから渡されるデータが入っているよ。例えば S3 トリガーならバケット名やオブジェクトキーが入ってくるんだ。context には関数名やメモリ制限、残りの実行時間といった実行環境のメタデータが含まれるよ。

Luxyちゃん

event の中身はトリガー元によって変わるんですね。context で残り時間もわかるのは便利そうです!

土肥

そうなんだ。タイムアウトが近いときに処理を打ち切るような制御にも使えるから、覚えておくといいよ。

実行ロール

Luxyちゃん

Lambda 関数が他の AWS サービスにアクセスするときは、どうやって権限を管理するんですか?

土肥

Lambda 関数には「実行ロール」という IAM ロールを紐づけるんだ。関数はこのロールの権限を使って S3 や DynamoDB などの AWS リソースにアクセスするよ。

Luxyちゃん

実行ロールは自分で作らないといけないんですか?

土肥

関数の作成時に既存のロールを指定することもできるし、基本的な権限を持つロールを自動作成することもできるよ。自動作成の場合は AWSLambdaBasicExecutionRole というポリシーがアタッチされて、CloudWatch Logs へのログ出力権限が含まれるんだ。

Luxyちゃん

ログ出力の権限がないと、せっかくの print 文も記録されないってことですか?

土肥

そのとおり。だから最低限 AWSLambdaBasicExecutionRole は必要なんだ。もし S3 や DynamoDB にアクセスしたい場合は、追加でポリシーをアタッチする必要があるよ。

Luxyちゃん

最小限の権限から始めて、必要に応じて追加していくのが安全ですね!

実践

前提条件

  • リージョン: ap-northeast-1(東京)
  • IAM ユーザーに Lambda および CloudWatch Logs の操作権限があること
リソース種別リソース名用途
Lambda 関数hello-lambda-basic基本動作確認用の関数
IAM ロール(自動作成)Lambda 実行ロール

Lambda 関数を作成する

  • AWS マネジメントコンソールにログインし、リージョンが ap-northeast-1(東京)であることを確認します
  • 上部の検索バーに Lambda と入力し、表示された「Lambda」を選択します
  • 左側ナビゲーションの「関数」を選択し、「関数の作成」をクリックします
  • 「一から作成」が選択されていることを確認します
  • 以下の項目を入力します
  • 関数名: hello-lambda-basic
  • ランタイム: Python 3.x(最新のものでOKです)
  • その他の項目はデフォルトのままにします
  • 「関数の作成」をクリックします
Lambda関数の作成画面(関数名、ランタイム、実行ロールの設定)
  • 関数が作成され、コードエディタが表示されることを確認します
Lambda関数の作成完了画面(コードエディタが表示されている状態)

関数コードを編集する

  • 「コード」タブのコードエディタに、デフォルトのコードが表示されています
  • コードを以下の内容に書き換えます
import json
import datetime

def lambda_handler(event, context):
    current_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    name = event.get('name', 'World')

    message = f'Hello, {name}! Current time is {current_time}'
    print(f'Received event: {json.dumps(event)}')
    print(f'Generated message: {message}')

    return {
        'statusCode': 200,
        'body': json.dumps({
            'message': message,
            'input_event': event
        }, ensure_ascii=False)
    }
  • 「Deploy」をクリックしてコードをデプロイします
  • 「関数 hello-lambda-basic が正常に更新されました。」と表示されることを確認します
コードエディタでコードを編集しデプロイした後の画面

テストイベントで関数を実行する

  • 「テスト」タブを選択します
  • 「新しいイベントを作成」が選択されていることを確認します
  • 以下の項目を入力します
  • イベント名: testEvent
  • イベント JSON:
{
  "name": "Lambda Beginner"
}
  • 「テスト」をクリックします
テストイベントの設定画面(イベント名とJSONの入力)
  • 実行結果が「成功」と表示されることを確認します
  • 「詳細」を展開すると、レスポンスボディに Hello, Lambda Beginner! を含むメッセージが表示されます
テスト実行結果画面(成功ステータスとレスポンスボディ)

CloudWatch Logs で実行ログを確認する

  • 「モニタリング」タブを選択します
  • 「CloudWatch ログを表示」をクリックします
  • CloudWatch のコンソールが開き、ロググループ /aws/lambda/hello-lambda-basic が表示されます
  • 最新のログストリームを選択します
  • Received eventGenerated message といったログ出力が記録されていることを確認します
CloudWatch Logsでのログ出力確認画面(print文の出力が表示されている状態)

関数の設定を確認する

  • Lambda コンソールに戻り、「設定」タブを選択します
  • 「一般設定」で以下の値を確認します
  • メモリ: 128 MB
  • タイムアウト: 3
  • 「アクセス権限」を選択すると、自動作成された実行ロールとアタッチされたポリシーを確認できます
Lambda関数のアクセス権限設定画面(ロールの確認)

まとめ

  • AWS Lambda はサーバーレスでコードを実行できるサービスであり、サーバーの管理が不要
  • Lambda 関数はハンドラーをエントリーポイントとして、eventcontext の2つのパラメータを受け取る
  • 関数の作成時に実行ロールが自動作成され、CloudWatch Logs への書き込み権限が含まれる
  • テストイベントを使って任意のイベントデータで関数を実行し、動作確認ができる
  • print() 関数で出力した内容は CloudWatch Logs に自動的に記録される
  • メモリやタイムアウトなどのリソース設定は「一般設定」で確認・変更できる

参照先

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

株式会社Luxy(https://luxy-inc.com)の代表取締役.

2018年〜インフラエンジニアとしてキャリアをスタートし、オンプレミスのネットワーク・サーバ環境で3年半、クラウド環境で4年半の8年間エンジニアとして従事。
2021年に佐藤氏の創業した会社を引き継ぎ、代表に就任。

目次