目的
AWS SAMについて、知識の整理をすること
AWS SAMの概要
AWS 公式によるAWS SAMの定義は以下の通り。
AWS Serverless Application Model (AWS SAM) は、AWS 上でサーバーレスアプリケーションを構築および実行するデベロッパーのエクスペリエンスを改善するツールキットです。AWS SAM は次の 2 つの主要な部分で構成されます。
1. AWS SAM テンプレート仕様 – AWS でサーバーレスアプリケーションインフラストラクチャを定義するために使用できるオープンソースフレームワーク。
2. AWS SAM コマンドラインインターフェイス (AWS SAM CLI) – AWS SAM テンプレートやサポートされているサードパーティーの統合と併用することで、サーバーレスアプリケーションを構築し、実行できるコマンドラインツール。
1.に関して→SAMテンプレートはAWS CloudFormationを拡張したもので構築されている
(より短い記述で定義できるのがいいところ)
☞IaC(Infrastructure as Code)が実現
テンプレートに沿って(下記のコードがその記入例)インフラ(①〜④)を定義。
①AWS Lambdaを利用した関数
②Amazon API Gatewayを使用した HTTP API
③Amazon DynamoDB を使用するデータベース
④①〜③が連携するために必要なIAM 許可
↓
後はテンプレートを AWS CloudFormation にデプロイするだけ
→SAMテンプレートがAWS側で自動的にCloudFormation構文に変換される
AWSTemplateFormatVersion: 2010-09-09 Transform: AWS::Serverless-2016-10-31 Resources: getAllItemsFunction: Type: AWS::Serverless::Function Properties: Handler: src/get-all-items.getAllItemsHandler Runtime: nodejs12.x Events: Api: Type: HttpApi Properties: Path: / Method: GET Connectors: MyConn: Properties: Destination: Id: SampleTable Permissions: - Read SampleTable: Type: AWS::Serverless::SimpleTable
メリット
主なメリットはサーバレスアプリケーションを迅速に構築することができること=開発の効率化
- テンプレートと、Lambdaのプログラムを一括管理できる
- インフラの定義がより少ないコードでできてしまう
- ローカルの開発環境にLambdaの実行環境を構築可能
個人的な疑問、その調査
- Q.そもそもサーバレスアプリケーションのユースケースは何なのか?
- Q.SAMテンプレート、どのように読むのか??についての調査
→A.①モバイルアプリのバックエンド/業務機能API②ログ処理・データ加工・ストリーミング・③機能・コンポーネント連携④IoTデータ処理 など
→A.前提として、、
上述の通り、SAMテンプレートはそもそも CloudFormationテンプレートをベースとして作られている。
→ CloudFormationテンプレートの記述の仕方と微妙に違う部分があると結論付ければ良さそう。
その前提を踏まえた上で、
「テンプレートには下記のようなセクションに分かれており、そこにインフラを構成する上で必要な情報を書いていく」と理解すると良さそう。(セクションについては下記を参照)
【SAMテンプレートの各セクションとその役割について】※赤字は必須項目
- Transform
- Globals(SAM固有のセクション)
- Description
- Metadata
- Parameters
- Mappings
- Conditions
- Resources
- Outputs
→Transform:AWS::Serverless-2016-10-31と宣言することで CloudFormationファイルをSAMテンプレートファイルとして認識する
→全てのサーバレス関数とAPIに共通するプロパティを定義する部分
=アプリケーションに共通している設定などをこのセクションで定義
→テンプレートの説明を書く部分
→テンプレートの追加情報を書く部分
→実行時(スタックを作成・更新する時)にテンプレートに渡される値を書く部分
=スタック(テンプレートによってプロビジョニングされたAWSリソースの集まり)を作成、更新するたびにテンプレートにカスタムした値を入力可能。
ResourcesセクションとOutputsセクションからのパラメータを参照できる
→キーと名前付きの一連の値との対応付けをする部分
Mappingsセクションで対応付けた値はFn::FindInMap:(短縮形!FindInMap)関数で呼び出すことが可能。
→関数を利用して条件を設定し、リソースの作成条件を制御をする部分
→SAMで使うリソースを記載する部分
CloudFormationリソースとSAMリソースを組み合わせることができる
→スタックのプロパティを表示するたびに返される値。
アプリケーション構築の流れ
①-④が作成〜削除までの流れ。
★印のコマンドはチュートリアル実施時に実行したコマンド
※SAM CLIインストール済であることが前提条件
①$sam init #アプリケーションを作成するためのテンプレートの生成(対話形式で、使用目的に応じて使用するテンプレートの選択ができる) ↓がその例 (Hello Worldアプリケーションの作成時の例) ... Which template source would you like to use? 1 - AWS Quick Start Templates 2 - Custom Template Location Choice: 1 Choose an AWS Quick Start application template 1 - Hello World Example 2 - Multi-step workflow 3 - Serverless API 4 - Scheduled task 5 - Standalone function 6 - Data processing 7 - Hello World Example With Powertools 8 - Infrastructure event management 9 - Serverless Connector Hello World Example 10 - Multi-step workflow with Connectors 11 - Lambda EFS example 12 - DynamoDB Example 13 - Machine Learning Template: 1 Use the most popular runtime and package type? (Python and zip) [y/N]: y Would you like to enable X-Ray tracing on the function(s) in your application? [y/N]: Would you like to enable monitoring using CloudWatch Application Insights? For more info, please view https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch-application-insights.html [y/N]: Project name [sam-app]:
②$sam build #アプリケーションをAWSクラウド上にデプロイをする準備をする
③$sam deploy #アプリケーションをAWSクラウド上にデプロイする ※ --guided オプションをつけると対話型でデプロイをすることができる
④$sam delete #AWSクラウド上からアプリケーションを削除
★$sam sync #ローカル上のアプリケーションの変更をAWSクラウド上に同期する 開発環境で使うことが推奨されている
自分が詰まったポイントとその原因
Hello Worldアプリケーション構築のチュートリアルを行った際、リソース作成の権限不足が原因でデプロイに失敗していた
=IAM作成するポリシーがない、と記載されている
下記がエラー内容
↓IAMユーザーにアタッチするポリシーを見直し修正することで無事チュートリアルが完了した。
<修正前のアタッチしていたポリシー>
Amazon S3FullAccess
Amazon CloudFormationFullAccess
AWS LambdaFullAccess
<修正後のポリシー>
AWSCloudFormationFullAccess
IAMFullAccess
AWSLambda_FullAccess
AmazonAPIGatewayAdministrator
AmazonS3FullAccess
AmazonEC2ContainerRegistryFullAccess
最後に
チュートリアルの実施や、アウトプットを通してSAMの理解を深めることができた。
その一方で、初歩的なポリシーの部分で詰まってしまったということで、知識不足を痛感した。
今後は実際にハンズオンをして、そこで色々失敗して学ぶ、というようにただ頭で覚えるのではなく、「手を動かしてサービスを理解する姿勢」を大事にしていき、実践で使える知識を身につけていきたい。
参考文献
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/what-is-sam.html
https://pages.awscloud.com/rs/112-TZM-766/images/T5-2_AWS-Builders-Online-Series_2023-Q3_Presentation-Deck_Serverless2.pdf
https://www.slideshare.net/AmazonWebServicesJapan/ss-122211072
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-specification-template-anatomy.html