🐡
AWS SAM templateファイル記述方法
この記事で使用するSAMでサーバーレスアプリケーションを作成するときに記述するtemplate.yamlファイルの記述方法についてまとめる。
そもそもSAMとは
SAMはseverless application modelの略でAWS上でサーバーレスアプリケーションを作成するときに使用するオープンソースフレームワークでこれを使用することで簡単にLambda, API Gateway, DynamoDBを定義できる。
実はこのSAMはCloudformationというAWSのリソースをコードで定義することのできるサービスの拡張機能である。
template.yamlファイルとは
template.yamlはSAMでリソースを定義するときに使用するファイルで、このファイル内にリソースを定義する。
※cloudformationでもtemplate.yamlファイル内で記述することでリソースを定義する。
※サーバーレスアプリケーションを定義するためにはtemplate.yaml内に
Transform: AWS::Serverless-2016-10-31
を記述する必要がある。
template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Globals:
#サーバーレスのリソースが共通して持つ設定をここに記述する。
Function:
#ここで定義されるLambda関数全てに共通する設定。
Api:
#ここで定義されるAPIgateway全てに共通する設定。
. :
#
Resources:
ここの中にそれぞれのリソースを定義していく。
Resources:の中身
Resources:
MyFunction: #リソース名
type: AWS::Serverless::Function #この場合はlambda関数。
Properties:
#ここに詳しい設定を記述していく
Handler: app.handler #ファイル名.関数 ←実行されるメソッド
Runtime: python3.9
CodeUri: 関数の入ったファイルのパスを指定(initial_handler)
FunctionName:Lambda関数の命名.指定しない場合勝手に命名される
Description: 関数の説明を記述(別にいらない)
Timeout: 関数の実行時間の制限時間を指定
Role: IAMのARNロールを指定
Events: 関数のトリガーを指定
Deep dive into Properties.
Events: 関数のトリガーとなるものを記述する。
記述方法として、そのトリガーの名前をはじめに記述。そこにtypeとそこにまたpropertiesを指定する。
Events:
hoge(NameYouCanFreelyDefine):
Type: SQS or CloudWatchEvent or Api, EventBridgeRule ・・・・
Properties:
**Typeによって指定するプロパティーが異なる。↓**
Role: ロール指定
このロール自体もtemplate.yaml内で記述していく。
ex) template.yaml
Resources:
MyFunction:
type: AWS::Serverless::Function
Properties:
Handler: app.handler
Runtime: python3.9
CodeUri: initial_handler/
Timeout: 関数の実行時間の制限時間を指定
Role: !GetAtt BillingNotiferIamRole.Arn
!GetAtt は 引数にあるリソースの値を取得する。
BillingNotiferIamRole.Arn
↓ ↓
logicalNameOfResource.attributeName
ここで定義されているBillingNotiferIamRoleはこれから定義する。
Resources:
MyFunction:
type: AWS::Serverless::Function
Properties:
Handler: app.handler
Runtime: python3.9
CodeUri: initial_handler/
Timeout: 関数の実行時間の制限時間を指定
Role: !GetAtt BillingNotiferIamRole.Arn
BillingNotiferIamRole:
Type: AWS::IAM::Role #TypeはIAM::Roleを指定
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service: lambda.amazonaws.com
Action: "sts:AssumeRole"
Policies:
-
PolicyName: "billig_notifer_lambda"
PolicyDocument:
Version: "2012-10-17"
Statement:
-
Effect: "Allow"
Action: "logs:*"
Resource: "*"
Discussion