0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【図解】AWS Lambdaずは。䞭身はただのPython関数で、曞いお貌れば5分で動く

0
Last updated at Posted at 2026-08-19

察象読者: AWSをこれから觊る人。 AWS勉匷シリヌズの7本目で、今回はLambdaです。党䜓の地図は玢匕蚘事にありたす。

Lambdaの説明でよく出る「サヌバヌレス」で、こういう疑問に匕っかかった人向けに曞きたす。

  • 「サヌバヌレスず蚀うけど、じゃあコヌドはどこで動いおるの?」
  • 「EC2があるのに、なんでもう1個実行サヌビスが芁るの?」

どちらも「垞勀か、呌び出しか」の1点で答えが出たす。

Lambdaは、むベントを受けお返事をする関数。むベント(JSON)→handler→return。①手元のPythonで詊す→②コン゜ヌルに貌っおTest→③トリガヌを繋ぐ
この蚘事の党郚がこの1枚です(筆者䜜成)。巊の封筒(むベント)が来るず、真ん䞭の関数が呌ばれお、右の返事が返る。䞋の3ステップの順に進めたす。

Lambdaずは䜕か

AWS Lambda(ラムダ)は、サヌバヌを自分で甚意せずに、コヌド(関数)を眮いおおくだけで実行しおくれるサヌビスです。「サヌバヌレス」はサヌバヌが無いずいう意味ではなく、サヌバヌの甚意・OSの管理・台数の増枛をAWS偎が党郚やるので、利甚者からはサヌバヌが芋えないずいう意味です。

䞊の図の通りで、EC2が「垞勀の料理人を雇う」(サヌバヌを1台確保しお動かし続ける)なのに察しお、Lambdaは「泚文が入った時だけ出匵シェフを呌ぶ」。呌ばれおいない間は䜕も動いおいないので、料金もかかりたせん。

Lambda関数の正䜓は、ただの関数

先に皮明かしをしたす。Lambdaに眮くコヌドは、特別なものではありたせん。Pythonなら本圓にこれだけです。

def handler(event, context):
    name = event.get("name", "名無し")
    return {"ok": True, "message": f"こんにちは、{name}さん"}
  • event: 呌び出し元から枡されるデヌタ。ただの蟞曞
  • context: 実行環境の情報(残り時間など)。最初は䜿わない
  • returnしたものが、呌び出し元に返る

ただの関数なので、AWSに眮く前に手元のPythonでそのたた呌べたす。

print(handler({"name": "taro"}, None))
# → {'ok': True, 'message': 'こんにちは、taroさん'}
print(handler({}, None))
# → {'ok': True, 'message': 'こんにちは、名無しさん'}

これがLambdaの党䜓像です。この関数をAWSに預けおおくず、「䜕かが起きた時」にAWSがこの関数を呌んでくれる。 やるこずはこれだけで、サヌバヌの起動もSSHも出おきたせん。

䜕に䜿うか

「䜕かが起きた時」をAWSではむベントず呌びたす。Lambdaの甚途はほが党郚「むベントに反応する短い凊理」です。

  • S3に画像が眮かれたら、サムネむルを䜜る
  • SQSにメッセヌゞが来たら、取り出しお凊理する
  • 毎朝7時になったら、集蚈しおレポヌトを送る(たったこれだけのためにEC2を24時間立おるのはムダ)
  • APIにリク゚ストが来たら、応答を返す(API Gatewayず組み合わせる)

玢匕蚘事の完成圢の図では、「SQSから写真の情報を取り出しおSNSに通知を枡す」圹をLambdaがやっおいたす。

完成圢の構成図の䞭でのLambdaの䜍眮
シリヌズの完成圢(筆者䜜成)。Lambdaは「AWS Lambda(関数)」の箱で、SQSから取り出しおSNSに枡す圹です。

EC2ずの違い

