【AWS】Rails6で作られたWebアプリをCircleCIを使いECR・ECSへ自動デプロイする方法①下準備編【コンテナデプロイ】

今回個人開発で制作したRailsアプリをCircleCIを使いコンテナデプロイさせることに成功したので、備忘録としてこちらに記載させていただきます。（またReadmeなど整い次第、実際のアプリも別記事で紹介させていただきます。）

こちらですが、長くなってしまったので記事を分けて書いていってます。

| タイトル|
|:-----------|
| [① 下準備編](https://qiita.com/Kiyo_Karl2/items/5f77d6f59bcddf05c614) **←今ここ！**      | 
| [②-1 インフラ構築編](https://qiita.com/Kiyo_Karl2/items/ddf03ac97ab649b63c1d)        | 
| ②-2 インフラ構築編(執筆中）         | 
| 自動デプロイ編(執筆中）      | 
 

また、現在私はwindows10を利用しており、macの方は適時置き換えて進めていってください。
といってもaws-ecs-cliのインストール方法が異なるぐらいで他は同じだと思います。（windowsだとインストールするのに少し手間がかかりました。）

それと、筆者はAWSのコンソールの言語はあえて英語で設定しているので、英語で設定していただいた方が本記事は進めやすいと思います。
（AWS CLIのコマンドの名前とコンソールの英語表記が一致するので、お勧めです。）

# 対象となる人
- AWSのアカウントを持っている人
- すでにDocker化されたRailsアプリがあり、インフラにAWSや、CI/CDツールを取り入れることにチャレンジしたい人
- 就活のポートフォリオとして上記の技術を取り入れたい人
- AWSに興味がある人
- macばっかでwindowsの記事がなくて困っている人

# 前提知識
- VPC、サブネットなどインフラに関する基礎知識
- CircleCI、Dockerの基礎知識

# 本記事で目指す構成

![Untitled Diagram-Copy of Page-1 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632678/86ae13be-7525-7a05-328a-225e5769e187.png)


上記のような構成を目指します。

実際の流れを言葉で説明すると、

①Githubにpush(masterブランチ以外のときは自動テストとRubocopだけ実行される。)
②CircleCIがpushを検知して、ビルドを開始する。
③RSpecとRubocopをパスしたら、dockerイメージがビルドされ、ECRへpushされる。
④最新のDockerイメージを使い、ECSのタスク定義（ほぼdockerコンテナの起動方法を定義したもの、docker-compose.ymlみたいなものです）を更新する。
⑤EC2インスタンスが起動され、デプロイ完了。

また、実際作成した個人開発アプリではRoute53とACMを用いたSSL化ももちろん行っており、こちらでかなり苦労したので別記事としてまた書こうと思います。SSL化は実運用する上では必須なので必ずやりましょう。

# 環境
- windows10 Pro
- Rails: 6.0.3.2
- ruby: 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]
- Docker for windows
- MySQL 5.7
- nginx:1.15.8
- puma:4.3.5

# 下準備
下準備編では、主に4つのことをやります。

- ツールのインストール
- IAMユーザーを作成し、実行権限（ポリシーといいます）の付与
- aws configureの設定
- キーペアの作成

### ツールをインストールする
以下の2つをインストールします。

- awscli
- aws-ecs-cli

windowsの方は[こちらの記事](https://blog.codecamp.jp/wordpress-aws-docker-windows)を参考に進めていけばインストールできると思います。私はこの通りにやってインストールできました。

これらのツールを使うことによってターミナルからVPC、サブネット、クラスターの作成、ECRへのpush、タスクの再定義などがいちいちコンソールをぽちぽちしなくても出来るようになります。

###　IAMを作成する
コンソールにログインして、service を選択し、IAMと検索しクリック。
![スクリーンショット 2020-11-15 234007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632678/3cad003f-27f1-a66e-6fb8-e410a8813b9b.png)
Usersをクリックし、Add user をクリック
![スクリーンショット 2020-11-15 234204.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632678/a456ca67-aa07-6def-4bf6-a69c4ed03c20.png)
一番右のAttach existing policiesをクリックし、以下の2つのポリシーをアタッチする。

- AmazonECS_FullAccess
- AmazonEC2ContainerRegistryFullAccess

![スクリーンショット 2020-11-15 234511.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632678/8f32fbf9-9af2-1dac-b053-5bd504a22607.png)
確認画面で設定した通りにアタッチできているのが確認出来たら、Create userをクリック
![スクリーンショット 2020-11-15 234545.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632678/5030ce69-b2ea-cf94-7176-dd2a6b593cc1.png)
すると、次画面でアクセスキーとシークレットキーが作成されます。csvでダウンロードみたいなボタンが表示されると思うので、それをクリックするなどして、情報を保存します。

**シークレットアクセスキーを誤ってgitにpushしてしまい、何百万もの請求がAmazonから来た例もあるようなので、取り扱いには十分気を付けましょう。**

### ポリシーを追加する（権限付与）
- AmazonECS_FullAccess
- AmazonEC2ContainerRegistryFullAccess

さきほど、こちらのポリシーを付与しましたが、これだけではecs-cliのコマンドを実行するときに権限周りでエラーが発生してしまうので、別途追加していきます。

IAMのコンソールから、Policiesを選択し、Create Policiesを選択します。
画面にあるJsonタブをクリックし、以下のコードを入力してください。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "iam:AttachRolePolicy",
                "iam:AddRoleToInstanceProfile",
                "iam:CreateInstanceProfile",
                "iam:CreateRole",
                "iam:DeleteInstanceProfile",
                "iam:DeleteRole",
                "iam:DetachRolePolicy",
                "iam:PassRole",
                "iam:RemoveRoleFromInstanceProfile",
                "ec2:DeleteInternetGateway",
                "ec2:DeleteSecurityGroup",
                "ec2:DeleteRouteTable"
            ],
            "Resource": "*"
        }
    ]
}
```

入力したら、Review policyをクリックします。
![スクリーンショット 2020-11-16 014135.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632678/dabb774a-c55f-4f4e-0ee3-c56426377a22.png)
任意の名前と説明を入れ、Create policyをクリックします。
![スクリーンショット 2020-11-16 014335.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632678/2b4282e4-430e-0c78-2f16-4b9b0b65e3d1.png)

次に、作成したIAMユーザーに↑で新しく作成したポリシーを付与します。
Usersをクリックし、Add permissionsをクリック
![スクリーンショット 2020-11-16 015106.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632678/28ea29f9-1dbc-7dae-c056-008bb4394cc6.png)
Attach existing policies directlyをクリックし、先ほど作成したポリシーを選択
![スクリーンショット 2020-11-16 015146.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632678/7243501f-71fb-2217-8b59-34e4ee1e9829.png)
確認画面で、正しいポリシーが選択できていたらAdd permissionsをクリックします。
![スクリーンショット 2020-11-16 015207.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632678/f5fe364c-c324-c533-75cd-23db909930a6.png)

### ターミナルで「aws configure」を実行する
aws configureを--profileオプションを付けてターミナルで実行します。
実行すると対話形式で聞いてきますのでひとつずつ正確に入力しましょう。

```
$ aws configure --profile 作成したユーザー名

