AWS Serverless デジタルバッジを取得する⑦　デプロイ編






[このデジタルバッジ](https://aws.amazon.com/jp/blogs/news/introducing-new-aws-serverless-digital-learning-badges/)取得のために、AWS Skill Builderの[このコース](https://explore.skillbuilder.aws/learn/lp/1585/serverless-learning-plan-japanese)を学習している記録

自分のスキルレベルは以下。
- SAAは取得
  - 4年前ぐらい
- 実務利用なし
  - 趣味レベルではあり





# Deploying Serverless Applications (日本語字幕版)
https://explore.skillbuilder.aws/learn/course/14455/play/65644/deploying-serverless-applications-japanese;lp=1585




# サーバーレスデプロイについて理解する
## サーバーレスデプロイの概要

サーバーレスアプリケーションは分散型であり、デプロイする機会が多くなるため、標準化プロセスが重要。


- サーバフル
  - 各サーバ・インスタンスすべてにデプロイが必要
- サーバレス
  - 以下のような方法でデプロイ
    - AWS CloudFormation
    - AWS Cloud Development Kit (AWS CDK)
    - Terraform
    - Serverless Framework などの Infrastructure as Code サービス
- 成功させる要因
  - 変更の監査
  - 不正デプロイのロールバック・停止
  - 計画された自動化プロセスの活用

## サーバーレスデベロッパーのジャーニー

- サーバーレス開発手法
  - AWSコンソール
    - コードをローカルに構築し、テストする能力が必要
  - ローカル
    - コードをサンドボックスにデプロイする機能が必要
- AWS SAM
  - 概要
    - オープンソースのフレームワーク
    - 関数、API、データベース、イベントソースマッピングを表す短縮構文を提供する。
    - SAM 構文は、AWS CloudFormation 構文に変換および拡張される。
    - CloudFormation によって信頼性の高いデプロイ機能でリソースがプロビジョニングされる。
    - 料金無料。
  - SAMテンプレート
    - 短縮構文を使用して AWS CloudFormation 互換テンプレートを作成する。
    - Lambda 関数、API Gateway API、AWS Serverless Application Repository からのサーバーレスアプリケーション、DynamoDB テーブルを Infrastructure as Code で定義する。
    - デプロイ中にエラーがあった場合はロールバックされ、環境はデプロイ前の状態に戻る。
    - 重要な要素
      - 変換ディレクティブ
        - SAM構文拡張に利用
      - AWS::Serverless::Function
        - プロビジョニングするリソース指定
  - SAM CLIの利用
    - コードをSAMテンプレートからデプロイパッケージ作成
    - SAM Package コマンドでS3にアップロード
    - SAM DeployコマンドでCloudFormationスタックにデプロイ
- Serverless Patterns Collection
  - AWS の異なるサービスを結合するパターン集
  - GitHub でも公開






### 参考資料


[Serverless Patterns Collection](https://serverlessland.com/patterns)



# 構成データを共有する
- 構成データ
  - 接続文字列
  - ログ設定
  - 出力など
  - 機密の可能性があるので、以下に注意
    - 誤ってソースコードにチェックイン
    - そのデータを共有


## サーバーレス環境での構成データの共有
- 構成データのデプロイオプション
  - ベストプラクティスは、デプロイパッケージにハードコードしない


|デプロイオプション   |機密情報に理想的 |1つのLambda関数に固有 |構成データの一元化ストレージ|レイテンシー |
|-------------------|-----------------|-------------------------|----------------------------|-----------|
|アプリケーション内にハードコード|             |✔️                     |                           |低い       |
|環境変数           |               |✔️                     |                           |低い       |
|Parameter Storeから実行時にデータをロード|✔️  |                          |✔️                           |影響の可能性あり          |


- 構成データのデプロイ戦略
  - 環境変数に格納
    - Lambda で作業する場合、環境変数 (キーまたは値のペア) を使用に格納可能
  - 実行時にロード
    - ストレージシステムに構成データを格納し、Lambda 関数を使用して呼び出し。
    - ストレージシステム
      - AWS Systems Manager Parameter Store
      - AWS Secrets Manager
      - AWS AppConfig
- AWS Systems Manager Parameter Store
  - 構成データ管理のための階層型ストレージ
    - フルマネージド
    - 無料
    - データはプレーンテキスト、AWS Key Management System (AWS KMS) で暗号化可能
    - バージョニング







# デプロイパイプラインを自動化する

## 安全で段階的なデプロイ

- Lambda のバージョニングとエイリアス
  - Lambda バージョン
    - $LATEST のみが存在
    - バージョンを公開するたびに、Lambda は $LATEST のスナップショットコピーを作成
      - このコピーは変更不可。
  - Lambda エイリアス
    - 特定のバージョンの関数を指すポインタ
- デプロイ戦略
  - 一括
    - 新バージョン一括
  - Canary
    - トラフィックの一部を新へ。
    - 検証後、手動で一括。
    - Canaryは鳥のカナリアという英単語
        - Canary XXXで影響を抑えるためにちょっとずつ、というような用法で利用される。
        - 炭鉱でガス検知に利用するから。
  - 線形
    - トラフィックの一部を新へ。
    - 自動で徐々に増加。
- 比較

| デプロイ  | コンシューマーへの影響     | ロールバック           | イベントモデル要因                          | デプロイ速度 |
| --------- | -------------------------- | ---------------------- | ------------------------------------------- | ------------ |
| 一括      | 一括                       | 古いバージョンを再デプロイ    | すべてのイベントモデルの同時実行率が低い          | 即座         |
| Canary/線形 | 1～10% の初期の通常のトラフィックシフト、その後段階的 | トラフィックの 100% を以前のデプロイに戻す | 同時実行率が高いワークロードで最適 | 数分から数時間 |



- AWS SAM でのデプロイの設定
  - エイリアスを使用したトラフィックシフトは AWS SAM に直接統合
  - SAMのデプロイ設定参考集


| デプロイの設定タイプ                 | 説明                                             |
|-----------------------------------|------------------------------------------------|
| Canary10Percent30Minutes          | 最初の増分でトラフィックの 10% を移行します。残りの 90% は 30 分後にデプロイされます。 |
| Canary10Percent5Minutes           | 最初の増分でトラフィックの 10% を移行します。残りの 90% は 5 分後にデプロイされます。 |
| Canary10Percent10Minutes          | 最初の増分でトラフィックの 10% を移行します。残りの 90% は 10 分後にデプロイされます。 |
| Canary10Percent15Minutes          | 最初の増分でトラフィックの 10% を移行します。残りの 90% は 15 分後にデプロイされます。 |
| Linear10PercentEvery10Minutes     | すべてのトラフィックが移行されるまで、10 分ごとにトラフィックの 10% を移行します。 |
| Linear10PercentEvery1Minute       | すべてのトラフィックが移行されるまで、毎分トラフィックの 10% を移行します。 |
| Linear10PercentEvery2Minutes      | すべてのトラフィックが移行されるまで、2 分ごとにトラフィックの 10% を移行します。 |
| Linear10PercentEvery3Minutes      | すべてのトラフィックが移行されるまで、3 分ごとにトラフィックの 10% を移行します。 |
| AllAtOnce                         | すべてのトラフィックを更新された Lambda 関数に一括で移行します。                  |



## デプロイパイプラインを作成する

- CI/CD パイプライン
  - デプロイ、チェックなどの標準化手順を自動化。
  - 工程
    - ソース
      - CodeCommit
    - ビルド
      - codeBuild
    - テスト
      - CodeBuild
      - サーバパーティ
    - 本番
      - CodeDeploy
- AWS SAM Pipeline
  - CI/CD システム向けのテンプレートを提供するAWS SAMの機能
  - 以下のコマンドを利用して、オペレーターとデベロッパーの認証情報を別々に管理
    - sam pipeline bootstrap
      - コードリポジトリから AWS 環境にデプロイするのに必要な AWS リソースおよびアクセス許可を作成する設定コマンド
    - sam pipeline init
      - CI/CD システムが AWS SAM を使用してサーバーレスアプリケーションをデプロイするために使用可能なパイプライン構成ファイルを生成する初期化コマンド
    - sam pipeline init --bootstrap
      - 上記２つを同時実行するコマンド



### 参考
[AWS CI/CD ホワイトペーパー](https://docs.aws.amazon.com/whitepapers/latest/cicd_for_5g_networks_on_aws/cicd-on-aws.html)


## まとめ・その他。


CI/CD 関係は知識としては知っている感じだったので、割愛気味でした。