Elastic Beanstalkでアプリケーションだけ作る（ついでにワーカー環境も作る）

# はじめに

自動で構成を良しなにしてくれるAWSのElastic Beanstalk。ウェブサーバー環境とワーカー環境の2種類があるのですが、最初触ったときはアプリケーション作成と同時にウェブサーバー環境も作成されてしまい、ワーカー環境だけ作りたいのに…と思っていました。

今回（ウェブサーバー環境を作らずに）アプリケーションだけ作成し、そのあとにワーカー環境を作る方法がわかったので記事にしました。


## かんたんにElastic Beanstalkの構成

”アプリケーション”と”環境”の区別が最初わからなかったので、以下に図示しました。
最初に”アプリーケーション”を作って、その中でウェブサーバーやワーカーの”環境”を作っていく、という構成です。

```mermaid
graph
    subgraph "Elastic Beanstalk"
        subgraph "Application_A"
            Environment_A
            Environment_B
        end
        subgraph "Application_B"
            Environment_C
            Environment_D
        end
    end
```

またワーカー環境の構成は以下の公式にあります。

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/using-features-managing-env-tiers.html

- SQSでタスクを管理
    - 作成時、DeadLetter用のキューも含めた、2つのキューが作成
- EC2内部に、SQSとやり取りするデーモンプロセスが起動
    - デーモンプロセスから、デプロイしたアプリに対して、POSTでメッセージが送られる模様

# アプリケーションだけ作る

## コンソール画面から作る方法

以下の記事にありましたので、それを行いました。

https://www.softbank.jp/biz/blog/cloud-technology/articles/202209/aws-elastic-beanstalk-1

> 注）AWS Elastic Beanstalk は、初回のアプリ作成時だけ、アプリの実行環境も同時に作成されるため、ここで「アプリケーションの作成」をクリックすると、「Myapp-env」という名称の環境が自動で作成されます。これを避けるために、いったん「より多くのオプションの設定」をクリックします。そうすると、環境が作成されず、アプリのみが作成されます。

Create Applicationをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/9fcbab80-507c-c764-09dc-561dec866548.png)

必須事項を入れて、「より多くのオプションの設定」をクリックすると、アプリケーションだけ作られます。

:::note warn
ここで「アプリケーションの作成」を押すと、アプリケーションと同時にウェブサーバー環境も作成されますので、ご注意ください。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/fb12bceb-c4d0-f54f-2c86-4cf2e9583c48.png)



環境を作る画面に遷移しますが、キャンセルします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/9577b677-bc8f-8520-300e-d2c12b6f0722.png)

環境なしのアプリケーションが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/0af6a1a0-d7ab-b446-f506-70ac8a451bed.png)


# コマンド(ebcli)で作る方法
以下の記事を参考にしました。

https://inokara.hateblo.jp/entry/2015/11/29/230124

CloudShellではデフォルトで入っているので、そちらから行います。
コンソールから行う方法とは異なり、途中でキーペアの作成も促されます。

