S3 - AWS
最終更新日: 2026-07-27
TOP(About this memo)) > 一覧(AWS) > S3
S3
- S3の特長は容量が無制限で安いこと。
- S3の月額料金は0.025USD/1GBあたり(最初の50TB、スタンダードストレージ)。
- EBSは0.12USD/1か月にプロビジョニングされたストレージ1GBあたり。
- (IME) アプリケーションからアクセスする頻度が高いデータはEBSに入れておき、バックアップなどのデータをS3に置く構成がよく使われる。
- EC2<->S3の通信
- (参考) https://avinton.com/academy/upload-file-from-ec2-to-s3/
- EC2とS3の間でファイル転送を行いたい場合、S3はEC2が設置されているネットワーク(VPC)の外側にあるサービスであるため、エンドポイントと呼ばれるコンポーネントをVPCにアタッチしてS3と通信できるように設定する必要がある。
- S3との通信はインターネットゲートウェイ経由でも可能だが、その場合トラフィックが一度インターネットへ出てしまう(同じAWSサービス同士の通信であるにもかかわらず)。
- VPCエンドポイントを使えば、AWSのサービス内でセキュアにトラフィックを流すことができ、通信料金もかからないため経済的。
- エンドポイントのポリシー作成時はデフォルトで全ての操作を許可するポリシーがセットされるため、S3以外の操作ができないように設定しておく。
S3に静的ファイルを置いて、Route53からAレコードで飛ばす
S3の静的サイトをHTTPS化する
Amazon S3 Glacier
S3料金内容
- ストレージ容量、データ転送(課金対象はS3からの送信のみ。受信(S3へのアップロード)は無料)、リクエスト数で課金される。
- CloudFront+S3とS3単体の料金比較: アクセスが多い場合はCloudFrontを使うほうがよい(?)。
アクセス制御の仕組み(ACL・バケットポリシー)とは
- S3のアクセス制御は主に3つの仕組みの組み合わせで決まる。
- ブロックパブリックアクセス(バケット単位。オンにすると他の設定より優先されてパブリックアクセスを封じる)
- バケットポリシー(バケット単位)
- ACL(バケット単位・オブジェクト単位)
- ACL(Access Control List)
- バケットポリシー(Bucket Policy)
- ブロックパブリックアクセスとの関係
- ブロックパブリックアクセスがオンの場合、ACLやバケットポリシーでパブリックアクセスを許可する設定を書いても無効化される(次項「使い方」参照)。
- そのため、パブリックに公開する必要のないバケットは基本的にブロックパブリックアクセスを全てオンにしておき、必要な場合のみ個別に見直すのが安全(IMO)。
使い方
- とりあえずバケットを作り、バケット自体の「ブロックパブリックアクセス」は全てオン状態にする。
- この状態だと、個々のファイルにアクセスしても
access deniedになる。
- PHPからSDKを使ってファイルをputする場合は、
'ACL' => 'private'にしないと403 forbiddenになる(public_readなどにするとエラーになる)。
- バケット自体がパブリックアクセスをブロックしているため、個々のファイル側で許可を与えることはできない、ということ(?)。
- 実際に個々のファイル(オブジェクト)の「アクセス権限」を見ると、「このバケットに対してブロックパブリックアクセス設定がオンになっているため、パブリックアクセスを許可することはできません。どの設定がオンになっているかを判断するには、ブロックパブリックアクセス設定を確認してください。」と表示される。
- アクセス権限について
- S3はCloudFrontを経由させ、Origin Access Identity(CloudFrontのみ許可)を使うことで閲覧制限ができる(?)。
CORS設定
- ブラウザから直接S3へアップロード/ダウンロードさせる構成(署名付きURLでのPUTなど)では、S3バケット側にCORS設定が必要。オリジン(ドメイン)ごとに許可するHTTPメソッドやヘッダーを指定する。
- マルチパートアップロードなどでレスポンスヘッダー
ETagをJavaScript側で読み取りたい場合は、公開ヘッダーにETagを含める必要がある(ブラウザはデフォルトでカスタムレスポンスヘッダーをJS側に公開しないため)。
ライフサイクルルール
- 一時的にしか使わないファイル(CSVアップロードの一時置き場、ログなど)は、ライフサイクルルールで一定日数後に自動削除する設定をしておくと、消し忘れによるストレージ課金の積み上がりを防げる。
ログ配信の許可設定(バケットポリシー)
- ALBのアクセスログやCloudFrontのアクセスログをS3に送る場合、それぞれログを配信するAWS側の主体(Principal)が異なるため、バケットポリシーの書き方も変わる。
- ALB: リージョンごとに固定された「ELBサービスアカウント」のAWSアカウントIDをPrincipalに指定する。
- CloudFront:
cloudfront.amazonaws.comのサービスプリンシパルを指定し、意図しない他アカウントのCloudFrontから書き込まれないよう送信元アカウントの条件で自アカウントに絞る。
- サービスによって許可の与え方(アカウントベースか、サービスプリンシパル+条件か)が異なる点に注意。