はじめてのECS（dockerをECSにプッシュしてS3の画像を表示）

ECSを触っていなかったので慣れる&学習するために実際に作業してみました

# やること
NginxのDockerコンテナを作ってECSに登録、プロキシでS3に登録した画像を表示する

## 事前準備
- AWSアカウントを作成する

## やったこと

### cliのインストール
- [AWS CLI](https://aws.amazon.com/jp/cli/)

AWSの設定やS3への画像アップロードなど色々なことができるやつです。入っていなかったのでインストールします
`pip`が入っていない場合はそこからインストールします

```sh
pip install awscli
aws configure
...(略)...
```

ここで設定する`AWS Access Key ID`と`AWS Secret Access Key`はAWSコンソールの`IAM>ユーザー>{ユーザー名選択}>認証情報タブ>アクセスキーの作成`で作成することができます

- [ECS CLI](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ECS_CLI.html)

ECSを色々するやつです
macユーザですが、[公式の手順](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ECS_CLI_installation.html)通りに作業してすんなりインストールできました。長いので省略します

### S3へ画像アップロード
アップロード方法については検索すると分かりやすいサイトがたくさん出てきますので省略します。パーミッションの設定については、Everyoneのオブジェクトの一覧とバケットのアクセス権限の読み取りを「はい」に設定しました

### Dockerイメージの作成

nginxの`default.conf`を作成します。`proxy_pass`にはS3にアップロードしたファイルのパスを設定します

```conf
server {
    listen       80;
    server_name  localhost;

    location / {
        proxy_pass https://s3-ap-northeast-1.amazonaws.com/{バケット名}/path/to/image;
    }
}
```

Dockerfileを作成し、上記default.confと同じ階層に配置します

```dockerfile
FROM nginx
COPY default.conf /etc/nginx/conf.d/default.conf
```

Dockerイメージを作成します

```sh
docker build -t dog .
```

ローカルで画像が表示されるか確認します

```sh
# 起動 dogイメージからdogコンテナを作って起動
docker run -d -p 80:80 --name dog dog
# 起動確認
docker ps
# 以下が表示された
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                    NAMES
73ffbefe8032        dog                 "nginx -g 'daemon of…"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp       dog
```
`PORTS`に記載された`0.0.0.0:80`にアクセスしてS3にアップロードした画像が表示されるか確認します
自分の場合はじめは`NoSuchKey`エラーが表示されましたが、`default.conf`に設定した`proxy_pass`とS3バケットのアクセス権限を見直し修正を行ったところ、無事表示されました

起動したコンテナからイメージを作成します

```sh
docker commit {コンテナID} dog:latest
```

### ECRへpush
まずリポジトリを作成します。コンソール上でも`ECR>リポジトリ`で作成されたことが確認できます

```sh
aws ecr create-repository --repository-name dog
# 返却値
{
    "repository": {
        "repositoryArn": "arn:aws:ecr:ap-northeast-1:{id}:repository/dog",
        "registryId": "{id}",
        "repositoryName": "dog",
        "repositoryUri": "{id}.dkr.ecr.ap-northeast-1.amazonaws.com/dog",
        "createdAt": xxxxxxxxxx.0
    }
}
```

Dockerイメージにプッシュ用のタグをつけます

```sh
# パスは上記リポジトリ作成時に返却された値の`repositoryUri`
docker tag dog {id}.dkr.ecr.ap-northeast-1.amazonaws.com/dog
```

プッシュするためにログインを行います。このあたりの手順は`ECR>プッシュコマンドの表示`でコマンドを表示してくれるので、その通りにやればOKです

```sh
# ログインコマンドを取得
aws ecr get-login --no-include-email
#　以下が返却されるのでコピーしてペッとする
docker login -u AWS -p {長い長い長い文字列} https://{id}.dkr.ecr.ap-northeast-1.amazonaws.com
#　プッシュ
docker push {id}.dkr.ecr.ap-northeast-1.amazonaws.com/dog
```

### クラスターの作成

ここから先はAWSコンソールで作業しました

[ドキュメント](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/create_cluster.html)にしたがってクラスターを作成しました。選択したクラスターテンプレートは`ネットワーキングのみ`です。

### タスクの作成
作成したクラスターを選択し、`タスク>新しいタスクの実行`から[ドキュメント](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs_run_task.html)にしたがってタスクを作成します。選択した起動タイプは`FARGATE`です

### 表示確認
`クラスター>タスク`でステータスがRUNNINGになったら表示確認が可能です
RUNNINGになるまで時間がかかることもあります
タスクを選択すると詳細画面の`Network>Public IP`で自動で割り振られたIPが確認できます
ブラウザからアクセスして無事に画像が表示されることを確認しました
わーい

## 感想と宿題
- 作業内容は簡単なのにパーミッションやconf等の設定まわりで手間取って疲れました
- S3のライフサイクル等の設定はなんとなくな状態なのできちんと理解したいです
- 途中からコンソールを直接いじってしまったので、ecs-cliで同じ作業ができるようにします