```bash
$ eb init

Select a default region
1) us-east-1 : US East (N. Virginia)
2) us-west-1 : US West (N. California)
3) us-west-2 : US West (Oregon)
4) eu-west-1 : EU (Ireland)
5) eu-central-1 : EU (Frankfurt)
6) ap-south-1 : Asia Pacific (Mumbai)
7) ap-southeast-1 : Asia Pacific (Singapore)
8) ap-southeast-2 : Asia Pacific (Sydney)
9) ap-northeast-1 : Asia Pacific (Tokyo)
10) ap-northeast-2 : Asia Pacific (Seoul)
11) sa-east-1 : South America (Sao Paulo)
12) cn-north-1 : China (Beijing)
13) cn-northwest-1 : China (Ningxia)
14) us-east-2 : US East (Ohio)
15) ca-central-1 : Canada (Central)
16) eu-west-2 : EU (London)
17) eu-west-3 : EU (Paris)
18) eu-north-1 : EU (Stockholm)
19) eu-south-1 : EU (Milano)
20) ap-east-1 : Asia Pacific (Hong Kong)
21) me-south-1 : Middle East (Bahrain)
22) af-south-1 : Africa (Cape Town)
(default is 3): 9


Select an application to use
1) testapp-20230126
2) [ Create new Application ]
(default is 2): 2


Enter Application Name
(default is "cloudshell-user"): testcliapp-20230126

Application testcliapp-20230126 has been created.
Select a platform.
1) .NET Core on Linux
2) .NET on Windows Server
3) Docker
4) Go
5) Java
6) Node.js
7) PHP
8) Packer
9) Python
10) Ruby
11) Tomcat
(make a selection): 9

Select a platform branch.
1) Python 3.8 running on 64bit Amazon Linux 2
2) Python 3.7 running on 64bit Amazon Linux 2
(default is 1): 1

Cannot setup CodeCommit because there is no Source Control setup, continuing with initialization
Do you want to set up SSH for your instances?
(Y/n): y

Select a keypair.
1) 20210818_key
2) 20210917_key
3) [ Create new KeyPair ]
(default is 2): 3


Type a keypair name.
(Default is aws-eb): 20230126_eb
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 

WARNING: Uploaded SSH public key for "20230126_eb" into EC2 for region ap-northeast-1.
```

こちらでも空のアプリケーションが作られました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/9e6201be-e1cd-db1f-b697-97b825282441.png)
キーペアも作られてました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/81351c9b-c1ce-f7bb-6cda-72b86c83e164.png)

# ワーカー環境作ってみる

今回はコンソール画面からのみ作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/1c81dc78-2da9-4dd2-11a4-c7677be5062b.png)
「より多くのオプションの設定」をクリック（設定変更しないのであれば、「環境の作成」をそのままクリックしてもよいかと思います）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/c7fe6a2f-8603-fded-2a0e-9cbf27357238.png)
必要な設定を変更して作成します。今回は何も変えていないです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/7531308b-7f24-a859-c129-fc9fcaf51400.png)
作成中は以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/e0ea151c-f406-73c4-10cc-42b78d2541c0.png)
EC2インスタンスが作成されました。デフォルトVPC上に展開され、セキュリティグループのインバウンドはありませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/c99ea572-766b-27ee-3131-5a6d6ea6ad73.png)
アタッチされているIAMロールのポリシーは以下でした。タスクで操作が必要なリソースへのアクセス権限は別途付与が必要そうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/e386fb87-082d-da68-fef9-f792f02bc104.png)
キューも2つ作成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/e53d604a-f9f3-d424-893c-3402b2c145b6.png)

環境作成にはCloudFormationを使っているので、スタックから環境を図示してもらいました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/e6c13bbc-37c7-e684-7cc3-7d5103b5d22f.png)
触ったばかりなので、何がどう使われているか、要勉強です…


## EC2インスタンスに入る
作成されたEC2インスタンスにEC2 Instance Connectで接続したいので、セキュリティグループのインバウンドにルールを追加します。
以下の記事を参考にしました。

https://qiita.com/hayao_k/items/7b44ed1cd11651272985

インスタンス名はヘルスより確認可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/7239ea8e-a910-db29-5c7f-a993d85b0877.png)

ルールを追加しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/80bb5274-1ccf-510b-6527-3f46a14d7872.png)

インスタンスの アクション > 接続 から、内部に入ることができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/0ad4ca2b-c1d6-cdda-0540-791466537c7b.png)

# おわりに

ワーカー環境だけ利用、というニーズもそこそこあるかと思いますので、そういう方の参考になれたら幸いです。

~~この先のデプロイですが、ソースの書き方がわかなくて困っています。Pythonのワーカー環境のソースの書き方がわかる方がいらっしゃったら、ご教示ください。~~

(2023.2.12追記)Pythonでのサンプルについて記事にしました。

https://qiita.com/a_b_/items/8feae160ef1467802342