Elastic Beanstalkで、ECRにPUSHしたコンテナを動かす

# はじめに

色々なサービスを使って、コンテナにしたplumberを動かしていましたが、今回はElastic Beanstalkを使いました。

# 概要

- ECRにコンテナをPUSHし、URIを記載した設定ファイル`Dockerrun.aws.json`を、Elastic Beanstalkに渡して実行します
    - Dockerファイルやソースファイルをzipでまとめて、それを渡す方法もあります
        - 今回作るplumberのコンテナは、ビルドに時間がかかってzipの方法ではタイムアウトになるため、ECRにPUSHする方法を使いました。

# やってみた

## IAMロール、インスタンスプロファイル作成

まず、Elastic Beanstalkで実行するEC2用のインスタンスプロファイルを作成します。

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/iam-instanceprofile.html

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/concepts-roles-instance.html

またECRにアクセスするポリシーも付与する必要があります。

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/create_deploy_docker.container.console.html#docker-images

> ただし、環境のインスタンスプロファイルにアクセス権限を付与することによって、Amazon ECR リポジトリのイメージにアクセスする権限をインスタンスに付与する必要があります。AmazonEC2ContainerRegistryReadOnly 管理ポリシーをインスタンスプロファイルにアタッチして、アカウントのすべての Amazon ECR リポジトリに対する読み取り専用アクセス権限を付与するか、

いつもはCloudformationで作成しますが、インスタンスプロファイル名が指定できないので、コンソールから作りました。

- 信頼関係
    - EC2
- ポリシー
    - AWSElasticBeanstalkWebTier
    - AWSElasticBeanstalkWorkerTier
    - AWSElasticBeanstalkMulticontainerDocker
    - AmazonEC2ContainerRegistryReadOnly
- 名前
    - aws-elasticbeanstalk-ec2-role

## コンテナをBuildしてPUSH

t3.smallくらいのCloud9を用意して、以下のページの手順の一部を行いコンテナを作成し、ECRにPUSHします。

- ディレクトリ・ファイル作成
- イメージのBuild
- コンテナイメージを、ECR にアップロードする

https://qiita.com/a_b_/items/32cbc21bd140321719c2#%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E4%BD%9C%E6%88%90





## 設定ファイル作成

以下のページの **Docker プラットフォームの設定 (Docker Compose なし)** を参考に、`Dockerrun.aws.json`を作成します


https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/single-container-docker-configuration.html

```json:Dockerrun.aws.json
{
    "AWSEBDockerrunVersion": "1",
    "Image": {
      "Name": "account-id.dkr.ecr.us-east-2.amazonaws.com/repository-name:latest"
    },
    "Ports": [
      {
        "ContainerPort": 80
      }
    ]
}
```

Image - Name に指定する文字列は、先のサイトの手順で作成したのであれば、以下のコマンドでURIを取得できます。

```
echo `aws cloudformation describe-stacks --stack-name ${STACKNAME} --query "Stacks[].Outputs[?OutputKey=='RepositoryUri'].[OutputValue]"  --output text`:latest
```

## Elastic Beanstalk実行

ではElastic Beanstalkを作っていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/e4d86827-35e8-2f9d-2115-d572718b81f4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/31005a8b-a01b-7c4d-201b-052e5feda595.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/458a9fa2-dbf5-14d0-2079-e23204c80a25.png)

プラットフォームはDokcerを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/520751ab-d4c3-caf4-7d55-7e0fd5827716.png)

コードで`Dockerrun.aws.json`を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/ff7acd0b-f6fb-16a2-d05a-87ec48b11b4b.png)

確認するだけなので、単一インスタンスで十分です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/1e258633-0895-a52d-489e-60aeeba4d588.png)

ロールを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/da47d0a9-00ac-871d-0ce0-b7393c662b21.png)

こだわりが無ければ　レビューまでスキップ　します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/ce78c821-58df-8cd7-f534-22d5feb90bdc.png)

送信　で作成開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/4b387c59-6adc-f65d-b180-d23ebdbebc4f.png)

ヘルスがOKになれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/4e7e367f-ef53-aade-ee0c-e11b835a5b4e.png)

## 接続

ドメインのURLに`/hello`を追加して確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/6ad39c63-7b4a-719e-1c10-45facf4ec69e.png)

その他、`/hello/jiro/21`の場合。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/c17deb35-eb94-4e61-a8e1-a08e04c0def6.png)

`/fn?x=2`の場合。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/8388184e-45b1-2b2c-a26c-80a2ee8d1a57.png)

`/plot`の場合。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/2add7696-e989-f061-e7e3-8105bceb9319.png)

動いているようですね。

# おわりに

今回はElastic Beanstalkにコンテナを使ってみました。
ソース群をzipに固めた方が楽ではありますが、アプリが複雑になればbuildに要する時間が増え、タイムアウトを超える恐れを考えると、最初からECRを用いた方法を使った方が良いかもしれません。
この記事がどなたかのお役に立てれば幸いです。