Amazon S3とAWS CodeDeployを使用したソースコードをEC2インスタンスにデプロイ


# Amazon S3とAWS CodeDeployを使用したソースコードをデプロイの手順

この技術記事では、Amazon S3とAWS CodeDeployを使用してソースコードをデプロイするプロセスについて説明します。EC2インスタンスが実行中であることを前提とします。
注記：OSは、AmazonLinux３を利用しています。

## 1. セキュリティグループのインバウンドルール設定

次の手順に従ってください：

- EC2インスタンスが使用するセキュリティグループをクリックします。
- "インバウンドルールの編集"をクリックします。
- "ルールの追加"ボタンをクリックし、リストから "HTTPS" を選択してルールを保存します。

## 2. IAMロールにポリシーを追加

EC2インスタンスで使用するIAMロールに次のポリシーを追加する必要があります：

- `AmazonEC2RoleforAWSCodeDeploy`
- `AWSCodeDeployFullAccess`
- `AmazonS3ReadOnlyAccess`

さらに、CodeDeploy用の新しいIAMロールを作成し、次のポリシーを追加する必要があります：

- `AmazonS3FullAccess`
- `AWSCodeDeployRoleForECS`

以下は新しいIAMロールを作成する手順です：

- アイデンティティおよびアクセス管理（IAM）コンソールに移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584656/e15da17c-69c9-abb7-ee75-6a63ebd2343e.png)
- "Roles"をクリックします。
- "Create role"をクリックします。
- 信頼されるエンティティのタイプを "AWSサービス" に設定し、使用ケースを "CodeDeploy" に設定します。
- "次へ"をクリックし、ロール名を入力し、"ロールの作成"ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584656/039295e3-b454-7c9f-bd4d-a3b704556f1f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584656/43b9de5e-417b-370f-1d6d-99b567bde07d.png)
ロールを作成した後、上記のポリシーを追加してください。
![Screenshot 2023-11-09 at 17.31.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584656/582268b4-45ef-eac6-b940-c2704394a696.png)

## AWS CodeDeploy エージェントのインストール

EC2インスタンスにRubyがインストールされていることを確認してください。次のコマンドを使用して確認できます：

```bash
ruby -v
```

Rubyがインストールされていない場合は、次のコマンドを使用してインストールできます：

```bash
sudo yum install -y ruby
```

AWS CodeDeployエージェントをインストールするには、次のコマンドを使用してください。EC2インスタンスに応じてリージョン名を適切に置き換えてください：

```bash
wget https://aws-codedeploy-RegionName.s3.RegionName.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto
```

AWS CodeDeployエージェントが実行されていることを確認するには、次のコマンドを実行します：

```bash
sudo service codedeploy-agent status
```

エージェントが実行されている場合、"The AWS CodeDeploy agent is running"のようなメッセージが表示されます。エージェントが実行されていない場合は、次のコマンドを使用してサービスを起動します：

```bash
sudo service codedeploy-agent start
```

## S3バケットの作成

S3バケットを作成するには、次の手順に従ってください：

- Amazon S3のダッシュボードに移動します。
- "バケットの作成"ボタンをクリックします。
- バケットに一意で説明的な名前を指定してください。
- バケットを作成したいAWSリージョンを選択します。AWS CodeDeployアプリケーションとデプロイメントグループが配置されているリージョンと一致することが重要です。
- バージョニング、ログ記録、およびタグなどのオプションを要件に合わせて設定できます。
- "作成"ボタンをクリックしてS3バケットを作成します。

## appspec.yml ファイルの作成

`appspec.yml` ファイルを作成するには、プロジェクトのルートフォルダに移動し、以下の内容をコピーしてください：

```yaml
version: 0.0
os: linux
files:
  - source: /backend
    destination: /var/www/backend
```

このファイルでは、デプロイの詳細を設定できます：

- `version`: デプロイのバージョンを指定します。
- `os`: デプロイ先のオペレーティングシステムを指定します。
- `files`: ファイルのコピー元とコピー先を設定します。例えば、 `/backend` フォルダから `/var/www/backend` にファイルをコピーします。
- `hooks`: デプロイの各段階で実行するスクリプトを設定できます。スクリプトの場所、タイムアウト時間、実行ユーザなどを指定できます。
```
hooks:
    AfterInstall:
      - location: scripts/AfterInstall-base.sh
       runas: ec2-user
```

このファイルを適切に設定し、必要に応じて他のライフサイクルフックを追加できます。また、`AfterInstall-base.sh` ファイルが存在することを確認してください。

この `appspec.yml` ファイルは、AWS CodeDeployがデプロイプロセスを制御し、ファイルの配置、スクリプトの実行などを管理するのに役立ちます。デプロイの詳細を設定するための重要なファイルです。

## 圧縮してS3にアップロード

ターミナルを開いてプロジェクトのルートフォルダに移動し、次のコマンドを使用してZIPファイルを作成します：

```bash
zip -rq backend.zip .
```

ZIPファイルをS3バケットにアップロードします。

## AWS CodeDeployアプリケーションとデプロイメントグループの作成

次の手順に従ってAWS CodeDeployアプリケーションとデプロイメントグループを作成します：

- AWS CodeDeployページに移動します。
- "デプロイ"をクリックし、"Applications"をクリックします。
-![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584656/3a623047-5636-dd0b-77fd-cd12f36db8c6.png)

- "Create application"をクリックし、アプリケーションに意味のある名前を指定します。
- コンピュートプラットフォームを "EC2/On-Premises"
- コンピュートプラットフォームを "EC2/On-Premises" に設定し、"Create application"をクリックします。

次に、"Create deployment group"をクリックし、次の設定を構成します：

- デプロイメントグループ名: デプロイメントグループに説明的な名前を付けます。
- サービスロール: CodeDeploy用に作成したIAMロールを選択します。
- デプロイメントタイプ: "In-place" を選択します。
- 環境構成: "Amazon EC2インスタンス" をチェックし、ソースEC2インスタンスを選択します。
- AWS Systems Managerとのエージェント構成: "Never"
- デプロイメント設定: "CodeDeployDefault.AllAtOnce"
- ロードバランサー: "Enable load balancing" の選択を解除します（デプロイ後にロードバランシングを設定できます）。
"デプロイメントグループ作成"をクリックします。
![Screenshot 2023-11-09 at 17.15.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584656/89543fdb-39b1-8dbc-9d2f-61752c87b5e1.png)![Screenshot 2023-11-09 at 17.16.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584656/75a8d724-d7a3-48f5-dc1f-b329f727cfc9.png)
![Screenshot 2023-11-09 at 17.16.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584656/ae4d8822-3e4a-f9dc-9056-7ddc5338a8b0.png)

デプロイメントグループを作成したら、"デプロイメントの作成"をクリックしてデプロイメントを作成します。次の設定を構成します：

- デプロイメントグループ: 作成したデプロイメントグループを選択します。
- リビジョンタイプ: "My application is stored in Amazon S3" を選択します。
- リビジョンの場所: アップロードしたS3のZIPファイルのURLを貼り付けます。
![Screenshot 2023-11-09 at 17.49.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584656/25f29c06-bd27-6628-2a6c-0e9c2fe904c6.png)

"デプロイメントの作成"をクリックしてデプロイメントの作成を完了します。
![Screenshot 2023-11-09 at 17.52.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3584656/9ed3354a-9b54-21f3-80a2-31a94b9d722e.png)
デプロイメントを作成したら、ライフサイクルイベントからデプロイメントのステータスを監視できます。