echo ${MY_OUTPUT} >>blog

AWSやその他勉強した内容をぶちまける

紫本をCLIでやってみた

AWS初心者のバイブルと言っても過言ではない紫本

www.amazon.co.jp


私も数ヶ月前にこれをやりました。
AWSの基本がまとまっていてとてもよいです。

これをCLIでやったらどうなるか。
ふと思ったのでやってみました。

※この記事は2015年9月5日開催のJAWS re:Mote 初心者、CLI枠の補足資料です。

構成

紫本の構成

f:id:t_wkm2:20150905004734p:plain

今回の構成

紫本と同じ構成というのもつまらないので、少し構成を変えてみます。

f:id:t_wkm2:20150905004748p:plain

コマンド手順

CLIで上記構成を構築する手順を記載します。
確認コマンドなどは面倒臭かった時間がなかったので省略しています。

VPC作成

まずはVPCを作成します。

VPC_ID=`aws ec2 create-vpc \
        --cidr-block "10.0.0.0/16" \
        --query Vpc.VpcId \
        --output text \
` && echo ${VPC_ID}



IGW作成

次にインターネットゲートウェイ(IGW)を作成します。

VPC_IGW_ID=` \
    aws ec2 create-internet-gateway \
        --query InternetGateway.InternetGatewayId \
        --output text`
&& echo{VPC_IGW_ID}

IGWは作成しただけでは使えないので、先ほど作成したVPCに紐付けます。

aws ec2 attach-internet-gateway \
        --internet-gateway-id ${VPC_IGW_ID} \
        --vpc-id ${VPC_ID}

PrivateSubnet作成

次にRDSのためのサブネットを作成します。

まずはサブネットに紐付けるルーティングテーブルを作成します。

VPC_ROUTE_ID=` \
    aws ec2 create-route-table \
        --vpc-id ${VPC_ID} \
        --query RouteTable.RouteTableId \
        --output text \
` && echo ${VPC_ROUTE_ID}

次にサブネットを作成します。

VPC_SUBNET_ID_AZA=` \
    aws ec2 create-subnet \
        --vpc-id ${VPC_ID} \
        --cidr-block "10.0.2.0/24" \
        --availability-zone ap-northeast-1a \
        --query Subnet.SubnetId \
        --output text \
` && echo ${VPC_SUBNET_ID_AZA}

先ほど作成したルーティングテーブルとサブネットを紐付けます。

aws ec2 associate-route-table \
        --route-table-id ${VPC_ROUTE_ID} \
        --subnet-id ${VPC_SUBNET_ID_AZA}

RDSではAZが異なるサブネットが複数必要なので、サブネットをもう1つ作成します。
2つ目のルーティングテーブルを作成します。

VPC_ROUTE_ID=` \
    aws ec2 create-route-table \
        --vpc-id ${VPC_ID} \
        --query RouteTable.RouteTableId \
        --output text \
` && echo ${VPC_ROUTE_ID}

2つ目のサブネットを作成します。

VPC_SUBNET_ID_AZC=` \
    aws ec2 create-subnet \
        --vpc-id ${VPC_ID} \
        --cidr-block "10.0.3.0/24" \
        --availability-zone ap-northeast-1c \
        --query Subnet.SubnetId \
        --output text \
` && echo ${VPC_SUBNET_ID_AZC}

2つ目のルーティングテーブルとサブネットを紐付けます。

aws ec2 associate-route-table \
        --route-table-id ${VPC_ROUTE_ID} \
        --subnet-id ${VPC_SUBNET_ID_AZC}

RDSでは複数のサブネットをDBサブネットグループとして紐付けます。
先ほど作成した2つのサブネットでDBサブネットグループを作成します。

aws rds create-db-subnet-group \
        --db-subnet-group-name "mysql_dbsg" \
        --db-subnet-group-description "mysql_dbsg" \
        --subnet-ids ${VPC_SUBNET_ID_AZA} ${VPC_SUBNET_ID_AZC}

これでサブネットの作成は完了です。

セキュリティグループ作成(RDS用)

次にRDS用のセキュリティグループを作成します。

VPC_SG_ID=` \
   aws ec2 create-security-group \
        --group-name "MySQL_IN_SG" \
        --description "MySQL_IN_SG" \
        --vpc-id ${VPC_ID} \
        --query GroupId \
        --output text \
` &&  echo ${VPC_SG_ID}

RDSはMySQLで作成するので、3306番を開けます。

aws ec2 authorize-security-group-ingress \
        --group-id ${VPC_SG_ID} \
        --protocol tcp --port 3306 \
        --cidr 0.0.0.0/0

これでRDS用セキュリティグループは完成です。

RDS作成

次にRDSインスタンスを作成します。

aws rds create-db-instance \
        --db-instance-identifier "wp-test-db" \
        --allocated-storage "5" \
        --db-instance-class "db.t2.micro" \
        --engine "mysql" \
        --master-username "wordpress" \
        --master-user-password "wordpress" \
        --db-name "wordpress" \
        --vpc-security-group-ids ${VPC_SG_ID} \
        --db-subnet-group-name "mysql_dbsg"

作成したRDSインスタンスのステータスを確認します。
ステータスがavailableになったら作成完了です。
これが結構長いので、次のステップを先に進めたほうがよいと思います。

aws rds describe-db-instances \
        --db-instance-identifier "wp-test-db" \
         --query DBInstances[].DBInstanceStatus \
         --output text

上記の結果がavailableになったら、以下のコマンドでエンドポイントを取得します。

aws rds describe-db-instances \
        --db-instance-identifier "wp-test-db" \
        --query DBInstances[].Endpoint.Address \
        --output text

取得したエンドポイントは最後のWordPressインストールで使います。

PublicSubnet作成

