このハンズオンでは、ハイレベルS3コマンドの全てを使ってみます。
ハイレベルS3コマンドが使えれば、S3をNASのように利用できるようになるので非常に便利です。
(但し、ファイル総数が1000を超える場合は、急速にパフォーマンスが低下するらしいのでご注意ください。)
ハイレベルS3コマンド: http://docs.aws.amazon.com/cli/latest/reference/s3/
- cp
- ls
- mb
- mv
- rb
- rm
- sync
- website
前提条件
- [JAWS-UG CLI] 総合案内: http://qiita.com/tcsh/items/14c3278f69ab073afe0f を確認して、必要な手順を終えていること。
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.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ユーザ名>
- 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}/
(戻り値なし)
- 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
- ファイルを新規フォルダに置く場合 (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
- ファイルのダウンロード (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
- ファイルの移動 (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
- ファイルの削除 (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
- バケットの同期 (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
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
- 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
(戻り値なし)
- ブラウザでコンテンツにアクセス
=================================
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です。
- バケットを削除 (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