æ¬è¨äºã¯
IaCã¦ã£ã¼ã¯
11æ¥ç®ã®è¨äºã§ãã
âï¸
10æ¥ç®
â¶â¶ æ¬è¨äº â¶â¶ ð»

ã¯ããã«
ããã«ã¡ã¯ãå ¥ç¤¾2å¹´ç®ã®ã¤ã³ãã©ã¨ã³ã¸ãã¢ã®æ¸¡é¨ã§ãï¼
æ¬è¨äºã¯ãåå¦è
ã®æ¹ãä¸ç´è
ã«ãªãããã®æ¶ãæ©ã¨ãã¦ã
AWS SAM(â»ä»¥ä¸ SAM)ã¨ã¯ããããä½ãªã®ãã¨ããæ¦è¦ããSAMã®åºæ¬çãªã³ãã³ãã
ããã¦æ¬è¨äºã®æçµç®çã§ããSAMãã³ãã¬ã¼ãã®ä½ææ¹æ³ã«ã¤ãã¦ã話ãããã¨æãã¾ãã
â»æ¬è¨äºã§ã¯ãã³ãã¬ã¼ãã®æ¸ãæ¹ã«ãã©ã¼ã«ã¹ãã¦ããããããã¤æé ãªã©ã®å 容ã¯å«ã¾ãã¦ãã¾ããã
SAMã®æ¦è¦
SAMã¨ããã®ã¯ãã¤ãã³ãé§åã®æ§è³ªãæã¤ãµã¼ãã¼ã¬ã¹ã¢ããªã±ã¼ã·ã§ã³ã®ãããã¤ã«ç¹åãããAWS CloudFormationã®æ¡å¼µæ©è½ã§ãã
ã¤ãã³ãé§åï¼ AWS CloudFormationï¼

