はじめに
以前、CloudFormationで単純なLambda関数を作成するテンプレートを記事にしました。
今回は、AWS SAMで作りましたのでそちらも記事にします。
Cloud9上のAWS Toolkitで実行することを想定しています。
テンプレート
以下に、テンプレートの解説をしていきます。
フォルダ構成
CloudFormationとは異なり、ファイルが複数に分かれています。フォルダの構成を以下のようにしました。
sample-sam
├── function
│ ├── function.py
│ └── requirements.txt
└── template.yaml
-
function/function.py
- Lambda関数のスクリプトを記述するファイル。
-
function/requirements.txt
- Lambda関数で使うPythonのライブラリを記述するファイル。
- 今回は外部のライブラリは使わないので0バイト。忘れないように置いているだけ。
-
template.yaml
- 構成の設定を記述するファイル。ほぼCloudFormationと同じ。
各ファイルの中身
function/function.py
単純に文字列をprintして、リターンするだけのものです。
def lambda_handler(event, context):
print('sample function')
return {
'statusCode': 200,
'body': 'Hello from Lambda!'
}
template.yaml
内容は以前の記事のCloudFormationのものと一緒です。
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31
Description: SAM Template for Lambda Function
Parameters:
LambdaFunctionName:
Type: String
Default: "testfunction001"
Resources:
FunctionRole:
Type: AWS::IAM::Role
Properties:
RoleName: !Sub "for-lambdafunction-${LambdaFunctionName}"
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
Service:
- lambda.amazonaws.com
Action:
- 'sts:AssumeRole'
Path: '/service-role/'
Policies:
# CloudWatch
- PolicyName: write-cloudwatchlogs
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- 'logs:CreateLogStream'
- 'logs:PutLogEvents'
Resource: !Sub "arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/lambda/${LambdaFunctionName}:*"
FunctionLogGroup:
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: !Sub /aws/lambda/${LambdaFunctionName}
RetentionInDays: 3653
TargetFunction:
Type: AWS::Serverless::Function
Properties:
FunctionName: !Ref LambdaFunctionName
Role: !GetAtt FunctionRole.Arn
CodeUri: function/
Handler: function.lambda_handler
Runtime: python3.9
1点、パラメータにデフォルト値を設定しています。
これは、AWS Toolkitのウィザードでデプロイしようとすると、デフォルトのパラメータが無い場合は.aws/templates.json
というファイルで宣言するように促されるのですが、このファイルの記載の仕方がわからないので、デフォルト値を使うようにするためです。
どなたか、.aws/templates.json
の記法をご存じの方は教えてください。
使い方 On Cloud9
まずはCloud0にファイル群を置きます。Fileからファイルアップロードを選択します。
ポップアップが出てきます。ここに、フォルダごとドラッグアンドドロップすれば、フォルダごとアップしてくれます。
後は以前書いた記事を参考にしていただければ、デプロイできます。
1点、以下の画面の様にパラメータを上書きするか聞かれますが、デフォルト値を使う場合は"No"を選んでください。
.aws/templates.json
の記法がわかり、そちらで宣言したい方はYesを選んでください。
他は前の記事の通りです。
ここから少しずつブラッシュアップしていく、という使い方を考えています。
おわりに
Lambda関数のテンプレートをAWS SAMで作りました。
CloudFormationだとどうしてもLambda関数のスクリプトを直書きするか、別ファイルにしてZip圧縮してS3にアップして・・・、と手間でしたが、AWS SAMだと、圧縮してS3アップをやってくれるので、手間が非常に軽減できて、開発がスムーズにできそうです。