AWS CLIで Web サイトを構築、管理、運用する(3日目)

[2日目](https://qiita.com/hirosys/private/1d15cbd778635cf9820d)ではアクセスロギングの設定を入れて、記録が取れるようにしました。

Web サイトは公開したら終わりじゃないですよね？定期的に更新しますよね。
というわけで、更新時にひっかかる問題を解決していきましょう。

# 3日目の要約
記事更新時のちょっとひと手間を解消していくよ！

# AWS CLI の準備
このあたりをみて、好きなバージョンとお使いのOSにあった環境設定をしてくださいね。
なんなら、 AWS CloudShell で実行するのも楽でよいと思います。
この記事シリーズは、AWS CloudShell で実行し、実行例を載せています。

バージョン１
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv1.html

バージョン２
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2.html

# 概要
Amazon Simple Storage Service(Amazon S3)のバケットポリシーを AWS CLI で設定、構築する

# さあ、やってみよう！
## その前に
1日目で開設した Web サイトにアクセスしてみましょ

```sh
curl http://<BUCKETNAME>.s3-website-ap-northeast-1.amazonaws.com
```

以下の様に出力されるはずです。

```HTML
<!DOCTYPE html>
<html lang="ja">
<head>
  <title>Advent calendar 2021</title>
</head>
<body>
  <h1>Hello world!!</h1>
</body>
</html>
```

1日目に作成したファイルが残っていれば以下の様に編集ください。なければ、以下をコピペでも構いません。
h2 タグの行を追加しています。

```HTML:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <title>Advent calendar 2021</title>
</head>
<body>
  <h1>Hello world!!</h1>
  <h2>Advent calendar 2021 DAY 3</h2>
</body>
</html>
```

このファイルを s3 にアップロードします。 s3 cp コマンドを使用します。

```sh
aws s3 cp ./index.html s3://<BUCKETNAME>/index.html

upload: ./index.html to s3://<BUCKETNAME>/index.html
```

アップロードができたら、更新できているか curl コマンドでアクセスしてみます。

```sh
curl http://<BUCKETNAME>.s3-website-ap-northeast-1.amazonaws.com
```

すると、どうでしょう。HTTP403 Forbidden が返ってくるではないですか！

```HTML
<html>
<head><title>403 Forbidden</title></head>
<body>
<h1>403 Forbidden</h1>
<ul>
<li>Code: AccessDenied</li>
<li>Message: Access Denied</li>
<li>RequestId: ***********</li>
<li>HostId: ***********************************************</li>
</ul>
<hr/>
</body>
</html>
```

1日目を振り返っていただくとわかると思いますが、「[コンテンツを公開する](https://qiita.com/hirosys/private/c8e92c253d8acc8f0a96#%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%82%92%E5%85%AC%E9%96%8B%E3%81%99%E3%82%8B)」をしないとならないのです。
同名のファイルといえど、オブジェクトストレージの仕様によりオブジェクト(ファイル)がごっそりと書き換えられるで、公開設定が無い状態になってしまいます。

アップロードと合わせて公開設定を有効化するようにしてもよいですが、バケットポリシーを設定することで、恒久的に公開状態(読み取りOK)状態にすることが可能です。

**ただし、対象のバケット内が公開状態になるので、機密情報や個人情報が入ったファイルの格納はしないようにしてください。また、そういったファイルが入る可能性があるのであれば、個別に公開設定をいれるようにしてください。**

以上を踏まえてつづきをどうぞ。

## バケット ポリシー を設定する
バケットポリシーは JSON 形式で指定します。AWS CLI は JSON ファイルを読み込むことができるので、ポリシーを記述した JSON ファイルを先に作成しておくと作業がしやすいです。

### バケットポリシーファイルを作成する
好きなテキストエディタで以下の内容のJSONファイル(テキストファイル)を作成します。
\<BUCKETNAME\> の箇所はS3 静的 WEB サイトホスティングを行っているバケット名を指定します。

```JSON:bucketpolicy.json
{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"PublicWebHosting",
      "Effect":"Allow",
      "Principal": "*",
      "Action":"s3:GetObject",
      "Resource":"arn:aws:s3:::<BUCKETNAME>/*"
      }
  ]
}
```

## コマンドを実行する
s3api put-bucket-policy コマンドでバケットポリシーを設定します。

```sh
aws s3api put-bucket-policy --bucket <BUCKETNAME> --policy file://bucketpolicy.json
```

このコマンドも正常終了しても特に何も返しません。

## Web サイトへアクセスする

バケットポリシーを設定したので、改めて、 curl コマンドでアクセスしてみます。

```sh
curl http://<BUCKETNAME>.s3-website-ap-northeast-1.amazonaws.com
```

バケットポリシーが意図した通りに設定できていれば、以下の様に出力されます。

```HTML
<!DOCTYPE html>
<html lang="ja">
<head>
  <title>Advent calendar 2021</title>
</head>
<body>
  <h1>Hello world!!</h1>
  <h2>Advent calendar 2021 DAY 3</h2>
</body>
</html>
```

h2 タグの行が入ったコンテンツが無事に取得できました。
適宜、ファイルを更新しアップロードを行って動作確認をしてみてください。

# まとめ
S3 で配信している Web サイトのコンテンツを更新する場合でも公開設定が必要なことがわかりました。
機密情報や個人情報、センシティブな情報がない Web サイトの場合は本設定をいれることで運営・運用がしやすくなると思います。
※個別公開も公開手順の整備やスクリプト化すればよいだけの話ではありますが💦

* 今回使ったコマンド
 * s3 cp
 * s3api put-bucket-policy