ãããããã¾ããããé çªã«èª¬æãã¦ããã¾ãã
ã¤ãã³ãé§åã¨ã¯ãã¤ãã³ãï¼åºæ¥äºï¼ããã£ããã«å¦çãéå§ãããä»çµã¿ãè¨è¨ææ³ã®ãã¨ãããã¾ãã
ãã¨ãã°ãã¢ããªã§ã¦ã¼ã¶ã¼ããã¿ã³ãã¯ãªãã¯ããã¨ãã¯ãªãã¯ã¨ããã¤ãã³ããåãã¦å¦çãå®è¡ããã¾ãã
AWSã§ã¯ãåå8æã«ãªãã¨ããã®æå»ãã¤ãã³ãã¨ãã¦æ¤ç¥ããèªåçã«é¢æ°ãèµ·åããä»çµã¿ãããã¾ãããããã¤ãã³ãé§ååã®ä¸ä¾ã§ãã
AWS CloudFormationã¨ã¯ããã³ãã¬ã¼ãã使ç¨ãã¦ãAWSã®ãªã½ã¼ã¹ããããã¸ã§ãã³ã°ã§ãããµã¼ãã¹ã§ãã
ãã¡ãã«é¢ãã¦ã¯ãç§ã®åæã§ãã䏿ããã詳ãã解説ãã¦ãã¾ãã®ã§ã以ä¸ã®ããã°ãã覧ãã ããã
䏿ããã®ããã°ã§ã¯ãCloudFormationã¯ãAWSã®ãªã½ã¼ã¹æ§æãYAMLãJSONå½¢å¼ã§è¨è¿°ãããã¨ã«ãã£ã¦ããã³ãã¬ã¼ãã®å®ç¾©ãè¡ããããããã¨ã«AWSãèªåçã«ãªã½ã¼ã¹ãæ§ç¯ãã¦ãããä»çµã¿ã§ããã¨èª¬æããã¦ãã¾ãã
AWS SAMã¨CloudFormationã®éã
䏿ããã®ããã°ãè¦ã¦ããã ãã¨ããCloudFormationãSAMããã³ãã¬ã¼ãã§æ¸ãã®ãªãã°ãéãã¯ä½ãªã®ãããã¨ããææ³ãæ±ãæ¹ãããã£ãããã¨æãã¾ãã
ããã§ãCloudFormationã¨SAMã®éããæ´çãã¾ãã
大ããªéãã¯ãCloudFormationã¯AWSå
¨ä½ã®ãªã½ã¼ã¹ãã³ã¼ãã§ç®¡çããããã®ãµã¼ãã¹ã§ãããSAMã¯ãµã¼ãã¼ã¬ã¹ã¢ããªã±ã¼ã·ã§ã³éçºãç°¡åã«ããããã®ãã¬ã¼ã ã¯ã¼ã¯ã ã¨ãããã¨ã§ãã
ã³ã¼ãã§æ¯è¼ãã¦ã¿ã¾ãããã ä¾ã¨ãã¦ãLambda颿° + API Gateway + S3ãã±ãããå«ãæ§æãæ¸ããã¨ãã®CloudFormationã®ãã³ãã¬ã¼ãããã¡ãã§ãã
Resources:
MyBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: my-app-bucket
MyLambdaFunction:
Type: AWS::Lambda::Function
Properties:
FunctionName: MyFunction
Handler: index.handler
Runtime: nodejs18.x
Code:
S3Bucket: my-code-bucket
S3Key: lambda-code.zip
Role: arn:aws:iam::xxxxxxxxxxxx:role/lambda-role
MyApi:
Type: AWS::ApiGateway::RestApi
Properties:
Name: MyApi
MyApiResource:
Type: AWS::ApiGateway::Resource
Properties:
ParentId: !GetAtt MyApi.RootResourceId
PathPart: hello
RestApiId: !Ref MyApi
MyApiMethod:
Type: AWS::ApiGateway::Method
Properties:
HttpMethod: GET
ResourceId: !Ref MyApiResource
RestApiId: !Ref MyApi
AuthorizationType: NONE
Integration:
IntegrationHttpMethod: POST
Type: AWS_PROXY
Uri: !Sub >-
ããã¦ãSAMãã³ãã¬ã¼ãã®ã³ã¼ãããã¡ãã«ãªãã¾ãã
Transform: AWS::Serverless-2016-10-31
Resources:
MyBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: my-app-bucket
MyFunction:
Type: AWS::Serverless::Function
Properties:
Handler: index.handler
Runtime: nodejs18.x
CodeUri: ./src/
Role: arn:aws:iam::xxxxxxxxxxxx:role/lambda-role
Events:
HelloApi:
Type: Api
Properties:
Path: /hello
Method: get
åãæ§æãæ¸ããã«ãé¢ããããCloudFormationã¯ç´40è¡ãSAMã¯ç´20è¡ã¨ãªããSAMã§ããã°ååã®è¡æ°ã§ç°¡æ½ã«æ¸ããã¨ãã§ãã¾ãã
ã¾ããCloudFormationã§ã¯ãã¼ã«ã«ã§ãã¹ããããã¨ã¯ã§ãã¾ããããSAMã§ã¯SAM CLIã¨å¼ã°ããã³ãã³ãã©ã¤ã³ãã¼ã«ã使ç¨ãããã¨ã§å¯è½ã«ãªãã¾ãã
ä»ã«ãç°ãªãç¹ãããã¾ãã®ã§ã表ã§ã¾ã¨ãã¦ã¿ããã¨æãã¾ãã
| é ç® | CloudFormation | AWS SAM |
|---|---|---|
| 対象ç¯å² | AWSå ¨ãªã½ã¼ã¹ | ãµã¼ãã¼ã¬ã¹é¢é£ãªã½ã¼ã¹ã«ç¹å |
| æ§æ | æ¨æºCloudFormationæ§æï¼JSON/YAMLï¼ | SAMå°ç¨ã®ç°¡ç¥æ§æï¼YAMLï¼ |
| ãã¼ã«ã«ãã¹ã | à | âï¼SAM CLIã§å¯è½ï¼ |
| ãããã¤è£å© | åºæ¬ãªãï¼AWS CLIãã³ã³ã½ã¼ã«ãå©ç¨ï¼ | ç°¡åï¼sam deployã§ç°¡åã«èªååï¼ |
SAMã®æ¦è¦ã®èª¬æãçµãã£ãã¨ããã§ãAWSãªã½ã¼ã¹ãSAMã§æ§ç¯ãããã¨ã«ããéçºè
ã«ã¨ã£ã¦ã®ã¡ãªããã説æãã¾ãã
éçºè ã«ã¨ã£ã¦ã®ã¡ãªãã
LambdaãAPI GatewayãDynamoDBãS3ãªã©ããµã¼ãã¼ã¬ã¹ãµã¼ãã¹ãç°¡æ½ã«å®ç¾©ã§ããã
CodePipelineãCodeBuildãªã©ã®CI/CDãµã¼ãã¹ã¨ã¹ã ã¼ãºã«é£æºã§ãããããç¶ç¶çãªãããã¤ç°å¢ã®æ§ç¯ã容æã§ããã
ä¾ãã°ãä¸è¨ã®ãããªæ§æã ã¨ãGitHubã¸ã®pushãããªã¬ã¼ã«ããã«ããããããã¤ã¾ã§èªåã§å®è¡ãããã¨ãã§ããããã«CodeBuild ã SAM CLI ã«å¯¾å¿ãã¦ããããã追å ã§è¤éãªè¨å®ãããå¿ è¦ã¯ãªãSAMã®ã³ãã³ããå®è¡ãããã¨ãã§ãã¾ãã
ãã¡ãã®ã¡ãªããã«ãããæçµçã«ãéçºãµã¤ã¯ã«ãç縮ãããæ°æ©è½ããµã¼ãã¹ã®ãªãªã¼ã¹ãè¿
éã«è¡ããããã«ãªãã¾ãã
ã³ãã³ãã®æ¦è¦
ããã§ã¯ãSAMãã³ãã¬ã¼ãã®ä½æã«å¿ è¦ãªã³ãã³ãã«ã¤ãã¦ã話ããã¦ããããã¨æãã¾ãã
ã³ãã³ã1:sam init
SAMãã³ãã¬ã¼ãã¨å¿
è¦ãªãã£ã¬ã¯ããªãèªåçæããã³ãã³ãã§ãã
ã³ãã³ãããã¤ã¨ã以ä¸ã®ã¡ãã»ã¼ã¸ã表示ããã¾ãã
Which template source would you like to use? 1 - AWS Quick Start Templates 2 - Custom Template Location
sam initã³ãã³ãå®è¡å¾ãAWSãå
¬å¼ã«æä¾ãããã³ãã¬ã¼ããå©ç¨ããããèªåã§ãã³ãã¬ã¼ããæå®ããã®ãã«ã¤ãã¦ã®è³ªåã§ãã
Which runtime would you like to use? 1 - python3.13 2 - python3.12 3 - python3.11 4 - python3.10 5 - python3.9 6 - python3.8 7 - nodejs22.x 8 - nodejs20.x 9 - nodejs18.x 10 - nodejs16.x 11 - java21 12 - java17 13 - java11 14 - dotnet8 15 - dotnet6 16 - ruby3.4 17 - ruby3.3 18 - ruby3.2
ãã¡ãã¯ãLambda颿°ã®ã©ã³ã¿ã¤ã ãä½ã«è¨å®ãããã«ã¤ãã¦ã®è³ªåã§ãã
Which package type would you like to use? 1 - Zip 2 - Image
ã½ã¼ã¹ã³ã¼ãã¨ä¾åé¢ä¿ãZIPãã¡ã¤ã«ã«ã¾ã¨ãã¦ã¢ãããã¼ãããã®ããã³ã³ããã¤ã¡ã¼ã¸ã¨ãã¦ãããã¤ããã®ããLambda颿°ã®ãããã¤æ¹å¼ã鏿ãã質åã§ãã
Project name [sam-app]:
ããã¸ã§ã¯ãåã«é¢ãã質åã§ãããã®ã¾ã¾Enterãæ¼ãã¨ãããã©ã«ãã§è¨å®ããã¦ãããsam-appãã«ãªãã¾ãã
ãã®è³ªåã«åçããã¨ãAWS SAM ããã¸ã§ã¯ãã使ããã¾ãã
ãã®AWS SAMããã¸ã§ã¯ãã®ä¸å¿ã¨ãªãè¨å®ãã¡ã¤ã«ãtemplate.ymlã¨ããååã®SAMãã³ãã¬ã¼ãã¨ãªãã¾ãã
ã³ãã³ã2:sam validate
SAMãã³ãã¬ã¼ãã®æ§æãåºæ¬çãªè¨å®ãæ£ããããæ¤è¨¼ããããã®ã³ãã³ãã§ãã
ç§ãåãã¦SAMãã³ãã¬ã¼ãã使ããã¨ãã¯ãYAMLãã¡ã¤ã«ã®ç´°ããææ³ã¨ã©ã¼ããããã¨ãå¤ãã
ã³ãã³ãå®è¡æã«ã¯ãã¨ã©ã¼ã¡ãã»ã¼ã¸ã表示ããããã¨ãä½åãããã大å¤è²´éãªçµé¨ãããã¦ããã ãã¾ããã(ç¬)
template.ymlã«åé¡ãªããã°ä¸è¨ã®ã¡ãã»ã¼ã¸ã表示ããã¾ãã
Template provided at template.yaml is valid SAM Template
ã³ãã³ã3:sam build
SAMãã³ãã¬ã¼ãã«åºã¥ãã¦Lambda颿°ãLayerã®ã³ã¼ããä¾åé¢ä¿è¾¼ã¿ã§ãã«ããããããã¤å¯è½ãªå½¢ã«æ´ããã³ãã³ãã§ãã
ããã©ã«ãã§ã«ã¬ã³ããã£ã¬ã¯ããªã«ããtemplate.yml ãèªã¿è¾¼ã¿ãå¥ã®å ´æã«ãã³ãã¬ã¼ããããå ´åã¯ã--template ãªãã·ã§ã³ã§ãã¹ãæå®ããå¿
è¦ãããã¾ãã
template.yml ãã¡ã¤ã«ãåå¨ãããã£ã¬ã¯ããªã§å®è¡ããã¨ããªãã·ã§ã³ãªãã§ã³ãã³ããå®è¡ãããã¨ãã§ããã®ã§ã便å©ã§ãã
ã³ãã³ã4:sam deploy --guided
ãµã¼ãã¼ã¬ã¹ã¢ããªã±ã¼ã·ã§ã³ã 対話形å¼ã§ãããã¤ããã³ãã³ãã§ãã
ååãããã¤ããã¨ãã¯ã--guidedããªãã·ã§ã³ãã¤ãã¾ãã
ã³ãã³ããå®è¡ããã¨ä¸è¨ã«ã¤ãã¦è³ªåããã¾ãã
1.ãããã¤ããCloudFormationã®ã¹ã¿ãã¯åãã©ã®ããã«ããã®ã
Stack Name [sam-app]:
2.ãããã¤å ã®ãªã¼ã¸ã§ã³ï¼æ±äº¬ãªã¼ã¸ã§ã³ã«ãããã¤ãããå ´åã¯ap-northeast-1ï¼
AWS Region [us-east-1]:
3.ãããã¤åã«å¤æ´å 容ã確èªãããã©ããã
Confirm changes before deploy [Y/n]:
4.Lambdaãªã©ã«å¿ è¦ãªIAMãã¼ã«ãSAM CLIã«ä½æããããã©ããã
Allow SAM CLI IAM role creation [Y/n]:
5.å ¥åããè¨å®ãsamconfig.tomlã«ä¿åãããã©ããã
Save arguments to samconfig.toml [Y/n]:
5ã¤ç®ã®è³ªåã«å¯¾ãã¦ããYããå
¥åããçµæãsamconfig.tomlã¨ãããã¡ã¤ã«ãçæãããããã«ãªãã¾ãã
2åç®ä»¥éã¯sam deploy ã³ãã³ããå®è¡ããã ãã§ãsamconfig.toml ã®è¨å®ãèªåçã«ä½¿ç¨ãããã®ã§ã--guidedãªãã·ã§ã³ã使ç¨ããå¿
è¦ã¯ããã¾ããã
SAMãã³ãã¬ã¼ãã®èª¬æ
ã§ã¯ãSAMã®åºæ¬çã³ãã³ãã«ã¤ãã¦èª¬æããã¨ããã§ãä¸è¨3ã¤ã®ãªã½ã¼ã¹ãSAMãã³ãã¬ã¼ãã§ä½æãããã¨æãã¾ãã
S3ãã±ããã«æ ¼ç´ããã¦ãããã¡ã¤ã«ã®ä¸èº«ãåºåããLambda颿°
ç°¡åãªè¶³ãç®ãè¡ãLambda颿°
S3ãã±ãã
â»Lambda 颿°ã¯ã³ã³ããã¤ã¡ã¼ã¸ã¨ãã¦ãããã¤ãã¾ã
ä¸è¨ãtemplate.ymlã«ãªãã¾ãã
AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Resources:
MyLambdaFunction:
Type: AWS::Serverless::Function
Properties:
FunctionName: !Sub "${AWS::StackName}_printlambda"
Policies:
- S3ReadPolicy:
BucketName: !Ref MyS3Bucket
PackageType: Image
Metadata:
Dockerfile: Dockerfile
DockerContext: ./printlambda
MyS3Bucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub "s3-watanabe-${AWS::AccountId}-${AWS::Region}"
VersioningConfiguration:
Status: Enabled
- ec2-user/printlambda/app.py
import json
import boto3
BUCKET_NAME = 's3-watanabe'
OBJECT_KEY_NAME = 'hello.json'
s3 = boto3.resource('s3')
def lambda_handler(event, context):
bucket = s3.Bucket(BUCKET_NAME)
obj = bucket.Object(OBJECT_KEY_NAME)
response = obj.get()
body = response['Body'].read()
return json.loads(body.decode('utf-8'))
ã¾ãããã£ã¬ã¯ããªæ§æã¯ä»¥ä¸ã®ããã«ãªãã¾ãã
ãã®å ´åãec2-user/template.ymlã«ä¸è¨ã®SAMãã³ãã¬ã¼ããè¨è¼ãããã¨ã«ãªãã¾ãã
ec2-user | | ---------printlambda | | | | ------Dockerfile | | ------requirements.txt | | ------app.py | | |---------------template.yml |---------------docker-compose.yml
SAMãã³ãã¬ã¼ãã®è£è¶³èª¬æ1.ãï¼Subã
Properties:
FunctionName: !Sub "${AWS::StackName}_printlambda"
ã®ï¼Subã¨ã¯ä½ããã¦ãããã«ã¤ãã¦èª¬æãããã¾ãã
ï¼Subã¨ããã®ã¯ãå
¥åæååã®å¤æ°ããæå®ããå¤ã«ç½®ãæããFn::Sub颿°ã§YAMLãã¡ã¤ã«ãè¨è¿°ããã¨ãã®ç縮形ã¨ãªãã¾ãã
ä¾ãã°ãã¹ã¿ãã¯åããs3-watanabeãã«è¨å®ããã¨ãLambda颿°ã®ååã¯ãs3-watanabe_printlambdaãã«ãªãã¾ãã
SAMãã³ãã¬ã¼ãã®è£è¶³èª¬æ2.ãPoliciesã
Policies:
- S3ReadPolicy:
ä»å使ããLambda颿°ã¯S3ãã±ããã®ä¸ã®ãã¡ã¤ã«ãèªã¿åããããs3ã®èªã¿åãæ¨©éããã®ç®æã§ä»ä¸ãã¦ãã¾ãã
S3ReadPolicy以å¤ã«ãæ§ã
ãªããªã·ã¼ãããã¾ãã®ã§ã詳ããã¯ããã¡ãã®å
¬å¼ããã¥ã¡ã³ããã覧ãã ããã
ãã¡ãã®ãã¼ã¸ã§ã¯ãSAMã§å©ç¨å¯è½ãªããªã·ã¼ãã³ãã¬ã¼ãã®ä¸è¦§ãä½¿ãæ¹ãè¨è¿°ä¾ã詳ããç´¹ä»ããã¦ãã¾ãã
å®éã«ç§ãSAMã§IAMããªã·ã¼ã«ã¤ãã¦ã©ãæ¸ããããããããããªããªã£ãã¨ãã¯ãåèã«ãã¦ãã¾ãã
SAMãã³ãã¬ã¼ãã®è£è¶³èª¬æ3.ãPackageTypeã
PackageType: Image
ã®ç®æã¯ããµã¼ãã¼ã¬ã¹ã¢ããªã±ã¼ã·ã§ã³ãã³ã³ããã¤ã¡ã¼ã¸ã¨ãã¦æ§ç¯ããããã«å®£è¨ãã¦ãã¾ãã
ãã®å ´åãã³ã¼ãã¨ä¾åé¢ä¿ãå«ãDockerã¤ã¡ã¼ã¸ãèªåã§å®ç¾©ããããã
Metadata:
Dockerfile: Dockerfile
DockerContext: ./printlambda
ã®ããã«Dockerfileã®å®ç¾©ãå¿
è¦ã«ãªãã¾ãã
AWS SAMã§ PackageType: Image ã使ãã¨ããSAM CLI㯠Dockerfile ã使ã£ã¦ã¤ã¡ã¼ã¸ããã«ããã¾ãã
ã¤ã¾ããDockerfileããªãã¨ãSAMã¯ä½ãã©ããã«ãããã°ãããåãããªãã¨ãããã¨ã«ãªãã¾ãã
éã«ã以ä¸ã®ããã«PackageTypeãZip ã®å ´åã¯ãSAMãèªåã§ãã«ããã¦ããããããDockerfileã¯ä¸è¦ã§ãã
PackageType: Zip
SAMãã³ãã¬ã¼ãã®ä½ææ¹æ³ã®ã³ã
ç§ãå°æ¬ãã¦ããå 輩ããæãã¦ããã£ãSAMãã³ãã¬ã¼ããå¹ççã«ä½æããããã®ã³ããç´¹ä»ãã¾ãã
ç§ã使ããtemplate.ymlã®ããã«åºæ¬çãªãªã½ã¼ã¹ã«ã¤ãã¦ãã³ãã¬ã¼ããè¨è¼ããã¦ãããã®ãWebã§æ¤ç´¢ãã¦éå½¢ã使ããã
ãã¨ãã°EventBridgeã«ã¤ãã¦SAMã§è¨è¼ãããå ´åããAWS SAM EventBridgeããªã©ã§èª¿ã¹ãã¨ãæ¤ç´¢çµæã«template.ymlãè¨è¼ããããã°ãè¨äºã表示ãããããã§ããLambda颿°ã«è¿½å ãããè¨å®ãããã°AWSã®å ¬å¼ããã¥ã¡ã³ãããã¨ã«æ¸ãã¦ã¿ãã
æå¾ã«
AWS SAMã¯ãµã¼ãã¼ã¬ã¹éçºãå¹çåããå¼·åãªãã¼ã«ã§ãããIaCã®ä¸çã«ã¯TerraformãCloudFormationãªã©ããã¾ãã¾ãªé¸æè¢ãããã¾ãã
éè¦ãªã®ã¯ãããã¸ã§ã¯ãã®è¦ä»¶ããã¼ã ã®ã¹ãã«ã»ããã«æé©ãªãã¼ã«ãé¸ã¶ãã¨ã§ãã
SAMããã¹ã¦ã®ã±ã¼ã¹ã«ä¸è½ã¨ããããã§ã¯ããã¾ããããã²ãè¤æ°ã®é¸æè¢ãæ¯è¼ããªãããæé©ãªã¢ã¼ããã¯ãã£ãè¨è¨ãã¦ãã ããã
æå¾ã¾ã§ãèªã¿ããã ããããã¨ããããã¾ããã