第3回:オブジェクトメタデータと権限管理
はじめに
S3は、単にファイルを保存するだけでなく、それぞれのオブジェクトにメタデータと呼ばれる付加情報を付与できます。これにより、オブジェクトの用途や性質を詳細に管理できます。また、誰がどのオブジェクトにアクセスできるかを制御するアクセス権限の設定は、S3を安全に運用する上で不可欠な要素です。
第3回では、S3オブジェクトのメタデータ操作と、アクセス権限を管理する主要な方法であるバケットポリシーとACL(Access Control List)について、AWS CLIを使った実践的な方法を解説します。
メタデータ操作
メタデータには、Content-Type
(ファイルのMIMEタイプ)、Cache-Control
(ブラウザのキャッシュ制御)、そしてユーザーが自由に定義できるカスタムメタデータがあります。
1. aws s3 cp
コマンドでのメタデータ指定(--metadata
)
aws s3 cp
コマンドでファイルをアップロードする際に、--metadata
オプションを使ってカスタムメタデータを指定できます。キーと値をカンマで区切って指定します。
aws s3 cp local_file.txt s3://my-bucket/remote_file.txt --metadata "author=taro,project=qiita-blog"
このコマンドを実行すると、remote_file.txt
というオブジェクトに author: taro
と project: qiita-blog
という2つのカスタムメタデータが設定されます。
2. aws s3 cp
でのACL指定(--acl
)
--acl
オプションを使うと、オブジェクトのアップロードと同時に、そのオブジェクトに対するアクセス権限を設定できます。代表的なACLは以下の通りです。
-
private
: バケット所有者のみがアクセス可能(デフォルト) -
public-read
: 誰でもオブジェクトを読み取り可能 -
public-read-write
: 誰でもオブジェクトの読み書きが可能
ウェブサイトの静的コンテンツとして公開したい場合などに public-read
を指定します。
aws s3 cp public-image.jpg s3://my-bucket/images/public-image.jpg --acl public-read
3. 既存のオブジェクトのメタデータ変更(aws s3api copy-object
の利用)
S3コマンドには、既存のオブジェクトのメタデータを直接変更するコマンドは存在しません。代わりに、copy-object
API を使って、同じバケット内に上書きコピーすることでメタデータを更新します。
aws s3api copy-object
コマンドは、コピー元のメタデータを保持するか、新しく指定するかを選択できます。--metadata-directive REPLACE
を指定することで、既存のメタデータを新しいものに置き換えることができます。
# 既存のオブジェクトのメタデータを更新
aws s3api copy-object \
--bucket my-bucket \
--key my_file.txt \
--copy-source my-bucket/my_file.txt \
--metadata "new_author=jiro" \
--metadata-directive REPLACE
このコマンドは、my-file.txt
を同じ場所に上書きコピーし、メタデータを new_author: jiro
に更新します。
パブリックアクセス設定
S3バケットは、デフォルトではプライベートであり、インターネットから直接アクセスすることはできません。静的ウェブサイトホスティングなど、特定のケースでパブリックアクセスを許可したい場合は、設定が必要です。
1. aws s3api put-public-access-block
(バケット全体のパブリックアクセス設定)
AWSでは、意図しないパブリックアクセスを防ぐために、バケットレベルで「パブリックアクセスブロック」機能を推奨しています。デフォルトでは、すべてのパブリックアクセスがブロックされています。
もしバケットを公開したい場合は、この設定を無効にする必要があります。
{
"BlockPublicAcls": false,
"IgnorePublicAcls": false,
"BlockPublicPolicy": false,
"RestrictPublicBuckets": false
}
このJSONファイル(public_access_config.json
など)を準備し、以下のコマンドで設定します。
aws s3api put-public-access-block \
--bucket my-public-website-bucket \
--public-access-block-configuration file://public_access_config.json
この操作は慎重に行う必要があります。誤った設定は、機密情報の漏洩につながる可能性があります。
2. S3オブジェクトのURLの取得方法
パブリックアクセスが許可されたオブジェクトには、直接アクセスできるURLが存在します。
-
aws s3 presign
: 一時的な署名付きURLを生成します。# 署名付きURLを1時間(3600秒)有効で生成 aws s3 presign s3://my-private-bucket/private_file.txt --expires-in 3600
-
パブリックURLの構成:
パブリックアクセスが許可されている場合、オブジェクトのURLは以下の形式で構成されます。https://<bucket-name>.s3.<region>.amazonaws.com/<object-key>
例:
https://my-bucket.s3.ap-northeast-1.amazonaws.com/images/public-image.jpg
バケットポリシーとACL
S3のアクセス権限管理には、主にバケットポリシーとACLの2つの方法があります。
-
バケットポリシー: バケット全体、または特定のオブジェクト群に対して、誰にどのようなアクセスを許可・拒否するかをJSON形式で記述します。IAMユーザー、AWSアカウント、匿名ユーザーなど、様々なプリンシパル(アクセス主体)に対して詳細な制御が可能です。
-
ACL (Access Control List): 各バケットやオブジェクトに個別に設定する、シンプルで粒度の粗いアクセス制御リストです。
1. バケットポリシーの設定(aws s3api put-bucket-policy
)
バケットポリシーを設定するには、まずポリシーの内容をJSONファイルとして作成します。
例:特定のIAMユーザーにバケットへの読み取りアクセスを許可するポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/my-iam-user"
},
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-policy-bucket",
"arn:aws:s3:::my-policy-bucket/*"
]
}
]
}
このポリシーを policy.json
という名前で保存し、以下のコマンドで設定します。
aws s3api put-bucket-policy \
--bucket my-policy-bucket \
--policy file://policy.json
設定したポリシーを確認するには、aws s3api get-bucket-policy
を使用します。
2. ACLの確認と設定
ACLは、バケットレベルとオブジェクトレベルの両方で設定できます。aws s3api get-object-acl
や aws s3api put-object-acl
を使って設定します。
例:オブジェクトのACLを確認
aws s3api get-object-acl --bucket my-bucket --key my_file.txt
例:オブジェクトのACLを設定
--grant-read
オプションなどを使って、権限を付与することができます。
# AuthenticatedUsers(AWSアカウントを持つすべてのユーザー)に読み取り権限を付与
aws s3api put-object-acl \
--bucket my-bucket \
--key my_file.txt \
--grant-read uri=http://acs.amazonaws.com/groups/global/AuthenticatedUsers
ACLはシンプルなアクセス制御には便利ですが、AWSではより詳細な制御が可能なバケットポリシーの使用を推奨しています。
まとめ
第3回では、S3オブジェクトの付加情報であるメタデータと、重要なセキュリティ機能であるアクセス権限管理について学びました。
本記事のポイント
-
aws s3 cp
の--metadata
や--acl
オプションで、アップロード時にオブジェクトの情報を設定できます。 - 既存オブジェクトのメタデータは、
aws s3api copy-object
を使って上書きコピーすることで変更します。 -
aws s3api put-public-access-block
でバケットのパブリックアクセスを制御し、セキュリティを確保します。 - アクセス権限管理には、詳細な設定が可能なバケットポリシーと、シンプルなACLがあります。AWS CLIを使ってこれらを適切に設定することで、安全なS3運用が可能になります。
次回の記事では、S3の運用コストを最適化するためのライフサイクル管理と、データ保全のためのバージョニングについて解説します。