見出し画像

「JAWS-UG CLI専門支部 #154R S3入門」に参加したよメモ

「JAWS-UG CLI専門支部 #154R S3入門」に参加させていただいたのでそのメモ。CLIを使えばAWS Management Consoleを使うよりも簡単にS3バケットの操作ができて超便利!とっても勉強になりました。ありがとうござました。

AWS CLIは

からダウンロードできる。最初に次のコマンドでaws cliの設定が必要。

$ aws configure

S3バケットの構築

次のコマンドで指定したリージョンにバケットを作成する。

$ aws s3 mb s3://${S3_BUCKET_NAME} --region ${AWS_REGION}

${S3_BUCKET_NAME}は作成するバケットの名前。グローバル(ユーザー、リージョンを含めたスコープ)で一意の名前にする必要がある。
${AWS_DEFAULT_REGION}はバケットを作成するリージョンを指定する。東京リージョンだったら"ap-northeast-1"。

--regionは指定しなくてもよいが、リージョンを間違ってバケットを作ってしまうと、バケットを削除しても正しいリージョンにしばらく(1~2時間くらい?)同じ名前のバケットを作成できないので悲しい気持ちになるらしい…。

バケットが出来たか確認するためには次のコマンド。

$ aws s3 ls

​S3オブジェクトの操作

S3バケットに格納するものはS3オブジェクトと呼ばれる。例えばファイルをS3バケットにアップロードすると、ファイル+メタ情報=オブジェクトとして扱われるようになる。

S3バケット内のオブジェクトの確認

S3バケット内に格納されているオブジェクトを確認するためには次のコマンドを使用する。

$ aws s3 ls s3://${S3_BUCKET_NAME}/

${S3_BUCKET_NAME}はオブジェクトのリストを取得するバケット名。

ファイルをS3バケットへアップロード

以下のコマンドでローカルのファイルをS3バケットへアップロードする。

$ aws s3 cp ${FILE_UPLOAD} s3://${S3_BUCKET_NAME}/

${FILE_UPLOAD}はローカルのファイル名。"index.html"とか。${S3_BUCKET_NAME}は格納する際の名前(バケット名)。

ファイルをS3バケットからダウンロード

以下のコマンドでS3バケットのオブジェクトをローカルにダウンロードする。

$ aws s3 cp s3://${S3_BUCKET_NAME}/${S3_OBJECT_NAME} ${FILE_DOWNLOAD}

${S3_BUCKET_NAME}はバケット名。${S3_OBJECT_NAME}はダウンロードするオブジェクトの名前。${FILE_DOWNLOAD}はダウンロードしたファイルをローカルに保存する際のファイル名。

オブジェクトの削除

以下のコマンドでS3バケットからオブジェクトを削除する。

$ aws s3 rm s3://${S3_BUCKET_NAME}/${S3_OBJECT_NAME}

${S3_BUCKET_NAME}はバケット名。${S3_OBJECT_NAME}は削除するオブジェクト名。

ファイルをS3バケットへアップロード(オブジェクトパス名指定)

S3バケットはフラットなオブジェクトストレージなので、内部的にはフォルダ構成を持っていない。ただし、オブジェクト名に"/"を含めることで疑似的なフォルダとみなすことができる。

以下のコマンドでローカルのファイルをS3バケット(オブジェクトパス指定付き)へアップロードする。

$ aws s3 cp ${FILE_UPLOAD} s3://${S3_BUCKET_NAME}/${S3_OBJECT_PREFIX}/

${FILE_UPLOAD}はアップロードしたいローカルのファイル名。${S3_BUCKET_NAME}はバケット名。${S3_OBJECT_PREFIX}は疑似的なフォルダ名。

大量のファイルをS3バケットに格納する際は、${S3_OBJECT_PREFIX}をバラバラに設定した方が読み取り、書き込み性能がアップするというテクニックが昔はあったらしいが今は不要。(確かにAWS Solution Architect Assosiateの過去問にそんな問題あったなー)

オブジェクトの移動

以下のコマンドでS3バケット内のオブジェクトを移動できる。

$ aws s3 mv s3://${S3_BUCKET_NAME_SOURCE}/${S3_OBJECT_SOURCE} \
s3://${S3_BUCKET_NAME_DESTINATION}/${S3_OBJECT_DESTINATION}