AWS Access Key ID # 作成したときのアクセスキー
AWS Secret Access Key # 作成したときのシークレットアクセスキー
Default region name # ap-northeast-1 
Default output format # json 
```

aws configure を実行するとホームディレクトリ配下に.awsディレクトリが自動生成され、そこにアクセスキーなどの情報が以下のような感じで保管されますので、確認してみてください。（完全に一緒にはならないかも）

```~/.aws/credentials
[ユーザー名]
aws_access_key_id=AKIAIOSFODNN7AJDIFK
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/gkjkAKJDKJ
[default]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
```

```~/.aws/config
[profile ユーザー名]
region = ap-northeast-1
output = json
[default]
region = ap-northeast-1
output = json
```

### キーペアの作成
続いてキーペアの作成を行っていきます。

Service→EC2コンソール→key pair→Create key pairを選択し、適当なキーペア名を入力します。
ファイルの拡張子は.pemを選択し、Create key pairをクリックします。
![スクリーンショット 2020-11-16 022846.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632678/94912540-3034-ca7e-6fdb-5896fd2e69cc.png)

完了すると.pemファイルが自動でダウンロードされるので、以下のコマンドを実行し、「.ssh」ディレクトリに移動して権限を変更します。

```
$ mv Downloads/sample-app.pem .ssh/
$ chmod 600 ~/.ssh/sample-app.pem
```

**以上で下準備編は完了です！お疲れ様でした！**
続きは[インフラ構築編②-1](https://qiita.com/Kiyo_Karl2/items/ddf03ac97ab649b63c1d)へお進みください！

## 最後まで読んでいただきありがとうございます！
かなり長い記事になってしまったので、記載ミス等、何かご指摘などあればコメントいただけますと幸いです。