はじめに
自分がインターンで参加している会社で最近AWSのSAMを触って、これに驚いたのでこの感動を伝えたいがためにこの記事を書こうと思います。
サーバーレスについて知っていることを前提に記事を書いていくため、サーバーレスについて知らない方は調べてみてください。
対象とする方
- AWSリソースを管理コンソールからしか使ったことがない方
- SAMを使ったことがない方
そもそもSAMとはなんじゃろ?
SAMとは何かとはServerless Application Model
の略称のことです。公式ドキュメントを見ると以下のような説明がされています。
AWS Serverless Application Model(SAM)は、サーバーレスアプリケーションを構築するためのオープンソースのフレームワークだ。関数、API、データベース、イベントソースマッピングを表現する省略記法構文を提供する。リソースごとにわずか数行で、必要なアプリケーションを定義し、YAMLを使ってモデル化することができる。デプロイ時に、SAMはSAM構文をAWS CloudFormation構文に変換して展開するため、サーバーレスアプリケーションを迅速に構築できる。
と書かれています。つまり、サーバーレスアプリケーションを構築するときに使うと便利なわけです。
ですがここで以下の疑問が湧いてきました。「CloudFormationでサーバーレスアプリケーションは作成できるのに何故SAMが開発されたのか」と。
1. テンプレートの簡素化
まずSAMを使用することのメリットは文法が簡素化できるということです。以下に簡単なサーバーレスアプリケーションである、APIGatewayからトリガーされるLambda関数を作成します。
最初は素のCloudFormationで作成します。
Resources:
MyLambdaFunction:
Type: 'AWS::Lambda::Function'
Properties:
Handler: 'index.handler'
Role: arn:aws:iam::123456789012:role/execution_role
FunctionName: 'MyFunction'
Code:
S3Bucket: 'myBucket'
S3Key: 'code/myLambda.zip'
Runtime: 'nodejs14.x'
MyApi:
Type: 'AWS::ApiGateway::RestApi'
Properties:
Name: 'MyAPI'
Description: 'My API'
FailOnWarnings: 'true'
RootMethod:
Type: 'AWS::ApiGateway::Method'
Properties:
AuthorizationType: 'NONE'
HttpMethod: 'GET'
ResourceId:
Fn::GetAtt:
- 'MyApi'
- 'RootResourceId'
RestApiId:
Ref: 'MyApi'
Integration:
IntegrationHttpMethod: 'POST'
Type: 'AWS_PROXY'
Uri:
Fn::Sub:
- arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${LambdaArn}/invocations
- LambdaArn: !GetAtt [MyLambdaFunction, Arn]
つぎにSAMを使用して作成します。
Resources:
MyLambdaFunction:
Type: 'AWS::Serverless::Function'
Properties:
Handler: 'index.handler'
Role: arn:aws:iam::123456789012:role/execution_role
CodeUri: s3://myBucket/code/myLambda.zip
Runtime: 'nodejs14.x'
Events:
RootEndpoint:
Type: Api
Properties:
Path: '/'
Method: get
一目瞭然ですがSAMを使用すれば、簡素化された構文でサーバーレスアプリケーションを作成することができるんですね。だいぶすっきりしていて読みやすいですよね。
2. サーバーレスをローカルで実行したりデバッグができる
Lambdaを触ったことがある方ならわかるとおもいますが、Lambdaのデバッグってかなりめんどくないですか?Lambdaって10MB以上になるとzipファイルをアップロードしないといけなくて、それを何回もやるのがかなり面倒くさいわけです。それを解消できるのがSAMなんですね。
Lambdaをローカルで実行できるのはかなり嬉しいですよね。
Lambdaをローカルで実行する方法は追々記事にしていこうとおもいます。
その他にもSAMのすごいことは盛りだくさんなので知っている方がいらっしゃいましたら教えてください!
【参考資料】