察象èªè : AWSãããããè§Šã人ã AWSå匷ã·ãªãŒãºã®7æ¬ç®ã§ãä»åã¯Lambdaã§ããå šäœã®å°å³ã¯çŽ¢åŒèšäºã«ãããŸãã
Lambdaã®èª¬æã§ããåºãããµãŒããŒã¬ã¹ãã§ãããããçåã«åŒã£ããã£ã人åãã«æžããŸãã
- ããµãŒããŒã¬ã¹ãšèšããã©ããããã³ãŒãã¯ã©ãã§åããŠãã®?ã
- ãEC2ãããã®ã«ããªãã§ãã1åå®è¡ãµãŒãã¹ãèŠãã®?ã
ã©ã¡ãããåžžå€ããåŒã³åºãããã®1ç¹ã§çããåºãŸãã

ãã®èšäºã®å
šéšããã®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ã¯ãAWS Lambda(颿°)ãã®ç®±ã§ãSQSããåãåºããŠSNSã«æž¡ã圹ã§ãã
EC2ãšã®éã

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(ããŒã¿ããŒã¹)ãäºå®ããŠããŸãã