目的

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.そもそもサーバレスアプリケーションのユースケースは何なのか?
  • →A.①モバイルアプリのバックエンド/業務機能API②ログ処理・データ加工・ストリーミング・③機能・コンポーネント連携④IoTデータ処理 など

  • Q.SAMテンプレート、どのように読むのか??についての調査
  • →A.前提として、、
    上述の通り、SAMテンプレートはそもそも CloudFormationテンプレートをベースとして作られている。
    → CloudFormationテンプレートの記述の仕方と微妙に違う部分があると結論付ければ良さそう。
    その前提を踏まえた上で、
    「テンプレートには下記のようなセクションに分かれており、そこにインフラを構成する上で必要な情報を書いていく」と理解すると良さそう。(セクションについては下記を参照)

【SAMテンプレートの各セクションとその役割について】※赤字は必須項目

  • Transform
  • Transform:AWS::Serverless-2016-10-31と宣言することで CloudFormationファイルをSAMテンプレートファイルとして認識する

  • Globals(SAM固有のセクション)
  • →全てのサーバレス関数とAPIに共通するプロパティを定義する部分
    =アプリケーションに共通している設定などをこのセクションで定義

  • Description
  • →テンプレートの説明を書く部分

  • Metadata
  • →テンプレートの追加情報を書く部分

  • Parameters
  • →実行時(スタックを作成・更新する時)にテンプレートに渡される値を書く部分
    =スタック(テンプレートによってプロビジョニングされたAWSリソースの集まり)を作成、更新するたびにテンプレートにカスタムした値を入力可能。
    ResourcesセクションとOutputsセクションからのパラメータを参照できる

  • Mappings
  • →キーと名前付きの一連の値との対応付けをする部分
    Mappingsセクションで対応付けた値はFn::FindInMap:(短縮形!FindInMap)関数で呼び出すことが可能。

  • Conditions
  • →関数を利用して条件を設定し、リソースの作成条件を制御をする部分

  • Resources
  • →SAMで使うリソースを記載する部分
    CloudFormationリソースとSAMリソースを組み合わせることができる

  • Outputs
  • →スタックのプロパティを表示するたびに返される値。

アプリケーション構築の流れ

①-④が作成〜削除までの流れ。
★印のコマンドはチュートリアル実施時に実行したコマンド
※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ユーザーにアタッチするポリシーを見直し修正することで無事チュートリアルが完了した。

<参考>
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-permissions-cloudformation.html

<修正前のアタッチしていたポリシー>
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