AWS Elastic BeanstalkでEC2インスタンスをデフォルトVPC以外のVPCに作成する方法

# はじめに
[AWS ElasticBeanstalk](https://aws.amazon.com/jp/elasticbeanstalk/?nc2=h_ql_prod_cp_ebs)とは、Webアプリケーションのデプロイとスケーリングを迅速に実施するのを目的とした開発者向けのサービスです。Webアプリケーションは、Elastic Beanstalkが管理するEC2インスタンス上にデプロイが行われ、このEC2インスタンスはElastic Beanstalk上で特に何も設定しなければ、デフォルトVPC(AWSアカウントを作成するとデフォルトで用意されているVPC)のサブネット上に作成されます。ですが、デフォルトVPC以外のVPC環境にElastic BeanstalkのEC2インスタンスを作成したい場合もあるかと思いますので、本記事ではその場合の手順をご紹介します。

# VPC環境の事前準備
今回は、事前に下記のVPC環境を用意しました。
* VPC
    * VPC名：my-vpc-01
    * アドレス範囲：10.0.0.0/16
* パブリックサブネット 
    * サブネット名：my-puclib-subnet-01
    * アドレス範囲：10.0.1.0/24
    * 配置先AZ：ap-northeast-1a
* インターネットゲートウェイ
    * インターネットゲートウェイ名：my-igw 
* ルートテーブルの修正

# Elastic Beanstalkを使用したアプリケーションのデプロイ
**1. Elastic Beanstalkコンソールを表示**
AWSコンソールでサービス検索を行い、Elastic Beanstalkのコンソールを表示します。表示後、右側にある「アプリケーションの作成」ボタンをクリックします。
![eb01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567099/daeb52a8-5b38-deb4-7ad5-146fdc1d7e30.png)

**2. アプリケーション名の入力**
下記画面の「アプリケーション名」の箇所に任意のアプリケーション名を入力します。今回は、My-ebapplというアプリケーション名にします。
![eb02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567099/5939c4f1-7060-62fc-0b20-951c7df16980.png)

**3. プラットフォームとアプリケーションコードの選択**
下記画面にてアプリが稼働するプラットフォームとアプリケーションコードを選択します。今回は、Pythonのサンプルアプリケーションを動かすことにします。
![eb03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567099/eb4f747e-4d5a-d070-ebd9-5b3d14e9b189.png)
ここで、「アプリケーションの作成」ボタンを押すと、Elastic BeanstalkはデフォルトVPCに対して、サンプルアプリケーション稼働用のEC2インスタンスを作成しにいってしまいますので、今回は「より多くのオプションの設定」ボタンを押して、ネットワーク関連の設定画面を探します。

**4. ネットワークの設定**
「ネットワーク」カテゴリーにおける「編集」ボタンをクリックします。
![eb09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567099/fcc6919c-fead-f8aa-f1bd-c670327a1e70.png)
すると下記のような画面が表示され、VPCやインスタンスの設定項目上に、事前準備していたVPCやサブネットを選択することができます。
![eb10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567099/5cefb2c4-f7e1-3e69-8cd4-3eb254b1a2e7.png)
今回はデータベースは使用しないので、「データベース設定」の箇所にはチェックは入れず、右下の「保存」ボタンをクリックします。
![eb11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567099/1f9b3931-279a-f90f-afa9-a05dc58fe6e0.png)
前の画面に戻って、「ネットワーク」カテゴリーを見ると、VPCやサブネットなどが表示されていることを確認できます。
![eb12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567099/366f6da8-6ee1-2e6f-575b-800939eb2511.png)

**5. その他の設定を確認**
今回使用するEC2インスタンスは、下記画面に表示されている無料利用範囲内のものを使用します。「編集」ボタンをクリックすれば、インスタンスタイプなどを自由に変更することもできます。
![eb05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567099/e67bf1da-5782-d284-55bf-aa205bbbf84b.png)

また、Elastic Beanstalkが作成するEC2インスタンスにSSH接続できるように、仮想マシンのキーペアを登録しておきます。下記の「セキュリティー」カテゴリーにおける「編集」ボタンをクリックします。
![eb06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567099/21b3b690-3b47-ade9-eb38-ef35ab2768f0.png)

下記のような画面が表示されるので、「仮想マシンアクセス許可」の「EC2キーペア」で表示されるキーを選択します。対応する秘密鍵がPC上に存在していることを確認ください。その後、右下の「保存」ボタンをクリックします。
![eb07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567099/9b86ebab-e36c-11da-01b7-10ebf6e91cf5.png)
前の画面における「セキュリティー」カテゴリーの「仮想マシンキーペア」の箇所に値が入ったことが確認できます。
![eb08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567099/01bee7ef-12e0-6c51-fa15-81168f75ed79.png)

**6. アプリケーションのデプロイ**
下記画面の右下にある「アプリの作成」ボタンをクリックします。
![eb13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567099/b9dafd3d-8777-216d-04f4-094d73cd35ca.png)
アプリケーションのデプロイに向けたElastic Beanstalkの環境作成が始まります。
![eb14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567099/f0977077-7705-bb2a-abc3-f6359be25e4f.png)
作成には数分かかりますが、順調に進んでいることが確認できます。
![eb16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567099/b80041b7-2a17-21f3-affc-8d903aee9605.png)
最終的に下記の画面が表示されれば、Elastic Beanstalkの環境作成が終わり、アプリケーションのデプロイは完了です。
![eb17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567099/4732e7c8-a7d8-8fe6-bfa9-5ea821ae5a85.png)

**7. サンプルアプリケーションの稼働確認**
下記Elastic Beanstalkコンソールの左側にある「環境」をクリックすると、右側の「すべての環境」のところに今回作成した環境が表示されます。記載のURLをクリックするとサンプルアプリケーションをチェックすることができます。
![eb19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567099/dfe658b5-0051-03d5-751a-a9b86eaba463.png)
サンプルアプリケーションは下記のように表示されていればOKです。
![eb18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567099/1131c07e-92e9-b769-8143-ada5399c5d76.png)

**8. 作成したEC2インスタンスへのSSH接続確認**
Elastic Beanstalkにより作成されたEC2インスタンスは、下記画面の右側に表示されているものになります。
![eb20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567099/d32c08c4-a39f-e71d-1623-1cf8844d3375.png)
EC2インスタンスのパブリックIPアドレスは、13.230.86.212と表示されていますので、このIPアドレスを使用してSSH接続を行います。
```
[testuser@localhost ~]$ ssh -i ./.ssh/aws-eb-key ec2-user@13.230.86.212
The authenticity of host '13.230.86.212 (13.230.86.212)' can't be established.
ECDSA key fingerprint is SHA256:mmddvJeAvzlU3mfKcdhkI7v2+GkNY5L9Ure4k1Xg3bY.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '13.230.86.212' (ECDSA) to the list of known hosts.
  _____ _           _   _      ____                       _        _ _
 | ____| | __   ___| |_(_) ___| __ )  ___  __ _ _ __  ___| |_ __ _| | | __
 |  _| | |/ _ \/ __| __| |/ __|  _ \ / _ \/ _\ | '_ \/ __| __/ _\ | | |/ /
 | |___| | (_| \__ \ |_| | (__| |_) |  __/ (_| | | | \__ \ || (_| | |   <
 |_____|_|\__,_|___/\__|_|\___|____/ \___|\__,_|_| |_|___/\__\__,_|_|_|\_\

 Amazon Linux 2 AMI

 This EC2 instance is managed by AWS Elastic Beanstalk. Changes made via SSH
 WILL BE LOST if the instance is replaced by auto-scaling. For more information
 on customizing your Elastic Beanstalk environment, see our documentation here:
 http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html

[ec2-user@ip-10-0-1-58 ~]$ 
```
問題なくSSH接続することも確認できました。Elastic Beanstalkの文字がでかでかと表示されているのもなかなか味わい深いです。

# おわりに
今回は、デフォルトVPC以外のVPCに対して、AWS Elastic Beanstalkのアプリケーションデプロイ先のEC2インスタンスを作成するための手順を紹介しました。私自身はアプリ開発未経験のインフラSEですが、AWSは開発者向けのサービスが豊富なため、これを機会にアプリの勉強もしていこうと思います。