[JAWS-UG CLI] ACM入門 #7 EC2によるWebコンテンツの作成

これは<A HREF="http://qiita.com/zakky/items/29cf8095f6faa24f216b" target=_blank>AWS Certificate Manager (ACM)入門ハンズオン資料</A>の一部です。
最初から続けて行っている場合「0.準備」の各項は作業不要です。<A HREF="#1-webサーバec2インスタンスの作成">第1項へ進んでください</A>。

前提条件
========

デフォルトVPCとサブネットが存在すること
-----------
us-east-1 リージョンにデフォルトVPCと、デフォルトVPCの各AZにサブネットが1つずつ存在すること。
アカウントを作成後、VPCに変更削除をしていなければ問題ありません。
（クラシックEC2が利用可能な古いアカウントは対象外です。無料で新規アカウントを作成してください）
何らかの変更を加えている方はVPCの知識があると思われますので適宜設定してください。

必要な権限
-----------

トラブル防止の為、全ての操作が可能なクレデンシャル（アカウント）を原則として使用してください。

AWS CLI
-------

以下のバージョンで動作確認済

* AWS CLI 1.10.63

```bash:コマンド:
aws --version
```

```text:結果(例):
      aws-cli/1.10.63 Python/2.7.11 Darwin/15.6.0 botocore/1.4.53
```

古い場合は次のコマンドを実行して最新版に更新しましょう。

```bash:コマンド:
sudo -H pip install -U awscli
```


0. 準備
=======


0.1. リージョンの決定
---------------------

今回はバージニアリージョン(us-east-1)で作業してください。

```bash:変数の設定:
export AWS_DEFAULT_REGION='us-east-1'
```

0.2. 変数の確認
---------------

プロファイルが想定のものになっていることを確認します。

```bash:変数の確認:
aws configure list
```
```text:結果(例):
            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile                <not set>             None    None
      access_key     ****************2LMA shared-credentials-file
      secret_key     ****************VXyK shared-credentials-file
          region                us-east-1      config-file    ~/.aws/config
```



1. VPC環境の情報取得
===========

1.1. VPC IDの取得
---------------

```bash:コマンド:
VPC_ID=` aws ec2 describe-vpcs \
          --filters Name=isDefault,Values=true \
          --query 'Vpcs[].VpcId' \
          --output text ` && echo ${VPC_ID}
```

```text:結果(例):
      vpc-xxxxxxxx
```
ここで出力結果がこのように出ない方は、デフォルトVPCが存在しないか値を正しく取得できていません。
そのままでは以後の作業ができませんから、すぐにチューターまたは講師に声を掛けてください。

1.2. Subnet IDの取得
---------------

```bash:コマンド:
aws ec2 describe-subnets \
 --query "Subnets[?VpcId==\`${VPC_ID}\`].[SubnetId,CidrBlock]" --output text
```

```text:結果(例):
      subnet-77777777 172.31.48.0/20
      subnet-55555555 172.31.32.0/20
      subnet-11111111 172.31.0.0/20
      subnet-33333333 172.31.16.0/20
```

出力結果は左がsubnet id、右がそのサブネットのCIDRブロックです。
172.31.0.0/20のSubnet idを変数 SUBNET_ID1 へ、172.31.16.0/20のものをSUBNET_ID2 へ、コピーペーストして変数へ格納します。

```bash:コマンド:
SUBNET_ID1="subnet-11111111"
SUBNET_ID2="subnet-33333333"
```



2. Webサーバ(EC2インスタンス)の作成
===========

2.1. 鍵ペアの作成
---------------

鍵ペア ec2-handson を作成します。
秘密鍵ファイルは ~/.ssh/ec2-handson.pem に保存されます。
まずは既にファイルが存在しないか確認します。

```bash:コマンド
EC2_KEY_NAME="ec2-handson"
FILE_SSH_KEY="${HOME}/.ssh/${EC2_KEY_NAME}.pem"
ls ${FILE_SSH_KEY}
```
```text:結果(例):
      ls: cannot access /home/hoge/.ssh/ec2-handson.pem: No such file or directory
```

