[JAWS-UG CLI] S3:#1 ハイレベルS3コマンドを使ってみる (バケットの作成から静的Webホスティング、削除まで)

More than 1 year has passed since last update.

このハンズオンでは、ハイレベルS3コマンドの全てを使ってみます。

ハイレベルS3コマンドが使えれば、S3をNASのように利用できるようになるので非常に便利です。
(但し、ファイル総数が1000を超える場合は、急速にパフォーマンスが低下するらしいのでご注意ください。)

ハイレベルS3コマンド: http://docs.aws.amazon.com/cli/latest/reference/s3/

  • cp
  • ls
  • mb
  • mv
  • rb
  • rm
  • sync
  • website

前提条件

S3への権限

S3に対してフルアクセス権限があること。

AWS CLI

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

  • AWS CLI 1.10.0
  • AWS CLI 1.7.39
  • AWS CLI 1.7.12
コマンド
aws --version
結果(例)
aws-cli/1.10.0 Python/2.7.5 Darwin/13.4.0 botocore/1.3.22

0. 準備

0.1. リージョンの決定

作成するS3バケットのリージョンを決めます。

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

変数の設定
export AWS_DEFAULT_REGION='ap-northeast-1'

0.2. 変数の確認

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

変数の確認
aws configure list
結果(例)
            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile        s3Full-prjZ-mbp13              env    AWS_DEFAULT_PROFILE
      access_key     ****************LOAQ shared-credentials-file
      secret_key     ****************I1O1 shared-credentials-file
          region           ap-northeast-1              env    AWS_DEFAULT_REGION

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

コマンド
export AWS_DEFAULT_PROFILE=<IAMユーザ名>

1. S3バケットの作成

1.1. 組織名/プロジェクト名の決定

S3バケット名を決めます。
(英小文字と数字が使えます。S3上でユニークである必要があります。英大文字は使用できません。)

ここでは、組織名-プロジェクト名-handsonという名前のバケットを利用するものとします。

コマンド
ORG_NAME=<組織名>
PRJ_NAME=<プロジェクト名>
コマンド(例)
S3_BUCKET_NAME="${ORG_NAME}-handson-$(date +%Y%m%d%H%M)" \
  && echo ${S3_BUCKET_NAME}

1.2. 同名バケットの不存在確認

コマンド
aws s3 ls s3://${S3_BUCKET_NAME}/
結果
A client error (NoSuchBucket) occurred when calling the ListObjects operation: The specified bucket does not exist

1.3. バケット作成 (mb)

変数の確認
cat << ETX

        S3_BUCKET_NAME: ${S3_BUCKET_NAME}

ETX

バケットを作成します。

コマンド
aws s3 mb s3://${S3_BUCKET_NAME}
結果(例)
make_bucket: s3://corp-handson-2016020118

1.4. バケットの確認 (ls)

バケットを表示します。

コマンド
aws s3 ls | grep ${S3_BUCKET_NAME}
結果(例)
2015-03-26 13:44:51 corp-handson-2016020118

1.5. ファイルの確認 (ls)

バケットの中身を表示すると、まだファイルがありません。

コマンド
aws s3 ls s3://${S3_BUCKET_NAME}/
結果(例)
(戻り値なし)

2. S3にファイル保存

2.1. サンプルファイルの準備

コマンド
FILE_LOCAL='handson.data'
touch ${FILE_LOCAL}

2.2. ファイルをアップロード (cp)

変数の確認
cat << ETX

        S3_BUCKET_NAME: ${S3_BUCKET_NAME}
        FILE_LOCAL:     ${FILE_LOCAL}

ETX
コマンド
aws s3 cp ${FILE_LOCAL} s3://${S3_BUCKET_NAME}/
結果(例)
upload: ./handson.data to s3://corp-handson-2016020118/handson.data

2.3. 確認 (ls)

バケットの中身を表示すると、転送されたファイルがあることがわかります。

コマンド
aws s3 ls s3://${S3_BUCKET_NAME}/
結果(例)
2015-03-26 13:45:16        0 handson.data

3. ファイルを新規フォルダに置く場合 (cp)

3.1. フォルダ名の決定

コマンド
S3_PATH='dir1'

3.2. ファイルをアップロード (cp)

変数の確認
cat << ETX

        FILE_LOCAL:     ${FILE_LOCAL}
        S3_BUCKET_NAME: ${S3_BUCKET_NAME}
        S3_PATH:        ${S3_PATH}

ETX
コマンド
aws s3 cp ${FILE_LOCAL} s3://${S3_BUCKET_NAME}/${S3_PATH}/
結果(例)
upload: ./handson.data to s3://corp-handson-2016020118/dir1/handson.data

4. ファイルのダウンロード (cp)

コマンド
S3_OBJ='handson.data'
FILE_LOCAL='local.data'
変数の確認
cat << ETX

        S3_BUCKET_NAME: ${S3_BUCKET_NAME}
        S3_OBJ:         ${S3_OBJ}
        FILE_LOCAL:     ${FILE_LOCAL}

ETX
コマンド
aws s3 cp s3://${S3_BUCKET_NAME}/${S3_OBJ} ${FILE_LOCAL}
結果(例)
download: s3://corp-handson-2016020118/handson.data to ./local.data

確認

コマンド
ls ${FILE_LOCAL}
結果
local.data

5. ファイルの移動 (mv)