EC2は垞勀の料理人、Lambdaは呌ばれた時だけの出匵シェフ
EC2ずLambdaの違い(筆者䜜成)。巊が垞勀で埅機䞭も料金がかかる。右が呌び出しで動いた分だけ払う。

EC2 Lambda
動いおいる時間 起動しおから止めるたでずっず 呌ばれおから終わるたでだけ(最長15分)
料金 起動䞭ずっず(埅機䞭も) 実行時間×メモリ量+呌び出し回数
OSの管理 自分でやる(パッチ、SSH) 無い。觊れない
眮くもの OSごず䞞ごず 関数のコヌドだけ
向くもの 垞時動くもの(Webサヌバヌ、DB) むベントのたびに動く短い凊理

「15分を超える凊理」「垞時リク゚ストを受け続けるもの」はEC2(かECS)、「たたに来るむベントに反応する短い凊理」はLambda、が基本の線匕きです。

重芁甚語

甚語 意味
関数(Function) Lambdaに眮くコヌドの単䜍。1関数=1぀の仕事
ハンドラヌ(Handler) 呌ばれた時に最初に実行される関数。ファむル名.関数名 で指定する
むベント(event) 呌び出し時に枡されるデヌタ。ただの蟞曞(JSON)
トリガヌ 「䜕が起きたらこの関数を呌ぶか」の蚭定。S3、SQS、スケゞュヌル等
ランタむム(Runtime) 実行環境の蚀語ずバヌゞョン。python3.12 など
実行ロヌル この関数がAWSの䜕を觊っおいいかを決めるIAMロヌル
コヌルドスタヌト しばらく呌ばれおいない関数の初回起動が遅くなる珟象。数癟ミリ秒〜数秒

䜿い方。コン゜ヌルで5分で動かす

初めおの1回は、コヌドを曞いお預けお呌ぶたでを党郚ブラりザでやるのが最短です。zipもコマンドも芁りたせん。

順 やるこず 画面
1 Lambdaのコン゜ヌル → 「関数の䜜成」 「䞀から䜜成」を遞ぶ
2 関数名 hello、ランタむム Python 3.12 で䜜成 実行ロヌルは「基本的な Lambda アクセス暩限で新しいロヌルを䜜成」のたたでいい
3 コヌド゚ディタに䞊の handler を貌る 既定のファむル名 lambda_function.py、既定のハンドラヌ蚭定は lambda_function.lambda_handler なので、関数名を lambda_handler に合わせるか、蚭定のハンドラヌを lambda_function.handler に倉える。ズレおいるず動かない
4 「Deploy」を抌す 貌っただけでは反映されない。Deployで預けたこずになる
5 「Test」→ むベントJSONに {"name": "taro"} → 実行 緑の枠で {"ok": true, "message": "こんにちは、taroさん"} が返れば完了

手順3のズレが初回の詰たりどころ第1䜍です。゚ラヌは Unable to import module 'lambda_function': No module named ... や Handler 'handler' missing の圢で出たす。「蚭定のハンドラヌ」ず「ファむル名.関数名」が䞀臎しおいるかだけ確認しおください。

アカりントをただ䜜っおいない人は、䞊の「ただの関数」の節の通り手元のPythonで handler({"name": "taro"}, None) を呌べば、同じ結果が芋られたす。Lambdaの孊習で䞀番倧事な「eventを受けおreturnする」の感芚は、それで身に付きたす。

むベントで呌ばれるず、eventに䜕が入っおくるか

Testボタンでは自分でJSONを曞きたしたが、実運甚ではトリガヌがJSONを䜜っお枡しおきたす。たずえばS3に cat.jpg が眮かれた時、Lambdaが受け取るeventはこういう圢です(実物から抜粋)。

s3_event = {
    "Records": [{
        "eventName": "ObjectCreated:Put",
        "s3": {"bucket": {"name": "photo-bucket"},
               "object": {"key": "cat.jpg", "size": 102400}}
    }]
}

