AWS SAM を知る #AWS

## 初めに

最近AWS上のシステムを触るときに触れた技術であり、よく理解できなかったのでドキュメントに触れつつ基本的な使い方について紹介していきます。

本記事の前半ではSAMやSAM CLIの概要と特徴について説明し、後半にコマンドの使い方について紹介していきます。コマンド紹介までスキップするには[こちら](#SAM&nbsp;CLIコマンドについて)

## AWS Serverless Application Model (AWS SAM)とは

最初に[公式ドキュメント][sam]から引用してSAMの概要・特徴を説明します。

### SAMの概要

公式ドキュメントより

> AWS Serverless Application Model (AWS SAM) は、サーバーレスアプリケーションの構築と実行における開発者の操作性を向上させるツールキットです。

では次にSAMの特徴について説明していきたいと思います。

- コード記述によりアプリインフラを定義できる
- サーバーレスアプリケーションを管理できる
- コネクタを利用してリソース間の権限移動を動的に行える
- コマンドの利用によりローカルの変更をクラウドと継続的に同期できる

参考にした[ドキュメント][sam]では以下のインフラストラクチャの定義を行っていました

```yaml
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
```

- AWS Lambdaサービスを利用する機能
- Amazon API Gatewayサービスを利用したHTTP API
- Amazon DynamoDBサービスを利用するデータベース
- サービス連携に必要なIAM権限

これらはResourcesセクションで実行されています。

- `Type: AWS::Serverless::Function` 
このリソースがサーバーレスLambda関数であることを示します。

- `Type: HttpApi`
イベントタイプの指定

- `Type: AWS::Serverless::SimpleTable`
簡単なDynamoDBテーブルを定義します。

- `Permissions`
このセッションで関数に与える権限を指定する

### SAMを構成する主要部品

- AWS SAM テンプレート仕様

サーバーレスアプリケーションのインフラストラクチャーを定義するために使用できるオープンソースのフレームワーク

AWS AWS SAM AWS CloudFormation テンプレートはテンプレートを拡張したもので、使いやすくするためのコンポーネントがいくつか追加されています。

- AWS SAM CLI

AWS SAMテンプレートやサポートされているサードパーティインテグレーションと組み合わせて使用できるコマンドラインツールで、サーバーレスアプリケーションを構築して実行できます。

## SAM&nbsp;CLIコマンドについて

AWS SAM CLIは、AWS SAMテンプレートやサポートされているサードパーティインテグレーションと組み合わせてサーバーレスアプリケーションを構築して実行できるコマンドラインツールです。

> ・サードパーティのインテグレーションとは...
>あるソフトウェアやシステムが、他の企業や開発者（サードパーティ）が提供する別のソフトウェアやサービスと連携して機能すること

なお本記事は、[こちら][リファレンス]を参考にして作成したものになりますのでよくわからなかった時に参照していただければより詳細な情報を入手できると考えていますのでぜひ活用してください！

### sam build

`sam build`コマンドは、ローカルテストや AWS クラウドへのデプロイなど、開発者ワークフローの後続のステップに備えてアプリケーションを準備します。

・使い方
```
sam build <引数> <オプション>
```

- 引数

AWS SAMテンプレートで宣言された1つのリソースをビルドするように指示します。指定されたリソースのビルド結果は、ワークフローの後続コマンド (つまり、sam package と sam deploy) に使用できる唯一の成果物になります。

- オプション

`--base-dir`
関数またはレイヤーのソースコードへの相対パスを、このディレクトリを基準にして解決します。このオプションは、ソースコードフォルダへの相対パスの解決方法を変更したい場合に使用します。

`--template`
AWS SAM テンプレートファイルのパスとファイル名を示します。

`--use-container`
関数がネイティブにコンパイルされた依存関係を持つパッケージに依存する場合は、このオプションを使用して、Lambda に似た Docker コンテナ内で関数を構築します。

### sam package

`sam package`コマンドは、コードと依存関係の.zipファイルを作成し、そのファイルを Amazon Simple Storage Service (Amazon S3) にアップロードします。

> sam deploy が sam package の機能を暗黙的に実行するようになったそうなので意味さえ押さえておけば大丈夫そう...

・使い方
```
sam package <引数> <オプション>
```

- 引数

パッケージ化するLambda関数のIDを指します。

- オプション

`--s3-bucket`
このコマンドがアーティファクトをアップロードする Amazon S3 バケットの名前になります。

`--s3-prefix`
Amazon S3 バケットにアップロードされる成果物名に追加されたプレフィックスです。

> プレフィックス：
特定の文字列やデータの先頭に付加される文字列のこと

`--output-template-file`
パッケージ化されたテンプレートを書き込むファイルへのパスを示します。

`--region`
デプロイ先の AWS リージョンを示します。

`--profile`
認証情報ファイルから AWS 認証情報を取得する特定のプロファイルを示します。

### sam deploy

`sam deploy`コマンドでは、AWSクラウドを使用してアプリケーションをAWS CloudFormationにデプロイします。

・使い方

```
<環境変数> sam deploy <オプション>
```

- 環境変数

AWS SAM CLI が AWS CloudFormation スタックの状態をチェックする頻度を設定します。（秒数で指定を行う）

使用例
```
SAM_CLI_POLL_DELAY=5 sam deploy
```

- オプション

`--stack-name`
・必須項目
デプロイ先の AWS CloudFormation スタックの名前を指定します。

`--capabilities`
AWS CloudFormationが特定のスタックを作成できるように指定する必要がある機能のリストを示します。

`--no-fail-on-empty-changeset`
スタックに対して行う変更がない場合に 0 以外の終了コードを返すかどうかを指定します。デフォルトの動作では、ゼロ以外の終了コードが返されます。

`--parameter-overrides`
キーと値のペアとしてエンコードされたAWS CloudFormationパラメータのオーバーライドを行います。

`--tags`
作成または更新されたスタックに関連付けるタグのリストを示します。

## さいごに

全体を通してカタカナが多く、一部ニュアンスで乗り切った自分がいたので真の理解とはまだまだ遠く離れている印象です。

紹介しきれていないコマンドであったりコマンドごとのオプションが少し見ただけでも[リファレンス][リファレンス]に大量にありますが、力尽きましたのでその他便利コマンドをお探しの方はぜひ参照してください！


[リファレンス]: https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-command-reference.html
[sam]: https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/what-is-sam.html