コマンド
S3_BUCKET_NAME_SRC=${S3_BUCKET_NAME}
S3_BUCKET_NAME_DST=${S3_BUCKET_NAME}
S3_OBJ_SRC=dir1/handson.data
S3_OBJ_DST=dir2/handson2.data
変数の確認
cat << ETX

        S3_BUCKET_NAME_SRC: ${S3_BUCKET_NAME_SRC}
        S3_BUCKET_NAME_DST: ${S3_BUCKET_NAME_DST}
        S3_OBJ_SRC:         ${S3_OBJ_SRC}
        S3_OBJ_DST:         ${S3_OBJ_DST}

ETX
コマンド
aws s3 mv s3://${S3_BUCKET_NAME_SRC}/${S3_OBJ_SRC} s3://${S3_BUCKET_NAME_DST}/${S3_OBJ_DST}
結果(例)
move: s3://corp-handson-2016020118/dir1/handson.data to s3://corp-handson-2016020118/dir2/handson2.data
コマンド
aws s3 ls s3://${S3_BUCKET_NAME_SRC}/${S3_OBJ_SRC}
結果(例)
(戻り値なし)
コマンド
aws s3 ls s3://${S3_BUCKET_NAME_DST}/${S3_OBJ_DST}
結果(例)
2015-03-08 15:46:31          0 handson2.data

6. ファイルの削除 (rm)

コマンド
S3_OBJ=${S3_OBJ_DST}
変数の確認
cat << ETX

        S3_BUCKET_NAME: ${S3_BUCKET_NAME}
        S3_OBJ:         ${S3_OBJ}

ETX
コマンド
aws s3 ls s3://${S3_BUCKET_NAME}/${S3_OBJ}
結果(例)
2015-03-08 15:46:31          0 handson2.data
コマンド
aws s3 rm s3://${S3_BUCKET_NAME}/${S3_OBJ}
結果(例)
delete: s3://corp-handson-2016020118/dir2/handson2.data

7. バケットの同期 (sync)

7.1. コンテンツの用意

(gitが使える場合)

コマンド
git clone https://github.com/opelab/jawsug-cli-sample-web.git && cd jawsug-cli-sample-web
結果
      Cloning into 'jawsug-cli-sample-web'...
      remote: Counting objects: 5, done.
      remote: Total 5 (delta 0), reused 0 (delta 0), pack-reused 5
      Unpacking objects: 100% (5/5), done.
      Checking connectivity... done.
コマンド
ls
結果
error.html  img.jpg         index.html

(gitが使えない場合)

http://jawsug-cli.s3-website-ap-northeast-1.amazonaws.com/jawsug-cli-sample-web.zip を取得して、解凍し、解凍後のディレクトリにcdコマンドで移動してください。

7.2. コンテンツの同期

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

変数の確認
cat << ETX

        S3_BUCKET_NAME: ${S3_BUCKET_NAME}

ETX
コマンド(gitの場合)
aws s3 sync . "s3://${S3_BUCKET_NAME}/" \
  --acl public-read \
  --exclude ".git*"
結果(例)
      upload: ./index.html to s3://corp-handson-2016020118/index.html
      upload: ./img.jpg to s3://corp-handson-2016020118/img.jpg
      upload: ./error.html to s3://corp-handson-2016020118/error.html

7.3. 確認 (ls)

バケットの中身を表示すると、同期されたファイルがあることがわかります。

コマンド
aws s3 ls s3://${S3_BUCKET_NAME}/
結果(例)
2015-03-09 19:52:13 186 error.html
2015-03-09 19:52:13 55560 img.jpg
2015-03-09 19:52:12 255 index.html
2015-03-09 19:46:25 0 test.data

8. website hosting (website)

変数の確認
cat << ETX

        S3_BUCKET_NAME: ${S3_BUCKET_NAME}

ETX
コマンド(通常)
aws s3 website "s3://${S3_BUCKET_NAME}" \
  --index-document index.html \
  --error-document error.html
結果(例)
(戻り値なし)

9. ブラウザでコンテンツにアクセス

変数の確認
cat << ETX

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

ETX
コマンド
S3_BUCKET_ENDPOINT="${S3_BUCKET_NAME}.s3-website-`aws s3api get-bucket-location --bucket ${S3_BUCKET_NAME} --output text`.amazonaws.com" \
        && echo ${S3_BUCKET_ENDPOINT}
結果(例)
      corp-handson-2016020118.s3-website-ap-northeast-1.amazonaws.com

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

10. バケットを削除 (rb)

10.1. バケットを空にする

事前にファイルを全て削除しておく必要があります。

変数の確認
cat << ETX

        S3_BUCKET_NAME: ${S3_BUCKET_NAME}

ETX
コマンド
aws s3 rm s3://${S3_BUCKET_NAME}/ \
  --recursive
結果(例)
      delete: s3://opelab-prj04-handson/error.html
      delete: s3://opelab-prj04-handson/index.html
      delete: s3://opelab-prj04-handson/img.jpg
      delete: s3://opelab-prj04-handson/handson.data

10.2. バケットの削除

変数の確認
cat << ETX

        S3_BUCKET_NAME: ${S3_BUCKET_NAME}

ETX
コマンド
aws s3 rb s3://${S3_BUCKET_NAME}
結果(例)
remove_bucket: s3://corp-handson-2016020118/
コマンド
aws s3 ls s3://${S3_BUCKET_NAME}/
結果
A client error (NoSuchBucket) occurred when calling the ListObjects operation: The specified bucket does not exist

完了