AWS S3 [2]
昨日の続き。
難しくて、心が折れてるけどやろう...
S3のアクセス方法
ユーザーが作成したバケットや、バケット内オブジェクトにアクセスするには、
以下の方法がある。
AWS SDK(Software Development Kit)
- AWSが提供する公式ライブラリの一つ。
- S3などのAWSサービスの操作を、プログラミング言語で利用しやすくなる。
(例)ユーザーがプログラム言語でS3にアクセスする時、使われる。
AWS CLI
-
LinuxやWindowsのコマンドラインで
S3などのAWSサービスの操作を行うことができる。
(例)開発や運用のエンジニアが、S3の操作をバッチにしたりテンプレートにする際に使われる。※ バッチ処理とは
バッチ処理は、連続したプログラムを、手動での介入なしに1台または複 数台のコンピュータで実行。つまり、リアルタイムな処理ではなくて、事前 に予定していた処理を自動的に実行させることを意味する。
マネジメントコンソール
- WEBブラウザでAWSの各リソースを操作する
サードパーティー製GUIツール
- 手動でS3を操作する場合に利用する
サービス連携
- 他AWSサービスのバックアップやデータ保存場所として、S3は使用できる
S3アクセス管理
S3では、バケットやオブジェクトのアクセスを管理できる。
[IAMポリシー][バケットポリシー][ACL]の3種類がある。
状況によって使い分けが必要になる。
IAMポリシー/バケットポリシーの記法
IAMポリシーとバケットポリシーは、JSON形式で記述する。
(例)
{
"Version":"2012-10-17",
"Id":"PolicyForCloudFrontPrivateContent",
"Statement":[
{
"Sid":" Grant a CloudFront Origin Identity access to support private content",
"Effect":"Allow",
"Principal":{"CanonicalUser":"CloudFront Origin Identity Canonical User ID"},
"Action":"s3:GetObject",
"Resource":"arn:aws:s3:::examplebucket/*"
}
]
}
Action
-
Actionは、GET(ダウンロード)やPUT(アップロード)など
実際の行動を設定するエレメントで、
"許可または拒否したいアクションを指定する(複数のアクションを指定できる)"
アクションは、サービスの名前空間、コロン、アクション名で構成される。 -
S3オブジェクトをダウンロードする際のGETオペレーションに対応するアクションは、
s3:GetObject
になる。 -
その他、S3のポリシーで使用するアクションとオペレーションとの対応は、公式サイトのページで確認できる。
エレメントとは
セクション内において、データを読み込む、データを加工する、データを出力するなど、セクション内の細かい処理単位。
Effect
- 設定したい効果を
許可(Allow)
または
拒否(Deny)のいずれかで指定する。
必須の要素!!!!!
Resource
- ポリシーを適用したいバケットやオブジェクトを指定する。(複数のリソースを指定できる。)
- リソース(作ったり動かしたりするのに必要)は、
多くの場合、Amazonリソースネーム(ARN)を使って特定する。
ARN
アカウント内のAWSリソースを一意に識別するAWS共通の記法。
AWSサービス名、リージョン、アカウント、リソース名などコロンつなげる。
(例)
「examplebucket」のバケット内にある全オブジェクトを指定する
"Resource":"arn:aws:s3:::examplebucket/*"
Principal
-
Principalエレメントは、許可または拒否する
プリンシパル(アクションを実行する人、ユーザー、アプリケーションのこと)を指定する。 -
プリンシパルは、AWSアカウント、IAMユーザー、IAMロールなどをARNで指定する。
AWSアカウントの場合は、完全なARNの代わりに短縮形の
[AWS:アカウント番号]を使用できる。
IAMポリシーサンプル
AWSアカウントの全バケットのアクセスを許可するIAMポリシー
(公式ホームページから)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowGroupToSeeBucketListInTheConsole",
"Action": ["s3:ListAllMyBuckets"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::*"]
}
]
}
< 解説 >
-
Action
にs3:ListAllMyBuckets
を記述することで、
自身のAWSアカウントの全バケットを表示できるようにする。
(この権限を付与しておかないと "権限不足で開けなくなる" ) -
Sid
には、任意の名前を指定 -
Resource
は "*(ワイルドカード)"をつけて、全バケットを指定する
バケットポリシーサンプル
同じアカウント内に存在するCloudFrontディストリビューションに対して、
[examplebucket]バケット内の全オブジェクトの読み取り許可を付与するポリシー。
(公式ホームページより)
{
"Version":"2012-10-17",
"Id":"PolicyForCloudFrontPrivateContent",
"Statement":[
{
"Sid":" Grant a CloudFront Origin Identity access to support private content",
"Effect":"Allow",
"Principal":{"CanonicalUser":"CloudFront Origin Identity Canonical User ID"},
"Action":"s3:GetObject",
"Resource":"arn:aws:s3:::examplebucket/*"
}
]
}
< 解説 >
-
Action
には、オブジェクトを読み取るアクションが指定されている -
Principal
には、正規ユーザーID(難読化されたAWSアカウントID)を指定する。
このIDは、CloudFront
のディストリビュージョンを表す。
CloudFrontとは
AWSのコンテンツ配信サービス。
S3上にある画像や動画、ファイルを高速に配信する際に利用する。
-
Resource
のリソース指定部分には、バケット内の全オブジェクトを示す
examplebucket/*
が指定されている。(* ワイルドカードが全部指定ってことっぽい)
ACL (Access Control List)
ACLは、基本的にはバケットポリシーと似たことを行える。
が、違いがあり、
-
ACL
は、
個別の
オブジェクトやバケットに対する簡単で、直接的なアクセス制御に適していて、よりシンプルで制限があるため、
小規模な設定や公開アクセス設定に便利。
-
バケットポリシー
は、
バケット全体に対する詳細で、柔軟なアクセス制御を提供し、
大規模な設定や複雑な条件付きアクセス制御に適している。
ACLの設定方法
-
ユーザーがバケット🧺やオブジェクトを作成すると、
AmazonS3はそれらにたいして必ず1つのACLを作成する。
-
デフォルトのACLでは、そのバケットやオブジェクトの所有者(作成者のAWSアカウント)に
フルアクセスが許可されている。
-
1つのACLには、最大100個の
Grant(権限のルール)
を含めることができる。
Grantee(被付与者)
被付与者とは、
AWSアカウントまたは事前定義済みのいずれかの
Amazon S3グループのこと。
Eメールアドレスまたは、正規ユーザーIDを使用してAWSアカウントに許可を付与する。
ただし、
付与のリクエストでメールアドレスを指定すると
、
↓
Amazon S3はそのアカウントの正規ユーザーIDを確認してACLに追加する。
↓
結果、ACLにはAWSアカウントのEメールアドレスではなく、
常に正規ユーザーIDが含まれる。
Permission(権限)
あらかじめ、5つのキーワードが定義されている。
バケットのACLで使われる場合
と、
オブジェクトのACLで使われる場合
とでは、許可される操作が異なる。
下記で確認できる。
ポリシーの評価論理(優先順位)
ブロックパブリックアクセス
1人のユーザーの設定ミスによって、
バケットやオブジェクトが意図しないうちに公開(パブリックアクセス)されてしまう可能性もある。
ブロックパブリックアクセス
は、ACLやバケットポリシーでのアクセス設定に関わらず、最優先で、パブリックアクセスを禁止したり、パブリックアクセスの許可を設定できないように制御できる。
AWSアカウントIDを確認するには、
- ナビゲーションメニュー
- 自身のアカウント名を選択
- アカウントメニューの[アカウント設定]を選択
暗号化によるデータ保護
S3におけるデータ保護には、
[転送時のデータを保護する]
[保管時のデータを保護する]
2つがある。
転送時のデータを保護する
- クライアントとAmazonS3の間でデータを送受信するときに使う。
- クライアントがAWSのマネジメントコンソールや
AWS CLI
やAWS SDK
でS3にデータを送受信する場合、
追加の設定を行わなくてもSSL(Secure Sockets Layer)によって
データが暗号化されるので、データは保護されていると考えて良い。
保管時のデータを保護する
保管時については、S3のサーバー側の暗号化を利用できる
この機能は、クライアントがS3にデータをアップロードする際に
S3に対してリクエストできる
サーバー側の暗号化がリクエストされると、
S3上で暗号化して保管
↓
取り出す時は、S3が暗号化を元に戻す
クライアントがサーバー側の暗号化をリクエストしなくても、
デフォルトで、全てのデータを暗号化するような強制設定も可能
クライアント側の暗号化
転送時と保管時のデータ保護を同時に実現できる方法として、
クライアント側の暗号化
がある。
データをS3に送る前に、
クライアントでデータの暗号化を行う。
この場合、クライアント側で使用する暗号化キーや暗号ツールの管理を
自分自身で行う必要があり、
その分のコストやリスクも自分自身で負うことになる。
暗号キータイプ
暗号キータイプには、
[Amazon S3 マネージドキー(SSE-S3)]
[AWS Key Management Service キー(SSE-KMS)]
がある。
Amazon S3 マネージドキー(SSE-S3)
S3が管理する暗号化キーを使用する
ASE-256
という暗号化方式で暗号化している。
AWS Key Management Service キー(SSE-KMS)
AWSの別サービス(AWS KMS)と連携するオプションで、
S3がKMS側で管理されている暗号化キーを使う設定。
合わせて、バットキーを有効にすることで、暗号化する際のKMSへのリクエストに対するコストを減少することができる。
Webサイトホスティング
S3では、作成したバケットをそのまま静的webサイト
として公開できる。
※1と2については、一般公開されるWebサイトを運用する場合は、大きな問題になる可能性があるので、S3単体でのWebサイトホスティングは、一時的な学習やテスト用と割り切って使用するとよいみたい。
バージョニング
バージョニングとは、一般的にはファイルの変更をトラッキングして
変更前と変更後のファイルを別々のバージョンとして格納し、
比較や復元ができるようにする機能。
S3のバージョニングは、
同じバケット内で1つのオブジェクトの変更をトラッキングして、
複数のバージョンを保持する機能。
終わり...😭
Discussion