JAWS-UG CLI専門支部 #154R S3入門参加 まとめ

# S3入門編に参加してみて
JAWS-UG　CLI専門支部　#154R S3入門に参加。
S3の操作をAWS CLIを通して学んだ。1時間遅れで参加したけど、なんとか全ての操作をやりきった。
茅場町開催で一度参加したことあるけど、なかなか時間があわずに2回目以降はいけていない。
オンライン開催になってから今のところ毎回参加できているので本当に嬉しい。:relaxed:
運営者の波多野さんありがとうございます！
[★JAWS-UG CLI専門支部 #154R S3入門 イベントページ](https://jawsug-cli.connpass.com/event/173009/)

## できるようになったこと
- S3バケットの構築S3バケットを作成
- S3オブジェクトの操作（確認、アップロード、ダウンロード、移動、削除）　
- S3バケットの同期
- webサイトホスティング
- 署名付きURLの発行

[★教材ページ](http://prototype-handson-cli.s3-website-ap-northeast-1.amazonaws.com/handson_light-aws_service/handson_light-aws_service-s3-highlevel/index.html)

### S3バケットの構築
```aws s3 mb s3://${S3_BUCKET_NAME} --region ${AWS_DEFAULT_REGION}```
\${S3_BUCKET_NAME}=バケットネームを指定。一意である必要がある。
\${AWS_DEFAULT_REGION}=バケットを作成するリージョン。東京リージョンは'ap-northeast-1'。

### S3オブジェクトの操作
・オブジェクトの確認
```aws s3 ls s3://${S3_BUCKET_NAME}/```

・オブジェクトのアップロード
```aws s3 cp ${FILE_UPLOAD} s3://${S3_BUCKET_NAME}/```
\${FILE_UPLOAD}=コピー元を指定

・オブジェクトのダウンロード
```aws s3 cp s3://${S3_BUCKET_NAME}/${S3_OBJECT_NAME} ${FILE_DOWNLOAD}```
\${S3_BUCKET_NAME}/${S3_OBJECT_NAME}=S3内のオブジェクトを指定。
\${FILE_DOWNLOAD}=ローカルのダウンロード先を指定

・オブジェクトの削除
```aws s3 rm s3://${S3_BUCKET_NAME}/${S3_OBJECT_NAME}```

・オブジェクトの移動
```aws s3 mv s3://${S3_BUCKET_NAME_SOURCE}/${S3_OBJECT_PREFIX_SOURCE} \
  s3://${S3_BUCKET_NAME_DESTINATION}/${S3_OBJECT_PREFIX_DESTINATION}```
\${S3_BUCKET_NAME_SOURCE}/\${S3_OBJECT_PREFIX_SOURCE}=移動元のオブジェクトを指定
\${S3_BUCKET_NAME_DESTINATION}/\${S3_OBJECT_PREFIX_DESTINATION}=移動先のオブジェクトを指定

・オブジェクトの削除（パス単位）
```aws s3 rm  --recursive s3://${S3_BUCKET_NAME}/${S3_OBJECT_PREFIX}```
recursive指定でパス含めて削除。

### S3バケットとの同期
事前にgitリポジトリからローカルにcloneしてデータをアップロードしておく
```cd ${DIR_S3_TRANSFER} \
  && aws s3 sync . "s3://${S3_BUCKET_NAME}/" \
    --exclude "${S3_SYNC_EXCLUDE}" --acl public-read ```
exclude ${S3_SYNC_EXCLUDE}=同期の対象から外すファイルを指定。（".git*")
acl public-read =オブジェクトの公開読み取りを許可

仮想ホスティングエンドポイントの取得
```S3_BUCKET_ENDPOINT=" \
  ${S3_BUCKET_NAME}.s3.$( \
\    aws s3api get-bucket-location \
      --bucket ${S3_BUCKET_NAME} \
      --output text \
  ).amazonaws.com" \
  && echo ${S3_BUCKET_ENDPOINT}```

仮想ホスティングエンドポイントにオブジェクトのパスを追加
```S3_OBJECT_NAME='img.jpg'
URL_S3_OBJECT="${S3_BUCKET_ENDPOINT}/${S3_OBJECT_NAME}" \
  && echo ${URL_S3_OBJECT}```
\${URL_S3_OBJECT}をブラウザで参照するとオブジェクトのimgファイルを確認できる

### S3バケットのWebサイトホスティング設定
Webサイトホスティング
```aws s3 website "s3://${S3_BUCKET_NAME}" \
  --index-document ${S3_DOC_INDEX} \
  --error-document ${S3_DOC_ERROR}```
index-document \${S3_DOC_INDEX}　正常表示するページを指定
error-document \${S3_DOC_ERROR}　4XX系のエラーが発生する際に表示するページを指定

エンドポイントを取得
```S3_BUCKET_WEBSITE_ENDPOINT=" \
  ${S3_BUCKET_NAME}.s3-website-$( \
    aws s3api get-bucket-location \
      --bucket ${S3_BUCKET_NAME} \
      --output text \
  ).amazonaws.com" \
  && echo ${S3_BUCKET_WEBSITE_ENDPOINT}```
※リージョンによってエンドポイントの形式が変わるので注意
　昔からあるリージョン：s3-website（バージニア北部や東京）
　新しめのリージョン：s3-website.（ソウルや大阪）
詳細は以下のリンクを
★[ウェブサイトエンドポイントについて](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/WebsiteEndpoints.html)
★[リージョン別エンドポイント](https://docs.aws.amazon.com/general/latest/gr/s3.html#s3_website_region_endpoints)

### 署名付きURLの発行
```aws s3 presign s3://${S3_BUCKET_NAME}/${S3_OBJECT_NAME} \
  --expires-in ${S3_PRESIGN_SECONDS}```
presign s3://\${S3_BUCKET_NAME}/\${S3_OBJECT_NAME} 署名対象のオブジェクト名を指定
expires-in \${S3_PRESIGN_SECONDS}　署名の有効期限。単位は秒。