AWS ECR/ECS チュートリアルメモ

# AWS ECS チュートリアル

ECS の起動自体は下記のURLの通りで、マウスを何度かカチカチすれば、AWS で用意されているデフォルトコンテナが起動し、Webページを参照できるため、詳細は割愛。

- [AWS Fargate での Amazon ECS の開始方法](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/fargate-getting-started.html)
- [Amazon ECS入門 〜公式のDockerイメージを使って10分で構築してみる〜](https://dev.classmethod.jp/articles/amazon-ecs-entrance-1/)
- [[初心者向け]コンテナのメリットをおさらいしながら、Amazon ECSでお手軽サービス作成してみた](https://dev.classmethod.jp/articles/ecs-beginner-tutorial/)

# オリジナルコンテナを使用する

## 作業流れ

1. AWS CLI 利用ユーザの追加
2. Docker実行環境で コンテナイメージを作成する  
  AWS EC2 に Docker をインストールしても良いし、オンプレで Docker 環境を用意するでもOK。
3. 作成したイメージを [Amazon Elastic Container Registry(AWS ECR)](https://aws.amazon.com/jp/ecr/) に登録  
    - この作業は GUI が用意されていないかもしれない。
    - aws-cli で Private / Public リポジトリを作り分ける方法がわからなかった。。。

4. AWS ECR に登録したコンテナイメージから AWS ECS クラスタ作成
5. AWS ECS の撤収
6. AWS ECR の撤収


## 1. AWS CLI 利用ユーザの追加

AWS ECS 利用ユーザに付与するポリシーについては、[Amazon Elastic Container Service アイデンティティベースのポリシーの例](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/security_iam_id-based-policy-examples.html) に IAM 管理ポリシーの内容っぽい設定例が紹介されている。が、~~使い方よくわからない~~ 設定が面倒そうなので、[Amazon ECS でのセットアップ](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/get-set-up-for-amazon-ecs.html#create-an-iam-user) のところで、ルートユーザ的な権限を付与する方法が紹介されていたので、それで IAM 管理ポリシー問題を、一旦、回避。


## 2. Dcoker コンテナイメージの作成

- Dockerfile の準備

    ```Dockerfile:Dockerfile
    FROM ubuntu:18.04

    # Install dependencies
    RUN apt-get update && \
    apt-get -y install apache2

    # Install apache and write hello world message
    RUN echo 'Hello Work...orz' > /var/www/html/index.html

    # Configure apache
    RUN echo '. /etc/apache2/envvars' > /root/run_apache.sh && \
    echo 'mkdir -p /var/run/apache2' >> /root/run_apache.sh && \
    echo 'mkdir -p /var/lock/apache2' >> /root/run_apache.sh && \ 
    echo '/usr/sbin/apache2 -D FOREGROUND' >> /root/run_apache.sh && \ 
    chmod 755 /root/run_apache.sh

    EXPOSE 80

    CMD /root/run_apache.sh
    ```

- イメージ作成

  ```bash
  $ docker build -t hello-work .
  ```

- 動作確認

  ```bash
  $ docker run -t -i -p 80:80 hello-work
  ```
  確認が終わったら `Ctrl+c` でコンテナを停止します。


## 3. AWS ECR への登録

1. awscli のインストール

    ```bash
    $ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \
        unzip awscliv2.zip && \
        sudo ./aws/install
    $ echo 'complete -C aws_completer aws' >> $HOME/.bashrc
    ```

    $HOME/.barhrc のような感じで、aws_completer を設定しておくと、aws コマンドのサブコマンドで tab 補完が使えるようになります。

2. awscli の初期設定

    ```bash
    $ aws configure
    AWS Access Key ID [None]: {アクセスキー(各自)}
    AWS Secret Access Key [None]: {シークレットアクセスキー(各自)}
    Default region name [None]: ap-northeast-1
    Default output format [None]: json
    ```

    AWSのアカウントが複数ある場合は、`aws configure --profile userid` で、ユーザIDごとに設定できます。

3. AWS ECR リポジトリの準備

    1. AWS ECR リポジトリ作成

        ```bash
        $ aws ecr create-repository --repository-name hello-repository
        ```

        AWS CLI で作る ECRリポジトリはプライベートリポジトリっぽいです。Private/Public を切り替えるサブコマンドが見つからなかった。
        この辺は、リポジトリ作った後に Private/Public を確認したほうがいいかもです。  

        リポジトリが作成されると、リポジトリの登録情報が表示されます。その中で、`repositoryUri` の情報を控えておきます。

    2. コンテナイメージのタグ付け

        3.1 で控えておいた `repositoryUri` で、コンテナイメージにタグ付けをします。

        ```bash
        $ docker tag hello-work <repositoryUri>
        ```

4. AWS ECR にコンテナを登録

    ```bash
    $ aws ecr get-login-password | docker login --username AWS --password-stdin <aws_account_id.dkr.ecr.region.amazonaws.com>
    $ docker push <repositoryUri> 
    ```

    `docker login` で指定する URL は ドメイン のところだけで、リポジトリ名までは含めません。
    ドメインで認証して、ドメイン内のリポジトリを指定して push する、という感じです。

## 4. AWS ECS クラスタ作成

- コンテナの定義
  - `custom` の 設定 ボタン押下

| 項目       | 設定値                     |
|:-----------|:---------------------------|
| コンテナ名 | 適当                       |
| イメージ   | repositoryUri:イメージタグ |
| メモリ     | 128 MB                     |
| TCPポート  | 80                         |
| 詳細コンテナ設定 | デフォルト（何も設定しない）のまま |

- サービスを定義する
  - ロードバランサーの種類
    - Application Load Balancer を選択

ロードバランサーに ALB を指定しないと プライベートIP、パブリックIP がセットされなかった。
カスタムコンテナの場合は ALB 無しの運用はできないのだろうか。。。

# 5. AWS ECS の撤収作業

- AWS ECS
  - クラスター
    - 作成したクラスター名を選択
      - 作成したクラスターの詳細画面の `クラスターの削除` ボタンを押下
        - `delete me` を入力して `削除` ボタン押下

CloudFormation の方から削除する方法もあるらしい。

# 6. AWS ECR の撤収作業

Amazon ECR イメージの試用を終了したら、レポジトリを削除し、イメージストレージに対して課金されないようにします。

```aws
$ aws ecr delete-repository --repository-name hello-repository --force
```

# 参考サイト

- AWS公式
  - [Amazon Elastic Container Service とは](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/Welcome.html)
    - [AWS ECSの料金](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/Welcome.html#welcome-pricing)
  - [Amazon ECS における Docker の基本](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/docker-basics.html)
  - [Docker コンテナのデプロイ](https://aws.amazon.com/jp/getting-started/hands-on/deploy-docker-containers/)

- AWS CLI
  - [AWS CLI v2のコマンド補完を有効にする](https://qiita.com/charon/items/3788ea6d48adc23ae1dd)

- ハンズオン
  - [Amazon ECR + ECS CLI ハンズオン](https://qiita.com/zakky/items/be1e1a20cf7718ffae73)