AWS CLIからS3を扱う

たぶん、どこかに素敵な記事があると思いますが、自分の備忘録として。

## 動機

S3に静的コンテンツをデプロイし、Route53+CloudFrontでオートスケールなかたちでホスティングする...という仕事を頼まれたのだが、適当にググってAWSのコンソールをポチポチしてても、なんだかちっともうまくいかなかった。
それで、ちゃんと再学習しないといけないな、と思い、きっちりとAWSの公式ドキュメントを読みながら、あれこれやってみる。
そして、あとでわからなくならないように、メモを残しておく。

## AWS S3の公式ドキュメント

まず[Amazon S3 とは何ですか](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/Welcome.html)を読んだ。が、ここはただの目次のようなページ。
上から順番に、まず[製品の全般的な概要と料金体系](https://aws.amazon.com/jp/s3/)を読んだが、ここはS3の宣伝および特徴の紹介のようなページ。続いて[Amazon S3 の実践的入門](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/gsg/GetStartedWithS3.html)に進む。ここも入門記事の目次的なページだった。[Amazon S3 へのサインアップ](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/gsg/SigningUpforS3.html)に進んだところ、先程の https://aws.amazon.com/jp/s3/ から「開始方法」に進んで画面上の指示に従えという。
言われたとおりにしてみると[Amazon S3 の開始方法](https://aws.amazon.com/jp/s3/getting-started/)に連れてこられたのだが、いろいろなことが書かれていて、どこからどう進めるのが良いのかわからない。
画面下部に10分間チュートリアルなるものがあり、そこにある2つのチュートリアルのうち、[ファイルの保存と取得](https://aws.amazon.com/jp/getting-started/tutorials/backup-files-to-amazon-s3)の方は、開いたものの、何かコレじゃない感があり、引き返す。[クラウドへの複数ファイル一括アップロード](https://aws.amazon.com/jp/getting-started/tutorials/backup-to-s3-cli/)の方をやってみた。

## クラウドへの複数ファイル一括アップロード

### ステップ 1: AWS IAM ユーザーを作成する

これはすでに済ませてあったが、ダッシュボードを観るとルートのMFAが未設定だったので設定した。

ここで大事なのは、`g. [Download Credentials] ボタンをクリックし、credentials.csv ファイルを安全な場所に保存します (ステップ 3 で必要です)。`のところである。

要するに、IAMユーザを作ると、AWS CLIを使うためのCredentialsをダウンロードできる。これがないとAWS CLIが使えないので大事なわけである。

### ステップ 2: AWS CLI をインストールおよび設定する

これが非常に苦戦した。MacOS 10.14.4を使っているのだが、10.14 Mojave以降、ヘッダファイルをインストール必要があるらしく、かるくハマってしまった。おそらくここに詳細を書いても、すぐ陳腐化するだろうし、世間に良い情報があるので、そちらをあたってほしい。
ただ、AWS CLIのインストールに何時間もかけてしまった、ということだけ、記録しておく。

インストールに成功したら、下記を実行する。

```
aws configure
```

このとき、上でダウンロードしたCredentialsからの情報が必要になるので入力する。

### ステップ 3: AWS CLI と Amazon S3 を使用する

AWS CLIを使ってS3バケットを作成するには、以下のコマンドを実行する。

```
aws s3 mb s3://バケット名 
```

バケット名はグローバルに一意な名前が必要なので注意。

ローカルからS3バケットへのコピーは、以下の要領。

```
aws s3 cp ローカルファイルパス s3://バケット名/
```

S3バケットからローカルへのダウンロードは以下の要領。

```
aws s3 cp s3://バケット名/ファイル名 .
```

まあ、scpコマンドあたりと同じですね。

S3バケット上のファイルの削除は以下。

```
aws s3 delete s3://バケット名/ファイル名
```

ここまでは問題ない。

以上は、プライベートにファイルをS3にバックアップするような場合の使い方だ。

インターネットにファイルを公開したい場合には、どうしたら良いのだろう?

## Amazon S3 での静的ウェブサイトのホスティング

[Amazon S3 での静的ウェブサイトのホスティング](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/WebsiteHosting.html)を読んでいこう。

> 静的ウェブサイトをホスティングするには、Amazon S3 バケットをウェブサイトホスティング用に設定してから、ウェブサイトのコンテンツをそのバケットにアップロードします。

ふむ、なるほど。ウェブサイトホスティング用に設定されたS3バケットが必要なわけだな。

> このバケットにはパブリック読み取りアクセス権限が必要です。世界中のすべてのユーザーに、このバケットへの読み取りアクセス権限が付与されます。これは意図的な設定です。

まあ、そうだよね。

> これにより、ウェブサイトは、バケットの AWS リージョン固有のウェブサイトエンドポイント (以下のいずれかの形式) で利用可能になります。 

```
<bucket-name>.s3-website-<AWS-region>.amazonaws.com
<bucket-name>.s3-website.<AWS-region>.amazonaws.com
```

なるほど。たとえばバケット名がtmiya-dev-public-bucketであり、そのバケットがus-east-1リージョンにあるなら、以下のウェブサイトエンドポイントで利用可能だということだね。

```
tmiya-dev-public-bucket.s3-website-us-east-1.amazonaws.com
tmiya-dev-public-bucket.s3-website.us-east-1.amazonaws.com
```

あと、独自ドメインを割り当てることも可能であるよ、と。

### ウェブサイトホスティング用のバケットの設定

[ウェブサイトホスティング用のバケットの設定](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/HowDoIWebsiteConfiguration.html)を読むと、いくつか設定とオプションがあることが示されている。

#### ウェブサイトのホスティングの有効化

[ウェブサイトのホスティングの有効化](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/EnableWebsiteHosting.html)が最初の設定となるようだ。

む??? ああ、そうか。

<img width="520" alt="スクリーンショット 2019-05-05 11.42.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410632/4fc9f8d1-2edb-1c0a-a2da-39bb3a420e18.png">

この画面で`このバケットを使用してウェブサイトをホストする`を選んでも、保存ボタンはdisabledのままなので、何をどうしたら...と思ったが、何のことはない、インデックスドキュメントとエラードキュメントのところに見えている灰色でイタリックのファイル名は「入力例」なのであって、実際のファイル名を入力しないといけないんだね。