AWS S3概要


## S3とは

- Simple Storage Serviceを略してS3と呼ぶ
- 容量が無制限なFTPサーバーのようなイメージ

## 機能

- バージョニング：オブジェクトごとに世代管理してくれる
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176264/eddaa996-aa9d-f126-9767-f080024bf490.png)
    - 同じファイル名をアップロードすると世代管理してくれます
- ログ記録：オブジェクトに対するログを残す
    - アクセスごとにログファイルが出力される
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176264/75dbdbe4-e56e-9933-a901-92b547d8d150.png)
    - そのままにしてると大量に溜まっていくし、必要なアクセスログを探すの大変そう...
    - Athena（S3のデータをクエリを用いて検索ができる機能）を使って検索するのが楽そうか
    - https://qiita.com/godgarden/items/69fc31b95d63200f2f3f
- 静的Webサイトホスティング：S3をWebサーバーのように使い、静的なサイトを公開することができる
    - リダイレクト機能
    - インデックス機能（ドメイン指定のみで表示するページの指定（index.htmlとか）
    - webサイトホスティングすると、URLが通常のS3のファイルのURLと異なるエンドポイントが利用できるようになる
        - バケット内のファイルのURL：https://s3-ap-northeast-1.amazonaws.com/[バケット名]/[ファイル名]
        - 静的なwebサイトのホスティング：http://[バケット名]-website-ap-northeast-1.amazonaws.com
    - バケットポリシーの設定で、「このバケットにはパブリックアクセス権があります」と警告が出ますが、webサイトの外部公開を目的としている為、気にしないでOK
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176264/ec784c74-b894-457a-13a1-af6b342b65ff.png)
    - Webサイトとしてどこからでも誰からでも見られるようにしたいので、この警告は無視して大丈夫
    - https://qiita.com/dogwood008/items/a92abae789f4b0466f38
    - バケットを作ったユーザが作成（アップロード）したファイルであれば外部からアクセス可能だが、それ以外のユーザが作成した場合は外部からアクセスできない
    - s3-log-serviceが生成したログファイルを外部に公開したい場合どんなバケットポリシーを作成すればいいか分からない...。（通常する事はないと思いますが
    - httpsにはできない。S3の前段にCloudFrontを置くとhttpsでアクセスできるようになる
- イベント：オブジェクトの操作をトリガーに、様々な処理を行うことができる
- アクセス権限：認証されたユーザーのみ操作を許可するなど、細かくアクセス権限を設定できる
- 暗号化：オブジェクトを暗号化しておける


## 使い方

- バケットを作成する
    - バケット名は、Amazon S3 内の既存バケット名の中で一意である必要がある
    - バケットの制約：https://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html
- オプションの設定
    - バージョニング：https://qiita.com/kooohei/items/8775b380632e8b7940a3
    - アクセスログ
        - アクセスロギングを有効にするための追加料金はない
        - ログファイルはS3バケットに生成されるので、そのストレージ料金はかかる
        - https://dev.classmethod.jp/cloud/aws/s3accesslog-deny/
        - アクセス失敗の原因を確認するためといったイレギュラー時の利用が主で、通常はログが肥大化していくだけなので有効にしない方がよさそう
    - オブジェクトタグ
        - タグを指定してライフサイクルポリシーの設定ができる
        - タグを指定してIAMポリシーの指定ができる
        - タグごとのメトリクス確認や分析の確認もできる
        - http://blog.serverworks.co.jp/tech/2016/12/21/s3-object-tag/
- アクセス許可の設定
    - 意図せぬ公開のリスクを防ぐ為に必要
    - https://qiita.com/ryo0301/items/791c0a666feeea0a704c
    - https://dev.classmethod.jp/cloud/aws/s3-block-public-access/
    - 公開したいor公開されても影響がないファイルと公開されると影響のあるファイルのバケットを分けてアクセス制御する
    - アクセス許可の設定の上書きができるイメージ（オブジェクト単位にアクセス許可してもこの設定で上書きできる
    - アクセス制御の種類：https://qiita.com/iron-breaker/items/f35c1d54887c434a321a
        - バケットポリシーは、バケットレベルでのアクセス制御
            - 通常このレベルでのアクセス制御を行う（１ファイル単位にアクセス制御したい場合は
        - IAMはユーザレベルでのアクセス制御
        - アクセスコントロールリスト（ACL）はオブジェクトレベルでの制御
            - バケット単位で中にあるファイルやディレクトリを外部公開することは出来ない

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

