AWS SAM(1)Serverless Application Modelの概要

AWS SAMとは

AWS SAMは、サーバレスアプリケーションを構築するための オープンソース フレームワークであり、数行の設定のみで、必要なアプリケーションを定義できる。AWS SAMは、CloudFormation拡張テンプレート仕様 および AWS SAM CLI コンポーネントから構成される。

AWS SAMを使用することで、関連するコンポーネントとリソースの整理、操作が単一のスタックで管理できる。また、メモリやタイムアウト値などの設定値をリソース間で共有することも可能である。また、CloudFormationの拡張機能 であるため、 CloudFormationに対応するリソースと組み合わせてリソースを管理することができる。

AWS SAMには、ローカルの開発環境でLambda実行環境と同等の機能を提供する。これを用いることで、AWS上にデプロイする前に、ローカルの開発環境で動作や問題等を確認することができる。

また、Lambdaを安全にデプロイするために、 一定期間の間に段階的に新しいバージョンをデプロイすることも可能 である。

SAM の構造

SAMは、CloudFormationのテンプレートファイルの形式に厳格に従う。 Global セクション が追加されており、関数とAPIの共通のプロパティを定義することができる。セキュリティの問題が発生する恐れのあるプロパティ、およびテンプレートの理解を妨げる恐れのあるプロパティは、Globalセクションに対応しない。 Resources テーブルで定義したプロパティは、Globalで指定された値を上書きする

SAM リソース

SAMで定義されているリソースは以下の通り。

リソースタイプ 内容 備考
AWS :: Serverless :: Api APIGatewayリソースとメソッドを作成
AWS::Serverless::Application 外部のリソースをNested Stackとして作成 AWS Serverless Application Repository を利用可能
AWS::Serverless::Function Lambdaを作成 IAMロールやトリガを一括指定可能, 段階的な展開が可能
AWS::Serverless::HttpApi HTTP API を作成
AWS::Serverless::LayerVersion Lambda Layer Version を作成
AWS::Serverless::SimpleTable DynamoDB テーブルを作成
AWS::Serverless::StateMachine Step Functions を作成

なお、API Gateway extensions に SAM に対応していないExtensionがある旨の記述があるが、これは ローカルの実行に対応していないとの意味であり、実際にはSAMリソース内で定義することは可能 である。

SAM のビルドとデプロイ

SAM をビルドするためには、 sam build コマンドを使用する。このコマンドは、 requirements.txt などに記述された 依存関係のあるパッケージを収集し、適切な形式と場所に格納 する。

SAM は CloudFormation のメカニズムを使用してデプロイを行うことができる。 sam deploy コマンドを実行するとアーティファクトは圧縮され、S3にアップロードされる。これらの作業は、 CodeBuild , CodeDeploy , CodePipeline を用いることで自動化できる。

SAM のモニタリング

sam logs コマンドを用いることで、Lambda が生成したログをコマンドラインから確認することができる。 tail することや特定の時間帯のログの抽出、ログのフィルタリングを行うことも可能。

SAM の公開

作成した SAM は、 AWS Serverless Application Repository で公開することができる。

SAM CLI

sam init

プロジェクト名として指定したディレクトリの下に、sam-app ディレクトリと、SAMプロジェクトおよびサンプルテンプレートを作成する。

sam validate

SAMテンプレートが有効であるかどうか検証する。具体的には、 AM テンプレートから本来の CloudFormation テンプレートの文法に変換できるかを検証するコマンド である。AWS CLI Configureにてデフォルトリージョンを設定していない場合には、以下のように環境変数を与える必要がある。

似た機能である aws cloudformation validate-template コマンドは、CloudFormation テンプレートの構文を検証するコマンドであるため、 sam validate と挙動は異なる。

env AWS_DEFAULT_REGION=ap-northeast-1 sam validate

sam build

sam-app ディレクトリ直下に .aws-sam を作成し、この下に、指定した実行環境をターゲットとする デプロイメントアーティファクト を作成する。例えば、LambdaをPythonで記述した場合に、 requirements.txt にて依存関係のあるライブラリを指定することができるが、 sam build はこれらの依存関係を適切に処理する。

sam package

デプロイメントアーティファクト を圧縮してS3にアップロードする。また、パッケージ化されたSAMテンプレート(packaged.yaml)を作成する。パッケージ化されたSAMテンプレートには、S3にアップロードした デプロイメントアーティファクト へのリンク先が記述されている。sam deploy コマンドは、 sam package コマンドを暗黙的に実行するため、本来は sam deploy コマンドを実行するだけでよい。

sam deploy

アプリケーションのデプロイを行う。 --guided パラメータを付与することで、インタラクティブモードを起動することができる。

sam logs

Lambdaが生成するログを確認することができる。

SAMテンプレート

SAMテンプレートには、 Globals セクションが設けられており、ランタイムやメモリなどの共通設定をこれに格納することができる。なお、以下のプロパティはサポートされていない。

  Function:
    Role:
    Policies:
    FunctionName:
    Events:

  Api:
    StageName:
    DefinitionBody:

SAMテンプレートでは、以下のリソースタイプがサポートされている。AWS :: Serverless :: LayerVersion のみ DeletionPolicy をサポートしている。また、 AWS :: Serverless :: Api 内で記述するOpenAPIドキュメントは、 一部のAPI Gateway拡張(x-amazon-apigateway-) のみサポートしていることに注意が必要である。

タイプ 作成されるリソース 備考
AWS :: Serverless :: Api API Gateway OpenAPIを使用してAPIを定義する
AWS :: Serverless :: Application SAM Serverless Application Repositoryのリソースをデプロイ可能
AWS :: Serverless :: Function Lambda, IAM Role
AWS :: Serverless :: HttpApi API Gateway Http Api
AWS :: Serverless :: LayerVersion Lambda Layer Version
AWS :: Serverless :: SimpleTable DynamoDB プライマリキーのみのテーブルを作成

ポリシーテンプレート

SAMでは、Lambdaのアクセス許可をポリシーテンプレートという形で指定することができる。ポリシーテンプレートは、あらかじめAWSが用意したポリシーパターンである。

テスト

sam local コマンドを用いることでローカルで、API GatewayやLambdaを実行させることができ、開発環境でアプリケーションの動作を検証することができる。