AWS CodeDeployについてまとめてみた

# はじめに
AWS CodeDeployについて理解を深めるためにまとめてみました。

# AWS CodeDeployとは
![名称未設定.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2860566/3567fdb9-eb0f-cea9-15d2-e95b983fe2b8.png)

アプリケーションを構成するファイル群の**デプロイを自動化**するサービス
以下の特徴があります。
- フルマネージドでソフトウェアのデプロイを自動化
- Amazon EC2、AWS Lambda、オンプレミス サーバー、コンテナへの自動的なデプロイメント
- アプリケーションの複雑なアップデートの実施
- アプリケーションのデプロイ中のダウンタイムを回避
- エラーを検知すると自動的にロールバックを実行

## 主要コンポーネント
- ### アプリケーション
    - デプロイするアプリケーションを一意に識別する名前
- ### コンピューティングプラットフォーム
    - #### アプリケーションがデプロイされるプラットフォーム
        - EC2/オンプレミス
        - AWS Lambda
        - Amazon ECS
- ### デプロイグループ
    - デプロイ環境の定義
    - Auto Scalingグループ
    - タグのグループ
        - EC2インスタンス
        - オンプレミスインスタンス
    - ECSサービス
- ### デプロイタイプ
    - EC2の場合**In-Place**もしくは**Blue/Green**
    - Lambda、ECSの場合は**Blue/Green**

:::note info
**In-Place Deploy(インプレイスデプロイ)**
既存のインフラストラクチャやリソース上に新しいバージョンのアプリケーションを直接デプロイする方法
::::

:::note info
**Blue/Green Deploy(ブルー/グリーンデプロイ)**
新しいバージョンのアプリケーションを既存の環境（Blue）とは別の環境（Green）にデプロイし、切り替えることでデプロイメントを行う方法
::::
- ### デプロイ設定
    - どのようにデプロイするかを定義したもの
    - デプロイする割合やデプロイ成功、失敗の条件が異なる
    - 独自のデプロイ設定を作成することも可能
- ### リビジョン
    - ####  EC2
        -  ソースコード、Webページ、スクリプト等と AppSpec ファイルをまとめたアーカイブ
    - #### Lambda
        - Lambda デプロイ用の AppSpec ファイル
    - #### ECS
        - ECS デプロイ用の AppSpec ファイル
:::note info
**AppSpecファイル（Application Specification File）**
AWS CodeDeployを使用してアプリケーションをデプロイする際に使用される設定ファイル

```記入例.yaml
version: 0.0
Resources:
  - TargetService:
      Type: AWS::ECS::Service
      Properties:
        TaskDefinition: "arn:aws:ecs:us-east-1:111222333444:task-definition/my-task-definition-family-name:1"
        LoadBalancerInfo:
          ContainerName: "SampleApplicationName"
          ContainerPort: 80
# Optional properties
        PlatformVersion: "LATEST"
        NetworkConfiguration:
          AwsvpcConfiguration:
            Subnets: ["subnet-1234abcd","subnet-5678abcd"]
            SecurityGroups: ["sg-12345678"]
            AssignPublicIp: "ENABLED"
        CapacityProviderStrategy:
          - Base: 1
            CapacityProvider: "FARGATE_SPOT"
            Weight: 2
          - Base: 0
            CapacityProvider: "FARGATE"
            Weight: 1
Hooks:
  - BeforeInstall: "LambdaFunctionToValidateBeforeInstall"
  - AfterInstall: "LambdaFunctionToValidateAfterInstall"
  - AfterAllowTestTraffic: "LambdaFunctionToValidateAfterTestTrafficStarts"
  - BeforeAllowTraffic: "LambdaFunctionToValidateBeforeAllowingProductionTraffic"
  - AfterAllowTraffic: "LambdaFunctionToValidateAfterAllowingProductionTraffic"
```
[AppSpecファイル例](https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/reference-appspec-file-example.html) より引用
:::

- ### ターゲットリビジョン
    - リポジトリにアップロードした直近のリビジョン
    - デプロイグループへデプロイする対象
    - 自動デプロイで取得されるリビジョン

:::note info
**ターゲットリビジョン**
デプロイ対象となるアプリケーションの特定のバージョンを指す。
:::

- ### サービスロール
    - CodeDaployに付与するIAMロール
    - CodeDaployからAWSリソースを操作するために必要
    - 管理ポリシー
        - AWSCodeDeployRole
        - AWSCodeDeployRoleForLambda
        - AWSCodeDeployRoleForLambdaLimited 
        - AWSCodeDeployRoleForECS
        -  AWSCodeDeployRoleForECSLimited
- ### IAMインスタンスプロファイル
    - EC2インスタンスに付与するIAM ロール
    - S3から配布物を取得できるようにする



# 参考記事
- [[AWS Black Belt Online Seminar]AWS CodeDeploy](https://pages.awscloud.com/rs/112-TZM-766/images/20210126_BlackBelt_CodeDeploy.pdf)
- [AWS再入門ブログリレー2022 AWS CodeDeploy 編](https://dev.classmethod.jp/articles/re-introduction-2022-codedeploy/)
- [AppSpecファイル例](https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/reference-appspec-file-example.html)