EB CLIを使って、Elastic Beanstalkでコンテナを動かす

# はじめに
前回、Elastic Beanstalkをコンテナから作ることを、コンソールから行いました。

https://qiita.com/a_b_/items/351b4442e676e3c46380

今回はEC CLIから行ってみました。


# 概要

- 以下の2つの手法がある。
    - ECRにコンテナをPUSHし、URIを記載した設定ファイル`Dockerrun.aws.json`を、Elastic Beanstalkに渡して実行
    - Dockerファイルやソースファイルを直接使用
- 今回は公式のサンプルと、いつも作ってるplumberのコンテナの2つをデプロイする。
    - サンプルは、Dockerファイルやソースファイルを直接使用
    - plumberのコンテナは、Elastic Beanstalkのデプロイ中にビルドするとタイムアウトになるため、ECRにPUSHする方法を使用


# やってみた

環境はCloud9(t3.small)でやっています。

```
$ python -V
Python 3.7.16
```
Pythonのバージョンは以下には3.11とありますが、`eb local run`以外は動きましたので、3.7で続けていきます。

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb-cli3-install-advanced.html

:::note warn
Pythonを3.11に上げるとEB CLIがインストールできませんでした。Cloud9の問題かもしれませんので、実行される方は確認ください。
:::


## IAMロール、インスタンスプロファイル
Elastic BeanstalkのIAMロールを用意しておきます。

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

自動で作られているかもしれませんが、なければ上記のページを参考に作成します。

- 信頼関係
    - elasticbeanstalk.amazonaws.com
- ポリシー
    - AWSElasticBeanstalkManagedUpdatesCustomerRolePolicy
    - AWSElasticBeanstalkEnhancedHealth
- 名前
    - aws-elasticbeanstalk-service-role

EC2のインスタンスプロファイルは、前回と同様に作成します。

https://qiita.com/a_b_/items/351b4442e676e3c46380#iam%E3%83%AD%E3%83%BC%E3%83%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%83%97%E3%83%AD%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E4%BD%9C%E6%88%90


## EB CLIのインストール
以下のページにインストールの方法があります。

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb-cli3-install-linux.html

```bash
pip install --upgrade pip
pip install awsebcli --upgrade --user

eb --version
```

## サンプルを実行
まず、以下のページのサンプルを実行してみます。

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/docker.html

フォルダとファイルを作ります。ファイルの中身は上記ページにあるコードをコピーします。
```
mkdir eb-docker-flask && cd eb-docker-flask
touch Dockerfile
touch application.py
```

`eb init`でアプリケーションを作成します。この時点でリージョンを指定します。リージョンを指定しないと私の場合はus-west-2に作られました。
```
eb init -p docker sample-app --region ap-northeast-1
```
ローカル実行したかったのですが、以下は動きませんでした。
```
# これはうごかない
eb local run --port 5000
```
環境を構築します。ここで、最初に作成したIAMロールとインスタンスプロファイルを指定します。
- ARNではなく、名前を指定します。
    - pathがある場合は、pathから指定します。
```
eb create sample-env --service-role service-role/aws-elasticbeanstalk-service-role --instance_profile aws-elasticbeanstalk-ec2-role
```
5分くらいでデプロイされます。

URLに`/Thelonious`を付与してアクセスします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/33a4f353-ba3d-be6e-6e87-5dfdf0c75297.png)


### 片付け
以下のコマンドを実行し、環境名を指定することで、環境が削除されます。
```
eb terminate
```

アプリケーションはコンソールから削除しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/8fc66550-10f9-411f-f737-ecbe3ba96697.png)


## ECRのコンテナを実行
いつも使っている以下のplumberのコンテナを動かします。

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

前回、zipで固めたファイル群から構築しようとした際ビルドでタイムアウトになる、と書きました。
これはEB CLIでも同じで、タイムアウトで作成できませんでした。タイムアウトの値を指定する方法もないようでしたので、ECRにPUSHして、それをEB CLIから使ってみます。

前回と同じようにECRにPUSHします。

[コンテナをBuildしてPUSH](https://qiita.com/a_b_/items/351b4442e676e3c46380#%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%82%92build%E3%81%97%E3%81%A6push)

次はイメージを作ったフォルダとは別の場所を作って作業します。

```
cd ..
mkdir test-plumber-app && cd test-plumber-app 
touch Dockerrun.aws.json
```

`Dockerrun.aws.json`も、前回と同様に作ります。
[設定ファイル作成](https://qiita.com/a_b_/items/351b4442e676e3c46380#%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E4%BD%9C%E6%88%90)

あとはサンプル作成時と同様に、アプリケーションと環境を作っていきます。

```
eb init -p docker test-plumber-app --region ap-northeast-1

eb create test-plumber-env --service-role service-role/aws-elasticbeanstalk-service-role --instance_profile aws-elasticbeanstalk-ec2-role
```

ヘルスチェックには失敗していますが、環境は作成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/61c73779-2b66-aa9a-8e58-8e1e67f4e6a7.png)

### 接続
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/994665a0-d8fc-da5b-ea3a-0ad581ead6d1.png)

ドメインのURLに`/hello`を追加して確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/65311a7f-203e-aa23-cb43-9d26d371e9d6.png)

その他、`/hello/jiro/21`の場合。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/ad65230f-711d-56b6-1eab-60af79f8aa7c.png)

`/fn?x=2`の場合。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/ed2caf8c-8c47-30b7-95a8-7f14300ef0c0.png)

`/plot`の場合。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/667a0814-ee75-8aa0-da27-743e61c26cc3.png)

### ヘルスチェックパスを指定
ヘルスチェックをOKにするために、以下のページを参考に、ヘルスチェックパスを指定してみます。

https://tech.actindi.net/2022/01/27/083000

```
mkdir .ebextensions
touch .ebextensions/alb.config
```
```:.ebextensions/alb.config
option_settings:
  aws:elasticbeanstalk:environment:process:default: # ヘルスチェック設定
    HealthCheckPath: /hello # ヘルスチェックするパス
```
反映するのは以下のコマンドです。
```
eb deploy
```

正常にデプロイされると、OKになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/159a9f02-14f6-94bb-6b82-8d021dffd939.png)

### 片付け
サンプルの時と同様、以下のコマンドで削除します。
```
eb terminate
```

# おわりに

前回コンソールから行ったことを、EB CLIから行いました。
ビルドのタイムアウト値を伸ばせるかと期待していたのですが、見つけられませんでした。
どなたかご存じの方いらっしゃいましたら、教えていただけると助かります。