[JAWS-UG CLI] S3:#13 S3バケットの作成 (独自ドメイン)

Route53でのドメイン設定前に、S3上で公開用のバケットを作成します。


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


S3への権限
----------


AWS CLIのバージョン
-------------------

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

* AWS CLI 1.10.38

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

```text:結果(例):
      aws-cli/1.10.38 Python/2.7.11 Darwin/15.5.0 botocore/1.4.28
```


ドメインの管理権限 (独自ドメインを利用する場合)
-----------------------------------------------

独自ドメインを利用する場合は、そのドメインのNSレコードを変更する権限が必要です。
(一般的にはドメインの管理委託先(レジストラ)のWebサイトで変更ツールを提供しています。)


0. 準備
=======


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

構築するリージョンを決めます。 (カレントユーザが利用するカレントリージョンも切り変わります。)

```bash:変数の設定(東京リージョンの場合):
export AWS_DEFAULT_REGION='ap-northeast-1'
```


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

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

```bash:コマンド:
aws configure list
```

```text:結果(例)

            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile         administrator-prjz-mbp13        env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region                         ap-northeast-1  env    AWS_DEFAULT_REGION
```

AssumeRoleを利用している場合はprofileが '<not set>'と表示されます。 それ以外のときにprofileが '<not set>' と表示される場合は、以下を実行してください。

```bash:変数の設定:
export AWS_DEFAULT_PROFILE=<IAMユーザ名>
```


1. 事前作業
===========


1.1. ドメイン名
---------------

利用するドメイン名を決定します。

```bash:変数の設定:
DOMAIN_NAME='<管理しているドメインもしくはサブドメイン>'
```

注釈: ハンズオンでは、下記のようなサブドメインを利用しましょう。

```bash:
DOMAIN_SUFFIX='<管理しているドメインもしくはサブドメイン>'
DOMAIN_NAME="handson$(date +%Y%m%d).${DOMAIN_SUFFIX}"
```

2016/6/20開催のハンズオンに限り、独自ドメインを保持していない場合は下記を利用してください。

```bash:
DOMAIN_SUFFIX='awsz.org'
DOMAIN_PREFIX='<個人を特定する名前>'
DOMAIN_NAME="${DOMAIN_PREFIX}.handson$(date +%Y%m%d).${DOMAIN_SUFFIX}"
```

```bash:変数の確認:
cat << ETX

        DOMAIN_NAME: ${DOMAIN_NAME}

ETX
```


1.2. バケット名の指定
---------------------

S3バケット名を決めます。 (S3上でユニークである必要があります)

独自ドメインで公開したい場合は、そのドメイン名のFQDN(完全ドメイン名)でバケットを作成する必要があります。
 (この記事の例では、www.example.jpがFQDNです。)

```bash:変数の設定:
S3_BUCKET_NAME="www.${DOMAIN_NAME}" \
        && echo "${S3_BUCKET_NAME}"
```


2. コンテンツバケットの作成
===========================


2.1. バケットの作成 (mb)
------------------------

コンテンツ公開用のS3バケットを作成します。

```bash:変数の確認:
cat << ETX

        AWS_DEFAULT_REGION: ${AWS_DEFAULT_REGION}
        S3_BUCKET_NAME:     ${S3_BUCKET_NAME}

ETX
```

```bash:コマンド:
aws s3 mb s3://${S3_BUCKET_NAME} \
        --region ${AWS_DEFAULT_REGION}
```

```text:結果(例):
      make_bucket: s3://www.example.jp/
```


3. コンテンツの転送 (sync)
==========================


3.1. コンテンツの用意
---------------------

今回のハンズオンでは、こちらで用意したサンプルコンテンツを利用します。
GitHubから取得してクライアントPCに保存してください。

```bash:コマンド:
git clone https://github.com/opelab/jawsug-cli-sample-web.git \
        && cd jawsug-cli-sample-web
```


3.2. コンテンツの同期
---------------------

クライアントPCに保存してあるサンプルコンテンツを、先程作成したコンテンツ公開用のS3バケットに同期します。

```bash:コマンド:
aws s3 sync . "s3://${S3_BUCKET_NAME}/" \
        --acl public-read --exclude ".git*"
```

```text:結果(例):

      upload: ./error.html to s3://www.example.jp/error.html
      upload: ./index.html to s3://www.example.jp/index.html
      upload: ./img.jpg to s3://www.example.jp/img.jpg
```


4. websiteホスティングの設定 (website)
======================================

コンテンツ公開用のS3バケットのwebsiteホスティング設定を行ないます。

```bash:変数の確認
cat << ETX

        S3_BUCKET_NAME: ${S3_BUCKET_NAME}

ETX
```

```bash:コマンド:
aws s3 website "s3://${S3_BUCKET_NAME}" \
        --index-document index.html \
        --error-document error.html
```

```text:結果:

      (戻り値なし)
```

今回は、アップロードしたファイルのみ外部からアクセス許可しています。
(後から追加されたファイルは別途アクセス許可の設定が必要になります。)



5. 事後作業
===========


アクセス確認
------------

コンテンツ公開用のS3バケットがコンテンツ公開設定になっているか確認します。 この時点ではS3が自動的に付与するURLでアクセスします。

```bash:変数の設定:
S3_BUCKET_LOCATION=$( \
        aws s3api get-bucket-location \
          --bucket ${S3_BUCKET_NAME} \
          --output text \
) \
        && echo ${S3_BUCKET_LOCATION}
```

```bash:変数の確認:
cat << ETX

        S3_BUCKET_NAME:     ${S3_BUCKET_NAME}
        S3_BUCKET_LOCATION: ${S3_BUCKET_LOCATION}

ETX
```

```bash:変数の設定:
S3_BUCKET_ENDPOINT="${S3_BUCKET_NAME}.s3-website-${S3_BUCKET_LOCATION}.amazonaws.com" \
        && echo ${S3_BUCKET_ENDPOINT}
```

```text:結果(例):

      www.example.jp.s3-website-ap-northeast-1.amazonaws.com
```

Webブラウザで EndPoint が開ければOKです。


完了
====

コンテンツ公開用のS3バケットに独自ドメイン名でアクセスできるように、Route53での作業を行ないます。