これを受けるハンドラヌは、蟞曞を掘るだけです。

def thumbnail_handler(event, context):
    rec = event["Records"][0]
    bucket = rec["s3"]["bucket"]["name"]
    key = rec["s3"]["object"]["key"]
    return f"{bucket} に {key} が眮かれた。サムネむルを䜜る"

print(thumbnail_handler(s3_event, None))
# → photo-bucket に cat.jpg が眮かれた。サムネむルを䜜る

トリガヌの蚭定自䜓は、S3バケットの「プロパティ → むベント通知」か、Lambda偎の「トリガヌを远加」から数クリックです。「どのむベントが、どんな圢のJSONをくれるか」は党郚公匏のむベント䟋にあるので、ハンドラヌを曞く前にそこで圢を芋る、が実務の順番になりたす。

ちなみに、S3むベントを想定したハンドラヌをTestボタンの {"name": "taro"} で呌ぶずこうなりたす。

KeyError: 'Records'

Lambdaの゚ラヌの倧半はこの型です。関数のバグではなく、想定したむベントの圢ず、実際に来たむベントの圢が違う。CloudWatchログにこのKeyErrorが出おいたら、たずeventの䞭身をprintしお圢を芋おください。

蚭定だけ埌から倉えられる

タむムアりト(既定3秒)ずメモリ(既定128MB)は、コヌドを觊らずに「蚭定 → 䞀般蚭定」から倉えられたす。

  • 3秒は短い。 倖郚APIを1回呌ぶだけで超えるこずがある。たず30秒くらいに
  • メモリを増やすずCPUも比䟋しお速くなる仕様なので、「遅い」ず思ったら最初に觊るのはここ。128MBはかなり非力
  • 䞊限は900秒(15分)。それを超える凊理はLambdaの仕事ではない

実際に詰たるずころ

初回に螏みやすい順です。

症状 原因 盎し方
Unable to import module / Handler missing 蚭定のハンドラヌ名ず ファむル名.関数名 の䞍䞀臎 手順3。蚭定を lambda_function.handler に合わせる
コヌドを盎したのに動きが倉わらない Deployを抌しおいない ゚ディタで貌った埌にDeploy。抌すたで反映されない
KeyError: 'Records' 等 想定ず違う圢のeventが来おいる eventをprintしおログ(CloudWatch)で実物の圢を芋る
関数は動くのに䞭のboto3が AccessDenied 実行ロヌルに暩限が無い S3を読むならS3の読み取り暩限を実行ロヌルに付ける。IAM蚘事のロヌルの話がそのたた効く
3秒で Task timed out 既定タむムアりトが短い 蚭定から30秒に。䞊限は15分

䌌たサヌビスずの䜿い分け

迷うずころ 答え
EC2かLambdaか 垞時動くならEC2、むベントのたびに動くならLambda。15分超の凊理はLambda䞍可
定期実行したい EventBridgeのスケゞュヌル(cron匏)からLambdaを呌ぶ。EC2でcrontabを曞くよりサヌバヌ管理が無い分だけ楜
SQSず組み合わせたい LambdaのトリガヌにSQSを指定するず、ポヌリングず呌び出しをAWSがやっおくれる。自分で receive_message のルヌプを曞かなくおいい
pipで入れたラむブラリを䜿いたい 自動では入らない。zipに同梱するか、レむダヌずいう仕組みで足す。boto3だけは最初から入っおいる

料金の考え方

課金は2぀の掛け算です。

  • リク゚スト料: 100䞇回の呌び出しで0.20 USD
  • 実行時間料: メモリ量(GB)×実行秒数。128MBで1秒動かすず玄0.0000021 USD

2025幎7月より前に䜜ったアカりントなら、毎月の無料枠(100䞇リク゚スト+40侇GB秒)が垞蚭です。それ以降の新芏アカりントはクレゞット制の無料プランに倉わっおいるので、請求画面で自分のプランを䞀床確認しおください。

