Cloud9環境へDockerのインストール方法 準備編


## 概要

Dockerを使用した開発にあたり手持ちのWindows端末ではいろいろと不便になってきたのでCloud9で開発をできるようにしてみようかと思います。
作成の部分は[こちらAWS CLI 専門支部のイベント](https://jawsug-cli.connpass.com/event/222881/) を参考に作っています。

## Cloud9用VPC作成
### VPCの設定
* Cloud9用のVPCを作成します。
* CloudShell で以下のコマンドを実行していきます
    * #以下のコマンドをコピペして実施すればできます

```shell
# 各変数の設定 ターミナルを切り替えたりした場合は再度設定が必要になります
AWS_REGION="ap-northeast-1"
EC2_VPC_TAG_NAME='docker-vpc'
EC2_VPC_CIDR='10.0.0.0/16'
EC2_INTERNET_GATEWAY_TAG_NAME='docker-internet-gateway'
EC2_ROUTE_TABLE_TAG_NAME='docker-route-table'
EC2_ROUTE_DESTINATION_CIDR='0.0.0.0/0'
EC2_SUBNET_TAG_NAME='public-subnet'
EC2_SUBNET_CIDR='10.0.0.0/24'
EC2_AZ_NAME="ap-northeast-1a"


# 設定値の確認 設定値が設定されていない場合はコマンドを見直してください
cat << END

  # 0. AWS_REGION:"ap-northeast-1"
       AWS_REGION="${AWS_REGION}"

  # 1. EC2_VPC_TAG_NAME:"docker-vpc"
       EC2_VPC_TAG_NAME="${EC2_VPC_TAG_NAME}"
  # 2. EC2_VPC_CIDR:"10.0.0.0/16"
       EC2_VPC_CIDR="${EC2_VPC_CIDR}"

END

```
```shell

# 変数の設定
STRING_EC2_VPC_TAG="ResourceType=vpc,Tags=[{Key=Name,Value=${EC2_VPC_TAG_NAME}}]" \
  && echo ${STRING_EC2_VPC_TAG}


```
```shell

# 設定値の確認 設定値が設定されていない場合はコマンドを見直してください
cat << END

  # EC2_VPC_CIDR:"10.0.0.0/16"
    EC2_VPC_CIDR="${EC2_VPC_CIDR}"
  # STRING_EC2_VPC_TAG:"ResourceType=vpc,Tags=[{Key=Name,Value=docker-vpc}]"
    STRING_EC2_VPC_TAG="${STRING_EC2_VPC_TAG}"

END


```
```shell
# VPC作成
aws ec2 create-vpc \
  --cidr-block ${EC2_VPC_CIDR} \
  --tag-specifications ${STRING_EC2_VPC_TAG}

```
* 作成結果確認

```
# VPC作成確認
aws ec2 describe-vpcs \
  --filters Name=tag:Name,Values=${EC2_VPC_TAG_NAME}  \
  --query 'Vpcs[].Tags[?Key == `Name`].Value' \
  --output text

# CIDRの確認
aws ec2 describe-vpcs \
  --filters Name=tag:Name,Values=${EC2_VPC_TAG_NAME} \
  --query "Vpcs[].CidrBlock" \
  --output text
```
### インターネットゲートウェイの設定
* 前述の手順作成したVPCのインターネットゲートウェイを作成します。
* CloudShell で以下のコマンドを実行していきます
    * #以下のコマンドをコピペして実施すればできます


```shell
# VPCのタグ名、CIDRの設定
cat << END

  # 0. AWS_REGION:"ap-northeast-1"
       AWS_REGION="${AWS_REGION}"

  # 1. EC2_INTERNET_GATEWAY_TAG_NAME:"docker-internet-gateway"
       EC2_INTERNET_GATEWAY_TAG_NAME="${EC2_INTERNET_GATEWAY_TAG_NAME}"

END


```
```shell
# 変数設定
STRING_EC2_INTERNET_GATEWAY_TAG="ResourceType=internet-gateway,Tags=[{Key=Name,Value=${EC2_INTERNET_GATEWAY_TAG_NAME}}]" \
  && echo ${STRING_EC2_INTERNET_GATEWAY_TAG}


```
```shell
cat << END

  # STRING_EC2_INTERNET_GATEWAY_TAG:"ResourceType=internet-gateway,Tags=[{Key=Name,Value=docker-internet-gateway}]"
    STRING_EC2_INTERNET_GATEWAY_TAG="${STRING_EC2_INTERNET_GATEWAY_TAG}"

END

```
```shell

# インターネットゲートウェイの作成
aws ec2 create-internet-gateway \
  --tag-specifications ${STRING_EC2_INTERNET_GATEWAY_TAG}

# 作成の確認
aws ec2 describe-internet-gateways \
  --filters Name=tag:Name,Values=${EC2_INTERNET_GATEWAY_TAG_NAME}  \
  --query "InternetGateways[].Tags[].Value" \
  --output text

```
### インターネットゲートウェイのアタッチ
* 前述の手順作成したVPCのインターネットゲートウェイのアタッチを行います。
* CloudShell で以下のコマンドを実行していきます
    * #以下のコマンドをコピペして実施すればできます

```shell

# 変数確認
cat << END

  # 0. AWS_REGION:"ap-northeast-1"
       AWS_REGION="${AWS_REGION}"

  # 1. EC2_VPC_TAG_NAME:"docker-vpc"
       EC2_VPC_TAG_NAME="${EC2_VPC_TAG_NAME}"
  # 2. EC2_INTERNET_GATEWAY_TAG_NAME:"docker-internet-gateway"
       EC2_INTERNET_GATEWAY_TAG_NAME="${EC2_INTERNET_GATEWAY_TAG_NAME}"

END


```
```shell
# VPCIDの取得
EC2_VPC_ID=$( \
  aws ec2 describe-vpcs \
    --filters Name=tag:Name,Values=${EC2_VPC_TAG_NAME}  \
    --query 'Vpcs[].VpcId' \
    --output text \
) \
  && echo ${EC2_VPC_ID}


```
```shell
# インターネットゲートウェイIDの取得
EC2_INTERNET_GATEWAY_ID=$( \
  aws ec2 describe-internet-gateways \
    --filters Name=tag:Name,Values=${EC2_INTERNET_GATEWAY_TAG_NAME} \
    --query "InternetGateways[].InternetGatewayId" \
    --output text \
) \
  && echo ${EC2_INTERNET_GATEWAY_ID}


```
```shell
# 変数の確認
cat << END

  # EC2_VPC_ID:"vpc-xxxxxxxxxxxxxxxxx"
    EC2_VPC_ID="${EC2_VPC_ID}"
  # EC2_INTERNET_GATEWAY_ID:"igw-xxxxxxxxxxxxxxxxx"
    EC2_INTERNET_GATEWAY_ID="${EC2_INTERNET_GATEWAY_ID}"

END


```
```shell
# インターネットゲートウェイのアタッチ
aws ec2 attach-internet-gateway \
  --vpc-id ${EC2_VPC_ID} \
  --internet-gateway-id ${EC2_INTERNET_GATEWAY_ID}

# アタッチの確認
aws ec2 describe-internet-gateways \
  --filters Name=tag:Name,Values=${EC2_INTERNET_GATEWAY_TAG_NAME}  \
  --query "InternetGateways[].Attachments[?VpcId == \`${EC2_VPC_ID}\`].VpcId" \
  --output text
```

### ルートテーブルの作成
* 前述の手順作成したVPCのルートテーブルを作成します。
* CloudShell で以下のコマンドを実行していきます
    * #以下のコマンドをコピペして実施すればできます


```shell
# 変数の確認
cat << END

  # 0. AWS_REGION:"ap-northeast-1"
       AWS_REGION="${AWS_REGION}"

  # 1. EC2_VPC_TAG_NAME:"docker-vpc"
       EC2_VPC_TAG_NAME="${EC2_VPC_TAG_NAME}"
  # 2. EC2_ROUTE_TABLE_TAG_NAME:"docker-route-table"
       EC2_ROUTE_TABLE_TAG_NAME="${EC2_ROUTE_TABLE_TAG_NAME}"

END



```
```shell
# 変数設定
STRING_EC2_ROUTE_TABLE_TAG="ResourceType=route-table,Tags=[{Key=Name,Value=${EC2_ROUTE_TABLE_TAG_NAME}}]" \
  && echo ${STRING_EC2_ROUTE_TABLE_TAG}


```
```shell
# 変数の確認
cat << END

  # EC2_VPC_ID:"vpc-xxxxxxxxxxxxxxxxx"
    EC2_VPC_ID="${EC2_VPC_ID}"
  # STRING_EC2_ROUTE_TABLE_TAG:"ResourceType=route-table,Tags=[{Key=Name,Value=docker-route-table}]"
    STRING_EC2_ROUTE_TABLE_TAG="${STRING_EC2_ROUTE_TABLE_TAG}"

END


```
```shell
# ルートテーブルの作成
aws ec2 create-route-table \
  --vpc-id ${EC2_VPC_ID} \
  --tag-specifications ${STRING_EC2_ROUTE_TABLE_TAG}


```
```shell
# 完了確認
aws ec2 describe-route-tables \
  --filters Name=vpc-id,Values=${EC2_VPC_ID} \
            Name=tag:Name,Values=${EC2_ROUTE_TABLE_TAG_NAME}  \
  --query "RouteTables[].Tags[?Key == \`Name\`].Value" \
  --output text

```

### ルートの作成
* 前述の手順作成したルートを作成します。
* CloudShell で以下のコマンドを実行していきます
    * #以下のコマンドをコピペして実施すればできます

```shell

# 変数確認
cat << END

  # 0. AWS_REGION:"ap-northeast-1"
       AWS_REGION="${AWS_REGION}"

  # 1. EC2_VPC_TAG_NAME:"docker-vpc"
       EC2_VPC_TAG_NAME="${EC2_VPC_TAG_NAME}"
  # 2. EC2_ROUTE_TABLE_TAG_NAME:"docker-route-table"
       EC2_ROUTE_TABLE_TAG_NAME="${EC2_ROUTE_TABLE_TAG_NAME}"
  # 3. EC2_ROUTE_DESTINATION_CIDR:"0.0.0.0/0"
       EC2_ROUTE_DESTINATION_CIDR="${EC2_ROUTE_DESTINATION_CIDR}"
  # 4. EC2_INTERNET_GATEWAY_TAG_NAME:"docker-internet-gateway"
       EC2_INTERNET_GATEWAY_TAG_NAME="${EC2_INTERNET_GATEWAY_TAG_NAME}"

END



```
```shell
# ルートテーブルのID設定
EC2_ROUTE_TABLE_ID=$( \
  aws ec2 describe-route-tables \
    --filters Name=vpc-id,Values=${EC2_VPC_ID} \
              Name=tag:Name,Values=${EC2_ROUTE_TABLE_TAG_NAME}  \
    --query "RouteTables[].RouteTableId" \
    --output text \
) \
  && echo ${EC2_ROUTE_TABLE_ID}



```
```shell
# 変数確認
cat << END

  # EC2_ROUTE_TABLE_ID:"rtb-xxxxxxxxxxxxxxxxx"
    EC2_ROUTE_TABLE_ID="${EC2_ROUTE_TABLE_ID}"
  # EC2_ROUTE_DESTINATION_CIDR:"0.0.0.0/0"
    EC2_ROUTE_DESTINATION_CIDR="${EC2_ROUTE_DESTINATION_CIDR}"
  # EC2_INTERNET_GATEWAY_ID:"igw-xxxxxxxxxxxxxxxxx"
    EC2_INTERNET_GATEWAY_ID="${EC2_INTERNET_GATEWAY_ID}"

END


```
```shell
# ルートテーブル作成
aws ec2 create-route \
  --route-table-id ${EC2_ROUTE_TABLE_ID} \
  --destination-cidr-block ${EC2_ROUTE_DESTINATION_CIDR} \
  --gateway-id ${EC2_INTERNET_GATEWAY_ID}


```
```shell
# 完了確認
aws ec2 describe-route-tables \
  --filters Name=vpc-id,Values=${EC2_VPC_ID} \
            Name=tag:Name,Values=${EC2_ROUTE_TABLE_TAG_NAME}  \
  --query "RouteTables[].Routes[?DestinationCidrBlock == \`${EC2_ROUTE_DESTINATION_CIDR}\`].DestinationCidrBlock" \
  --output text


```
```shell
aws ec2 describe-route-tables \
  --filters Name=vpc-id,Values=${EC2_VPC_ID} \
            Name=tag:Name,Values=${EC2_ROUTE_TABLE_TAG_NAME}  \
  --query "RouteTables[].Routes[?DestinationCidrBlock == \`${EC2_ROUTE_DESTINATION_CIDR}\`].GatewayId" \
  --output text

```

### サブネット作成
* 前述の手順作成したサブネットを作成します。
* CloudShell で以下のコマンドを実行していきます
    * #以下のコマンドをコピペして実施すればできます

```shell

# 変数確認
cat << END

  # 0. AWS_REGION:"ap-northeast-1"
       AWS_REGION="${AWS_REGION}"
  # 1. EC2_VPC_TAG_NAME:"docker-vpc"
       EC2_VPC_TAG_NAME="${EC2_VPC_TAG_NAME}"
  # 2. EC2_SUBNET_TAG_NAME:"public-subnet"
       EC2_SUBNET_TAG_NAME="${EC2_SUBNET_TAG_NAME}"
  # 3. EC2_SUBNET_CIDR:"10.0.0.0/24"
       EC2_SUBNET_CIDR="${EC2_SUBNET_CIDR}"
  # 4. EC2_AZ_NAME:"ap-northeast-1a"
       EC2_AZ_NAME="${EC2_AZ_NAME}"

END



```
```shell
# サブネット
STRING_EC2_SUBNET_TAG="ResourceType=subnet,Tags=[{Key=Name,Value=${EC2_SUBNET_TAG_NAME}}]" \
  && echo ${STRING_EC2_SUBNET_TAG}


```
```shell
# 変数確認
cat << END

  # EC2_VPC_ID:"vpc-xxxxxxxxxxxxxxxxx"
    EC2_VPC_ID="${EC2_VPC_ID}"
  # EC2_SUBNET_CIDR:"10.0.0.0/24"
    EC2_SUBNET_CIDR="${EC2_SUBNET_CIDR}"
  # EC2_AZ_NAME:"ap-northeast-1a"
    EC2_AZ_NAME="${EC2_AZ_NAME}"
  # STRING_EC2_SUBNET_TAG:"ResourceType=subnet,Tags=[{Key=Name,Value=public-subnet}]"
    STRING_EC2_SUBNET_TAG="${STRING_EC2_SUBNET_TAG}"

END


```
```shell
# サブネット作成
aws ec2 create-subnet \
  --vpc-id ${EC2_VPC_ID} \
  --cidr-block ${EC2_SUBNET_CIDR} \
  --availability-zone ${EC2_AZ_NAME} \
  --tag-specifications ${STRING_EC2_SUBNET_TAG}


```
```shell
# 完了確認
aws ec2 describe-subnets \
  --filters Name=vpc-id,Values=${EC2_VPC_ID} \
            Name=tag:Name,Values=${EC2_SUBNET_TAG_NAME}  \
  --query 'Subnets[].Tags[?Key == `Name`].Value' \
  --output text


```
```shell
aws ec2 describe-subnets \
  --filters Name=vpc-id,Values=${EC2_VPC_ID} \
            Name=tag:Name,Values=${EC2_SUBNET_TAG_NAME}  \
  --query "Subnets[].CidrBlock" \
  --output text


```
```shell
aws ec2 describe-subnets \
  --filters Name=vpc-id,Values=${EC2_VPC_ID} \
            Name=tag:Name,Values=${EC2_SUBNET_TAG_NAME}  \
  --query "Subnets[].AvailabilityZone" \
  --output text

```

### ルートテーブル更新
* 前述の手順作成したルートテーブルの更新をします。
* CloudShell で以下のコマンドを実行していきます
    * #以下のコマンドをコピペして実施すればできます

```shell

# 変数確認
cat << END

  # 0. AWS_REGION:"ap-northeast-1"
       AWS_REGION="${AWS_REGION}"
  # 1. EC2_VPC_TAG_NAME:"docker-vpc"
       EC2_VPC_TAG_NAME="${EC2_VPC_TAG_NAME}"
  # 2. EC2_ROUTE_TABLE_TAG_NAME:"docker-route-table"
       EC2_ROUTE_TABLE_TAG_NAME="${EC2_ROUTE_TABLE_TAG_NAME}"
  # 3. EC2_SUBNET_TAG_NAME:"public-subnet"
       EC2_SUBNET_TAG_NAME="${EC2_SUBNET_TAG_NAME}"

END


```
```shell
# サブネットID
EC2_SUBNET_ID=$( \
  aws ec2 describe-subnets \
    --filters Name=vpc-id,Values=${EC2_VPC_ID} \
              Name=tag:Name,Values=${EC2_SUBNET_TAG_NAME}  \
    --query "Subnets[].SubnetId" \
    --output text \
) \
  && echo ${EC2_SUBNET_ID}


```
```shell
# 変数確認
cat << END

  # EC2_SUBNET_ID:"subnet-xxxxxxxxxxxxxxxxx"
    EC2_SUBNET_ID="${EC2_SUBNET_ID}"
  # EC2_ROUTE_TABLE_ID:"rtb-xxxxxxxxxxxxxxxxx"
    EC2_ROUTE_TABLE_ID="${EC2_ROUTE_TABLE_ID}"

END

```
```shell

# ルートテーブルの更新
aws ec2 associate-route-table \
  --subnet-id ${EC2_SUBNET_ID} \
  --route-table-id ${EC2_ROUTE_TABLE_ID}


```
```shell
# 完了確認
aws ec2 describe-route-tables \
  --route-table-ids ${EC2_ROUTE_TABLE_ID} \
  --query "RouteTables[].Associations[?SubnetId == \`${EC2_SUBNET_ID}\`].RouteTableAssociationId" \
  --output text
```
## Cloud9の構築
* Cloud9の環境を作成行います
* [Cloud9ダッシュボード](https://ap-northeast-1.console.aws.amazon.com/cloud9/home/product)にアクセスします。
* リージョンが東京になっていることを確認します。
* `Create enviroment`ボタンを押下します。

* Name に環境名を入れます ここでは docker-cloud9-env とします
  * Description は説明なのでお好みで
![スクリーンショット 2021-10-30 215035.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/ec8745b9-70ee-a242-0068-c7d328c5ba99.png)
* 設定値は以下を参照 基本はデフォルトのままで
  * Instance type は無料枠があれば無料枠の t2.microがいいかも
  * Network(VPC),Subnetについては作成したVPCを選択してください。
    * メニューから隠れているので `+` となっている部分を押下することで設定できます。
![スクリーンショット 2021-10-30 215810.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/909a8b20-2123-6976-0da1-9cfee11994ec.png)

![スクリーンショット 2021-10-30 220302.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/894cbcfb-5624-b8a4-dbd8-2cb9554aba01.png)

* Next Stepボタンを押下すると確認画面に遷移します。
![スクリーンショット 2021-10-30 220252.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/88670837-20f4-792a-c1b6-d51f9877d966.png)
* Create enviroment ボタンを押下するとCloud9環境が起動します。軌道には時間がかかります。
![スクリーンショット 2021-10-30 220514.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/d98a2def-2767-955a-59d7-bb10e728a7ed.png)


## AWSCLIの設定
* Dockerを使うだけなら不要ですがAWS CLIを使えるように更新をします

```shell
sudo yum erase aws-cli -y

```

### aliasの追加

* `~/.bashrc` に対して以下を追加します。

```shell
alias sudo='sudo '
```

* 追加後以下のコマンドで設定を反映させます。

```shell
source ~/.bashrc
```

### AWSCLIのインストール
* 以下のコマンドでインストールします

```shell
sudo pip install awscli
```

### タブ補完の有効化
* 以下の内容を `~/.bashrc` に対して追加を行います。
* そのまま貼り付けるとインデントがずれるかもしれません。
* この設定を行うことで正常にコマンドを実行したときに 緑色に 失敗すると赤になるようになります。

```shell
complete -C aws_completer aws

PS1="\`
  if [ \$? = 0 ]; then
    echo \[\e[36m\]
  else
    echo \[\e[31m\]
  fi
\`[\u@\h%]\[\e[0m\]\$ "
```
* 追加後以下のコマンドで設定を反映させます。

```shell
source ~/.bashrc
```
![スクリーンショット 2021-10-30 221500.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/16ae244e-b1ea-7e83-bcb4-49b5483fe3f7.png)

### AWS CLI完了確認
* 以下のコマンドでバージョンを確認する。

```shell
aws --version
```

今回はここまで
Cloud9の環境はブラウザを閉じれば30分後に停止しますが、気になる方は手動で停止をしましょう。