S3(Simple Storage Service) †
- Element Descriptions Version, Statement, Sid, Effect, Principal, Action, NotAction, Resource, NotResource, Condition, This section describ
s3 objectにメタデータ(cache-control, content-type 他を付ける) †
- static web hosting時にcloudfrontで特定objectのみキャッシュを無効にしたい時など
- 確認
aws s3api head-object --bucket example-bucket --key index.html \
--profile example
{
"AcceptRanges": "bytes",
"LastModified": "2021-03-04T08:35:57+00:00",
"ContentLength": 38,
"ETag": "\"48d3bc653f81c4377df8fc2304d2d515\"",
"CacheControl": "no-cache,no-store",
"ContentType": "text/html",
"Metadata": {}
}
大量のオブジェクトの削除 †
s3 bucketにobjectが100GBくらいあると消すのも時間がかかる。
- life cycle ruleを設定する。1日かかるが自動で消してくれる
S3 Storage Lens: S3の利用状況の分析 †
- CloudWatchメトリクスでも、オブジェクト数やバケットサイズはあったが、2,3日に1回の頻度だった。
s3オブジェクトの変更・削除を禁止 †
- retention periods(保持期間設定)
- legal holds(法定保留)
S3オブジェクトの所有権を強制する †
- s3 objectはownerしかread/writeできない。アカウントBから、アカウントAのs3 bucketにアップロードすると、アカウントAのuserでread/writeできない状態になる。
- s3 bucketの所有者にも読み書きを許可するにはobject毎に「--acl bucket-owner-full-control」を付与する必要がある。
- s3 bucketのownerと、s3 objectのownerが一致している場合、bucket policyで他AWSアカウントに対して許可を設定できる。
- Object Ownership が追加されたので、「Bucket owner preferred」を有効にしたほうが良い。
- 既存のobjectには適用されない。
- bucket policyで「--acl bucket-owner-full-control」が無い時にエラーになるように拒否できる。bucket policy未設定だと、「--acl bucket-owner-full-control」が無くてもエラーにはならない。
- 自動的に「--acl bucket-owner-full-control」が付与されるものではない。
正規ユーザーID/正規ID: †
- s3 bucket aclのOwner.IDに正規ユーザIDがあるので、どのアカウントが所有者か確認できる。
aws s3api get-bucket-acl --bucket terraform-nichigas-stg --profile example
{
"Owner": {
"DisplayName": "example12345",
"ID": "79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be"
},
"Grants": [
{
"Grantee": {
"DisplayName": "example12345",
"ID": "79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be",
"Type": "CanonicalUser"
},
"Permission": "FULL_CONTROL"
}
]
}
s3-tree: tree形式で表示 †
- S3はkey=valueストアで、フォルダは無い。
- AWS Consoleではkeyに '/' があると、フォルダっぽく表示しているだけ
- tree形式で見たい場合は便利?ファイル数が多いと辛そう
S3 Event Notification: S3にアップロードされたらLambdaを起動する等 †
アクセスログ †
セキュリティ †
インターネットへ公開 †
Public Accessの検出/禁止 †
マルチバイトのオブジェクト名 †
S3のオブジェクト名にマルチバイト文字を使うのは止めた方が良い。
macOSでアップロードすると、Windows/Linuxでは別のファイル名として扱われる。
Unicode正規化方法:
バージョニング: 履歴管理 †
- objectのバージョン一覧。削除されたオブジェクトは、DeleteMarkersが付くようだ。
- IsLatest: 最新かどうか
PROFILE=example
BUCKET=bucket
aws s3api list-object-versions \
--bucket $BUCKET \
--profile $PROFILE
{
"DeleteMarkers": [
{
"Owner": {
"DisplayName": "hoge",
"ID": "*****"
},
"IsLatest": true,
"VersionId": "****",
"Key": "example/example.txt",
"LastModified": "2020-03-25T08:48:10.000Z"
},
オンプレミス環境からのS3アクセス †
料金削減 †
S3 Access Points: bucketに対して、アクセスポイント名でアクセスする †
https://[access_point_name]-[accountID].s3-accesspoint.[region].amazonaws.com
コスト削減 †
S3自体のコストはEC2と較べたら安いが、容量が貯まるとバカにできないくらいの金額になる。
削除保護 †
- S3 bucket policy: delete操作を一切禁止する。tag, policy, versionの削除操作もできない。
{
"Version": "2012-10-17",
"Id": "Policy1574220010459",
"Statement": [
{
"Sid": "DenyDeleteOperation",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:Delete*",
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
]
}
]
}
- DeleteBucket, DeleteObjectだけを禁止。tag, policy, versionの削除は出来る
{
"Version": "2012-10-17",
"Id": "Policy1574220010459",
"Statement": [
{
"Sid": "DenyDeleteBucket",
"Effect": "Deny",
"Principal": "*",
"Action": [
"s3:DeleteBucket"
],
"Resource": [
"arn:aws:s3:::my-bucket"
]
},
{
"Sid": "DenyDeleteObject",
"Effect": "Deny",
"Principal": "*",
"Action": [
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::my-bucket/*"
]
}
]
}
- バージョニングの機能としてロック、MFA deleteがある
バケット間レプリケーション †
マルチパートアップロード †
- awscliのcp, syncは自動的にマルチパートアップロードが使われる。
特定IAM userのみに許可 †
Bucket Policy †
リダイレクト †
S3 Batch Operations: 多数のオブジェクトを対象にバッチジョブの実行 †
サーバレスでブラウザからs3へのファイルアップロード †
Presigned URL: 有効期限付URLの発行 †
2020-09-30日以降、パス形式での S3 APIリクエスト廃止 †
- 2020年10月1日以降に作成したs3 bucketが対象になった。
- S3 Bucket名にドット、大文字、アンダースコア等が含まれている場合、httpでアクセスできなくなる。新規bucketへの移行が必要。
S3 Select/Glacier Select: SQLでバケット上のCSV/JSON/Apache Parquet形式を集計 †
- awscliの場合
- AllowQuotedRecordDelimiter=True: カラムに改行が含まれている場合、Trueにしないとエラーが出る
- QuoteFields=ALWAYS: 出力時に必ずダブルクオートで囲む
- s3-select.sh
main(){
local prefix=${1:-}
local id=${2:-}
local year=${3:-}
local month=${4:-}
local day=${5:-}
local sql=${6:-"select count(*) from s3object s"}
if [ "$prefix" != "" ]; then
prefix="${prefix}/"
fi
local keys=$(
aws s3 ls \
"s3://${S3_BUCKET}/${prefix}id=${id}/year=${year}/month=${month}/day=${day}/" \
--profile $AWS_PROFILE \
--output text \
| awk '{print $4;}'
)
local tmpfile="${BASENAME}.$$.tmp"
for key in $keys; do
aws s3api select-object-content \
--bucket "${S3_BUCKET}" \
--key "${prefix}id=${id}/year=${year}/month=${month}/day=${day}/${key}" \
--input-serialization 'CSV={FileHeaderInfo=USE,AllowQuotedRecordDelimiter=True},CompressionType=GZIP' \
--output-serialization 'CSV={QuoteFields=ALWAYS}' \
--expression "${sql}" \
--expression-type SQL \
"$tmpfile" \
--profile $AWS_PROFILE \
if [ -f "$tmpfile" ]; then
cat "$tmpfile"
rm "$tmpfile"
fi
done
}
署名アルゴリズムv2の廃止と、v4への移行 †
- リージョンによっては、v4しか既に受け付けない。Mumbai等
- 最新のAWS SDKは大丈夫だが、古いSDKや独自実装しているツール系が動かなくなるため更新が必要。
ストレージクラスとライフサイクル †
ログを保存するS3 bucketはそのままだと、保存容量が増え続けて、月額費用も上がり続けるためライフサイクルを設定したほうが良い。
- 例: ログ保存用のバケットのlifecycleの場合
- AbortIncompleteMultipartUpload を7日に設定
- 30日経過後、STANDARD_IA へ移動(オブジェクトサイズ128KB、最低利用30日)
- 90日経過後、GLACIER へ移動(最低利用90日。再取得するには、3〜5時間かかる)
- 365日経過後、削除
S3+CloudFrontの静的サイトにアクセス制限を付ける †
OIDC 準拠 IdP認証: ALBのユーザ認証 + Lambdaを使って、外部でユーザ認証を行う
CloudFrontで制限:
IP制限:
Basic認証:
cognitoでユーザ管理自体を行う:
web hosting: 静的サイト †
S3単体でweb hostingできるが、https非対応等の制限がある。
CloudFrontやWAFと組みあわせで出来る事が広がる。
- Route53で名前解決
- CloudFront
- WAFでIP制限
- ACMにSSL証明書をインポート
- Aliasを設定
- S3で静的ファイル配信
- s3://my-s3-bucket/
- ACLはPrivateで、web hostingは使用しない。
S3対応クライアント †
- WinSCP:Download オープンソース。GUI。v5.13以降でS3に対応。言語ファイル追加で日本語UI対応
- 接続時にバケット名の指定ができないため、"s3:ListAllMyBuckets?"権限が必要。
Windowsでエクスプローラから参照 †
linuxファイルシステムとしてマウント †
S3でyumリポジトリ構築 †
- 必要な要素
- [S3 WebHosting] rpmファイルを公開
- createrepoコマンドでrpm metaデータ生成。EC2で行う?
- [オプション] basic認証等も付けられる
s3cmdで"ERROR: S3 error: The provided security credentials are not valid." †
s3cmdで"WARNING: Redirected to..." †
S3のSSL証明書エラーの回避 †
バケット毎にオブジェクトの有効期限(自動削除) †
- バケット毎に100個までルールを追加できる
- prefix: 削除対象のバケット名を除いたフルパスの前方一致を指定。ワイルドカードや正規表現は指定できない。指定しなければ全オブジェクトが対象
- 同じパスを含むprefixは指定できない。例:「logs/」「logs/2013」
- 一定期間をすぎたオブジェクトをGlacierに移動もできる
- 対象バケットを選択して右クリック > Properties > Lifecycle
- Add rule
- Enabled: チェック
- Name: delete logs(適当)
- Prefix: group01/logs/
- Time Period Format: Days from the creation date (オブジェクトの生成日) または Effective from date(任意の日)
- Expiration: 7 days (7日すぎたら削除)
- Save
- 確認
- Manegement Console: message.log の Propertiesに「Expiry Date: Thu Dec 06 09:00:00 GMT+900 2012」
- ObjectをGET/HEADしたときのHTTP Headers に「x-amz-expiration: expiry-date="Thu, 06 Dec 2012 00:00:00 GMT", rule-id="delete logs"」
別アカウントに許可する †
- 以前はS3FoxでEdit ACL > Share > With UserID でAWSアカウントID(数字の羅列)を入力すれば良かったがエラー「Undefined」になる(2012-11-14現在)
ただし、一度ManegementConsoleで設定すればRead/Write個別に設定できる
- user1でAWS Manegement Consoleにログイン
- S3 > com.example.user1 > properties
- Permissions Tab > Edit bucket policy
{
"Id": "Policy0000000000000",
"Statement": [
{
"Sid": "Stmt1000000000000",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::123456789012:user/iam-user-name"
]
},
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::com.com.example.user1",
"arn:aws:s3:::com.com.example.user1/*"
]
}
]
}
- Save
- 以下ではListBucketは成功するが、GetObjectが成功せず
- Add more permissions に「user2@example.com」を入力
- Grantee: user2@example.com / List,Upload/Delete 等にチェック
- Save
s3://bucket/iam-user/ 以下だけを許可する †
特定バケットのみ許可 †
- 記事
- com.example.test バケットだけアクセス許可。ディレクトリとその配下の2つを指定
{
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource":[
"arn:aws:s3:::com.example.test",
"arn:aws:s3:::com.example.test/*",
]
}
]
}
- さらに "hoge/*" 以下だけ許可。以下の書き方では"hoge"にはマッチしない。StringLikeは"s3:ListBucket"他特定メソッドにだけ使える
{
"Statement": [
{
"Sid": "Stmt0000000000001",
"Action": [
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::com.example.test",
"arn:aws:s3:::com.example.test/*"
],
"Condition": {
"StringLike": {
"s3:prefix": [ "hoge/*"]
}
}
},
{
"Sid": "Stmt0000000000002",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::com.example.test/hoge/*"
]
},
]
}
|
|