Webサイトの要件に応じて、リダイレクト、Webトラフィックロギング、カスタムエラードキュメントなど、他のオプションを構成することもできる
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/HowDoIWebsiteConfiguration.html

Amazon S3 Webサイトのエンドポイントは、Webブラウザーからのアクセス用に最適化されている。
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/WebsiteEndpoints.html

### S3の継続的デリバリ(CI/自動デプロイ)

https://dev.classmethod.jp/cloud/aws/s3-continuous-delivery/

## EC2とS3の使い分け

### S3

- 料金：EC2より安いので大量のファイルを置くならS3
    - データ格納：1GBで1か月約3円程度
        - 最初の50TBまで
        - 0.025USD * 110円（1ドル=110円として）（東京リージョンの場合）
    - S3へのリクエスト（S3 バケットとオブジェクトに対して行われたリクエスト）
        - リクエストの種類によって料金が異なる
        - 「S3 標準 - 低頻度アクセス*」等は何か？->ストレージクラスのこと
        - https://aws.amazon.com/jp/s3/storage-classes/?nc=sn&loc=3
        - ストレージクラスについて：↓S3へのファイルアップロード時、ストレージクラス選択できる
        - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176264/d0a2a7bc-a70e-027d-50e4-b064e4cb7ccc.png)
    - データ転送
        - インターネット→Amazon S3へのデータ転送（S3へのアップロード）は無料
        - Amazon S3→インターネットへのデータ転送：1GBまでは無料
            - 1GB～9.99TB：0.114USD/1GB = 12.54円/1GB = 1000GBだと12540円
        - Amazon S3→別リージョンへのデータ転送
            - 0.09USD/1GB = 9.9円/1GB = 1000GBだと9900円
        - 同一リージョン内の(AZ非依存な)AWSサービスとの通信は無料
        - 例えば同一リージョンのEC2とS3間の通信は送信も受信も無料
    - 参考
        - https://aws.amazon.com/jp/s3/pricing/
        - https://qiita.com/kawaz/items/07d67a851fd49c1c183e
- 容量制限がない：サービスが続く限り増えていく画像等の配置場所として利用するのがよさそう？
- 静的サイトのホスティング利用の用途：EC2と違って自前でwebサーバ（NginxやApach）を構築・運用する必要がない
- バックアップなどのデータをS3に置くのが鉄板構成（EC2やRDSのスナップショットもS3に保存される
- AWSその他サービスとの連携
    - PHPで動くWordpressなど動的なサイトはEC2、/wp-content配下など静的なコンテンツはS3で運用、さらにCloudFrontとも連携できる
    - ログ転送ツールFluentdを使い、EC2からのログをS3に保存することも可能
        - EC2にエージェントを仕込んで、定期的にシスログやアクセスログをS3バケットに出力する
    - S3をディスクとみなして扱うのはお勧めしない（EC2からS3をマウントするのはお勧めしない
        - HTMLファイルやアクセスが多いコンテンツに対してS3をマウントさせると、EC2からAPIを通してS3にアクセスするのでラグが発生
        - 大量アクセス時に頻繁にマウントが外れてS3にアクセスできなくなり、サービスに影響が出てしまう可能性
        - アクセス対策としてはDatadogなどの監視ツールを導入し、マウント外れが起こったら再度マウントする設定にしておく
        - CloudFrontを使った構成にしておく

### EC2

- 通常の仮想サーバとして利用する（アプリケーションを配置する等


### 料金計算

https://calculator.s3.amazonaws.com/index.html

上記公式の料金計算ですが、英語であることやまだAWSに詳しくないことから
何となく言っていることは分かるが利用しづらいなという印象です。

ざっくり知りたい場合、日本円にも直してくれますし下記サイトが分かりやすかったです。
※公式サイトではないので、料金変更が起きたとき等はずれる可能があります。

https://aws-rough.cc/

## 参考

https://service.plan-b.co.jp/blog/creative/4981/
https://www.bit-drive.ne.jp/managed-cloud/column/column_04.html
https://employment.en-japan.com/engineerhub/entry/2018/07/17/110000#bot3