次にWordPressを載せるEC2のためのサブネットを作成します。

まずはサブネットに紐付けるルーティングテーブルを作成します。

VPC_ROUTE_ID=` \
    aws ec2 create-route-table \
        --vpc-id ${VPC_ID} \
        --query RouteTable.RouteTableId \
        --output text \
` && echo ${VPC_ROUTE_ID}

作成したルーティングテーブルにルートを設定します。
WordPressはインターネットからのアクセスがあるため、
IGWへのルートを設定します。

aws ec2 create-route \
       --route-table-id ${VPC_ROUTE_ID} \
       --destination-cidr-block 0.0.0.0/0 \
       --gateway-id ${VPC_IGW_ID}

次にサブネットを作成します。

VPC_SUBNET_ID=` \
    aws ec2 create-subnet \
         --vpc-id ${VPC_ID} \
         --cidr-block "10.0.1.0/24" \
         --availability-zone ap-northeast-1a \
         --query Subnet.SubnetId \
         --output text \
` && echo ${VPC_SUBNET_ID}

なぜかでCLIで作成したサブネットはパブリックIPのマッピング
デフォルトでfalseになっているので、trueに設定します。

aws ec2 modify-subnet-attribute \
        --subnet-id ${VPC_SUBNET_ID} \
        --map-public-ip-on-launch

さらに先ほど作成したルーティングテーブルとサブネットを紐付けます。

aws ec2 associate-route-table \
        --route-table-id ${VPC_ROUTE_ID} \
        --subnet-id ${VPC_SUBNET_ID}

これでEC2用サブネットは完成です。

EC2用セキュリティグループ作成

次にEC2用のセキュリティグループを作成します。

VPC_SG_ID=` \
    aws ec2 create-security-group \
         --group-name "HTTP_SSH_IN_SG" \
         --description "HTTP_SSH_IN_SG" \
         --vpc-id ${VPC_ID} \
         --query GroupId \
         --output text \
` &&  echo ${VPC_SG_ID}

インターネット側からアクセスがあるので、80番を開けます。

aws ec2 authorize-security-group-ingress \
        --group-id ${VPC_SG_ID} \
        --protocol tcp \
        --port 80 \
        --cidr 0.0.0.0/0

今回はSSHでログインする予定はありませんが、一応22番も空けときます。

aws ec2 authorize-security-group-ingress \
       --group-id ${VPC_SG_ID} \
       --protocol tcp \
       --port 22 \
       --cidr 0.0.0.0/0

これでEC2用のセキュリティグループは完成です。

キーペア作成

次にキーペアを作成します。
しつこいですが、SSHでログインする予定はありません。
ですが、EC2インスタンスの作成に必要なので作成します。

aws ec2 create-key-pair  \
        --key-name "wp_test" \
        --query KeyMaterial \
        --output text \
> "${HOME}/wp_test.pem" \
&& chmod 400 "${HOME}/wp_test.pem" \
&& cat "${HOME}/wp_test.pem"

EC2作成

次にいよいよEC2インスタンスを作成します。
今回はEC2にログインせずにWordPressをインストールするために
User-Dataという機能を使います。

User-Dataはインスタンス作成時にBashかCloud-initを実行できる機能です。
今回はBashを使います。
※Cloud-initがわからないので、、

以下のshファイルを事前に用意します。

cat ${HOME}/wp_install.sh
#!/bin/sh
yum -y install httpd php php-mysql
chkconfig httpd on
wget -O - https://ja.wordpress.org/latest-ja.tar.gz | tar zxvf - -C /var/www/html
chown -R apache:apache /var/www/html/wordpress
service httpd start

次にインスタンスを作成します。

EC2_INSTANCE_ID=` \
    aws ec2 run-instances \
        --image-id "ami-cbf90ecb" \
        --instance-type "t2.micro" \
        --subnet-id ${VPC_SUBNET_ID} \
        --security-group-ids ${VPC_SG_ID} \
        --key-name "wp_test" \
        --user-data=file://${HOME}/wp_install.sh \
        --associate-public-ip-address \
        --query Instances[].InstanceId \
        --output text \
` && echo ${EC2_INSTANCE_ID}

以下のコマンドの結果がok×2になるまで待ちます。

aws ec2 describe-instance-status \
        --instance-ids ${EC2_INSTANCE_ID} \
        --query InstanceStatuses[].SystemStatus.Status \
        --output text \
&& aws ec2 describe-instance-status \
        --instance-ids ${EC2_INSTANCE_ID} \
        --query InstanceStatuses[].InstanceStatus.Status \
        --output text

上記コマンド結果がok×2になったら、以下のコマンドでURLを取得します。

EC2_INSTANCE_ENDPOINT=` \
    aws ec2 describe-instances \
        --filters "Name=instance-id,Values=${EC2_INSTANCE_ID}" \
        --query Reservations[].Instances[].NetworkInterfaces[].Association.PublicIp \
        --output text \
` && echo "http://${EC2_INSTANCE_ENDPOINT}/wordpress"

これでEC2インスタンスの作成は完了です。

WordPressのインストール

先ほど取得したEC2のURLにアクセスします。
するとWordPressのインストール画面になるので、以下のように入力して送信します。
データベース名    :wordpress
ユーザ名       :wordpress
パスワード      :wordpress
データベースのホスト名:[RDSのエンドポイント]

次の画面でインストールを実行し、WordPressのインストールは完了です。

まとめ

いかがでしたでしょうか。

コマンドの量が多いので、難しいと感じたかもしれません。
しかし、一つ一つのコマンドを紐解いていけば難しいことはありません。

また、紫本も一回やって終わりではなく、このように見方を変えると
何度も勉強に使えます。
今回やってみて私自身も大変勉強になりました。