もしもファイルが既に存在した場合は、 EC2_KEY_NAME を別な物に変更してやり直してください。
問題無ければ鍵ペアの作成を行います。

```bash:コマンド
aws ec2 create-key-pair --key-name ${EC2_KEY_NAME} --query 'KeyMaterial' \
 --output text > ${FILE_SSH_KEY} && cat ${FILE_SSH_KEY} && chmod 600 ${FILE_SSH_KEY}
```
```text:結果(例):
      -----BEGIN RSA PRIVATE KEY-----
      MIIEowIBAAKCAQEAg4AFnT934UdMmuSADElYSWzOQ/XpXUc0570zKwtDB3RXS9Fi8YP8J5jv6QRl
      adC9842sHMld7gxF2oqg2zDa82t0usKo27dutwziH+XK/HTOerza7FAGGwZM1vBz1WE5sEar1oWr
      DhWxXgJ1IXznORRPNzE697ljJjFYD/xlmh50pyn0e86ZuydXttlV8SinXEG0W67Ks/H/mfZLoAa6
      .....（本当はもっと長い）
      Kfx3RPKQlvaDpXOO60pIdn31RV16wxrxqTBxZ161XM6GMR1ltAp0FmQ9FQC76vBwgsDtxBidkz5e
      AqUB9GoLQ8npFPJBF+sRcDGD6EeHdI4fn2JhQXB+WOU5AoGBAKvXu+Xm1Kx6TSAsRchCyUdZmF2y
      MfRletfQDp2Hbth3SnNu2MaFQs8C+ODyx7XTx/13LW247AGVsSfq63jovntOL7PRuFA=
      -----END RSA PRIVATE KEY-----
```

2.2. セキュリティグループの作成
---------------

セキュリティグループ ec2-handson-sg を作成します。

```bash:コマンド:
SG_NAME="ec2-handson-sg"
SG_ID=`aws ec2 create-security-group --group-name ${SG_NAME} \
 --description ${SG_NAME} --output text` && echo ${SG_ID}
```
```text:結果(例):
      sg-59c3e63d
```

ALBからのみアクセス可能なよう、VPC内からのHTTP接続をセキュリティグループに追加します。

```bash:コマンド:
aws ec2 authorize-security-group-ingress --group-id ${SG_ID} --protocol 'tcp' --port 80 --cidr 172.31.0.0/19
```
```text:結果:
      返り値なし
```

2.3. EC2インスタンス起動用userdataの作成
-----------------------

AMAZON Linuxを起動する際、nginxを自動的にインストールして起動するためのuserdataファイルを作成します。

```bash:コマンド:
USERDATA_FILENAME="userdata"
cat > ${USERDATA_FILENAME} << EOF
#!/bin/bash
yum -y install nginx
chkconfig nginx on
service nginx start
EOF
cat ${USERDATA_FILENAME}
```
```text:結果:
      #!/bin/bash
      yum -y install nginx
      chkconfig nginx on
      service nginx start
```

2.4. EC2インスタンスの起動
-----------------------

作成したuserdataを用いてEC2インスタンスを起動します。
今回はAmazon Linuxを使用します。
インスタンスタイプ t2.micro 、使用するAMIを ami-b73b63a0 としています。

```bash:コマンド:
EC2_INSTANCE_TYPE="t2.micro"
EC2_IMAGE_ID="ami-b73b63a0"
EC2_INSTANCE_ID=`aws ec2 run-instances --user-data file://${USERDATA_FILENAME} \
 --image-id ${EC2_IMAGE_ID} --instance-type ${EC2_INSTANCE_TYPE} \
 --key-name ${EC2_KEY_NAME} --security-group-ids ${SG_ID} --subnet-id ${SUBNET_ID1} \
 --query Instances[].InstanceId --output text` && echo ${EC2_INSTANCE_ID}
```
```text:結果(例):
      i-00938c820b919d12d
```

インスタンスIDが出力されなければ起動に失敗しています。確認してください。