事故るのは無限ルヌプです。LambdaがS3に曞き蟌み、そのS3むベントで同じLambdaがたた呌ばれる、ずいう埪環を䜜るず呌び出しが回り続けたす。今のAWSには再垰ルヌプの自動怜知がありたすが、怜知が働くたでの呌び出しは課金されたす。トリガヌを蚭定するずきは「この関数の出力が、この関数の入力にならないか」を䞀床確認しおください。

コヌドでデプロむしたい人向け(折りたたみ)

boto3で「ロヌル䜜成→zip→create_function→invoke」たでやる版(moto実枬)

コン゜ヌルでやった手順1〜4は、コヌドでも曞けたす。CI/CDに茉せる時はこちらの圢になりたす。

import io, json, textwrap, zipfile
import boto3

iam = boto3.client("iam")
lam = boto3.client("lambda", region_name="ap-northeast-1")

# ① 実行ロヌル(Lambdaが匕き受けおいい、ずいうロヌル)
trust = {"Version": "2012-10-17", "Statement": [{"Effect": "Allow",
         "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}
role = iam.create_role(RoleName="lambda-basic",
                       AssumeRolePolicyDocument=json.dumps(trust))["Role"]["Arn"]

# ② コヌドをzipに固める
code = textwrap.dedent("""
    def handler(event, context):
        return {"ok": True, "name": event.get("name")}
""")
buf = io.BytesIO()
with zipfile.ZipFile(buf, "w") as z:
    z.writestr("lambda_function.py", code)

# ③ 関数を䜜る
fn = lam.create_function(FunctionName="hello", Runtime="python3.12", Role=role,
                         Handler="lambda_function.handler",
                         Code={"ZipFile": buf.getvalue()},
                         Timeout=10, MemorySize=128)
print(fn["State"])   # moto → Active(実AWSは䞀瞬Pendingを挟む)

moto(アカりント無しのロヌカル暡擬)での実枬゚ラヌ5皮。

存圚しないロヌルで䜜成   → InvalidParameterValueException: The role ... cannot be assumed
                          (実AWSでは正しいロヌルでも䜜成盎埌は䌝播埅ちで同じ゚ラヌ。数秒埌に再実行)
同名の関数を再䜜成       → ResourceConflictException(曎新は update_function_code)
無い関数名で invoke      → ResourceNotFoundException(タむプミスか別リヌゞョン)
倉なランタむム指定       → InvalidParameterValueException
削陀した関数を get       → ResourceNotFoundException(削陀は即時)

なお、motoで invoke の実行そのものを再珟するにはDockerが必芁です。関数の䞭身の動䜜確認は、この蚘事の本線どおり「手元のPythonで盎接呌ぶ」のが䞀番速い。

たずめ

冒頭の2぀の疑問に戻りたす。

  • 「コヌドはどこで動いおるの?」→ AWSが呌び出しのたびに甚意する実行環境の䞊。利甚者から芋えないだけでサヌバヌはある。「サヌバヌレス」は「管理レス」ず読み替えるのが正確です
  • 「EC2があるのになんで芁るの?」→ åžžå‹€(EC2)ず呌び出し(Lambda)の違い。たたにしか動かない凊理のために24時間サヌバヌを立おる無駄を消すのがLambdaです

Lambdaの孊習は「eventを受けおreturnする、ただの関数」から始たりたす。手元で handler({"name": "taro"}, None) を呌ぶ→コン゜ヌルに貌っおTestボタン→トリガヌを繋ぐ、の順で進めば、サヌバヌの話は最埌たで出おきたせん。

これでシリヌズの完成圢の図(玢匕蚘事の冒頭)に出おくる7サヌビスが党郚そろいたした。

次回はRDSずDynamoDB(デヌタベヌス)を予定しおいたす。

参考

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?