${S3_BUCKET_NAME_SOURCE}, ${S3_OBJECT_SOURCE}は移動元のバケット名とオブジェクト名。${S3_BUCKET_NAME_DESTINATION}, ${S3_OBJECT_DESTINATION}は移動先のバケット名とオブジェクト名。

疑似フォルダ以下のオブジェクトを一括削除

以下のコマンドで疑似フォルダ以下のオブジェクトを一括削除する。

$ aws s3 rm --recursive s3://${S3_BUCKET_NAME}/${S3_OBJECT_PREFIX}

${S3_BUCKET_NAME}はバケット名。${S3_OBJECT_PREFIX}は疑似的なフォルダ名。--recursiveを指定することで、疑似的なフォルダ内にオブジェクトがある状態でもまとめてオブジェクトを削除することができる。

バケットの削除

以下のコマンドでバケットを削除する。

$ aws s3 rb s3://${S3_BUCKET_NAME} --force

${S3_BUCKET_NAME}は削除するバケット名。

--forceオプションでバケット内にオブジェクトが存在してもバケットを削除することができる。

ローカルファイルとオブジェクトの同期

以下のコマンドで、ローカルのファイルとバケットのオブジェクトを同期させることができる。

$ aws s3 sync . "s3://${S3_BUCKET_NAME}/" \
   --exclude "${S3_SYNC_EXCLUDE}" \
   --acl public-read

${S3_BUCKET_NAME}はバケット名。${S3_SYNC_EXCLUDE}は同期から除外したいファイル名。例)".git*"。gitのファイルを同期する際、.git/*をS3バケットにコピーしないように--excludeオプションを使う。.gitをコピーするとセキュリティリスクとなる可能性があるため。(過去のコミットでセキュリティに関する情報がコミットされていたりする)

Webサイトホスティング

S3はファイルを置くことで静的なコンテンツのWebサイトとして使用することができる。(S3バケットにHTMLファイル等一式を格納する)

$ aws s3 website "s3://${S3_BUCKET_NAME}" \
 --index-document ${S3_DOC_INDEX} \
 --error-document ${S3_DOC_ERROR}

${S3_BUCKET_NAME}はWebサイトにしたいバケット名。${S3_DOC_INDEX}はindex.htmlとなるオブジェクト名。${S3_DOC_ERROR}はエラー表示時のオブジェクト名(error.htmlに当たるもの)。

--error-documentを指定しないと、オブジェクトが無い時にS3のエラーが表示されるのでかっこ悪いらしい。またHTTPのみでHTTPSには非対応。

Webサイトエンドポイント(URL)は東京リージョンの場合は以下のような感じになる。

http://${S3_BUCKET_NAME}.s3-website-ap-northeast-1.amazonaws.comWe

Webサイトエンドポイントはリージョンの新しさによって構成が異なる。

s3-website ダッシュ(-) リージョンになるパターン
http://bucket-name.s3-website-(リージョン名).amazonaws.com

s3-website ドット(.) リージョンになるパターン
http://bucket-name.s3-website.(リージョン名).amazonaws.com

東京リージョンは上のパターン。(古いリージョンがこのパターンらしい)

署名付きURLの発行

Webサイトホスティングの機能として、一定時間のみアクセス可能な署名付きURLというものを作ることができる。

$ aws s3 presign s3://${S3_BUCKET_NAME}/${S3_OBJECT_NAME} \
 --expires-in ${S3_PRESIGN_SECONDS}

${S3_BUCKET_NAME}はバケット名。${S3_OBJECT_NAME}は署名付きURLを使用して公開するオブジェクト名。${S3_PRESIGN_SECONDS}は公開する秒数。120とかを指定すると2分間そのオブジェクトが公開される。

戻り値として署名付きURLが表示されるので、そのURLをブラウザ等でアクセスしてもらう。

指定した時間が過ぎてから署名付きURLにアクセスすると、AccessDenied/Request has expiredが返ってくる。

例えば、次のオンラインミーティングのURLを共有する際に使用したり、受講者に一時的にファイルをダウロードさせる用途等に使用できる。

その他

・ブラウザでChromeはトラブルが多い印象、 FireFoxの方が良い
・S3 APIコールの無料枠が少ない
・ハンズオンの資料はSphinxで作られている

Sphinxちょっと勉強してみたい。

この記事が気に入ったらサポートをしてみませんか?