s3://example1/ /host1 /app1 /host2 /app1
記事:
aws s3 cp ./index.html s3://example-bucket/ \ --metadata-directive "REPLACE" \ --cache-control "no-cache,no-store" \ --content-type "text/html" \ --profile example \ --region ap-northeast-1
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くらいあると消すのも時間がかかる。
aws s3api list-buckets --query Owner.ID --output text --profile example
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のオブジェクト名にマルチバイト文字を使うのは止めた方が良い。
macOSでアップロードすると、Windows/Linuxでは別のファイル名として扱われる。
Unicode正規化方法:
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" },
PROFILE=example BUCKET=bucket VERID=**** KEY=example/example.txt aws s3api delete-object \ --bucket $BUCKET \ --version-id $VERID \ --key $KEY \ --profile $PROFILE
AWS_PROFILE=example AWS_REGION=ap-northeast-1 S3_BUCKET=example-bucket aws s3api list-multipart-uploads --bucket $S3_BUCKET --profile $AWS_PROFILE --region $AWS_REGION --query 'length(Uploads)'
https://[access_point_name]-[accountID].s3-accesspoint.[region].amazonaws.com
S3自体のコストはEC2と較べたら安いが、容量が貯まるとバカにできないくらいの金額になる。
{ "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/*" ] } ] }
{ "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/*" ] } ] }
# マルチパートアップロードの確認 aws s3api list-multipart-uploads --bucket example-bucket --profile example # 明らかにInitiated古いファイルがあれば削除 aws s3api abort-multipart-upload \ --profile example \ --bucket example-bucket \ --key <object path> \ --upload-id <long id>
"Resource": [ "arn:aws:s3:::example1/*", "arn:aws:s3:::example2/*" ],
http://s3.amazonaws.com/<bucket> # us-east-1のみ http://<region>.amazonaws.com/<bucket>
http://<bucket>.s3.amazonaws.com http://<bucket>.s3-ap-northeast-1.amazonaws.com
s3://<bucket>/<prefix>/id=<id>/year=<year>/month=<month>/day=<day>/<id>.<host>.<timestamp>.csv.gz
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 }
改訂されたプラン — 2020年6月24日以降に作成された新しいバケットは SigV2 署名付きリクエストはサポートされません。ただし、既存のバケットについて引き続き SigV2 がサポートされますが、我々はお客様が古いリクエスト署名方法から移行するよう働きかけます。
ログを保存するS3 bucketはそのままだと、保存容量が増え続けて、月額費用も上がり続けるためライフサイクルを設定したほうが良い。
ALB + S3: ALBで認証を付ける
OIDC 準拠 IdP認証: ALBのユーザ認証 + Lambdaを使って、外部でユーザ認証を行う
CloudFrontで制限:
IP制限:
Basic認証:
cognitoでユーザ管理自体を行う:
S3単体でweb hostingできるが、https非対応等の制限がある。
CloudFrontやWAFと組みあわせで出来る事が広がる。
Amazon S3 ウェブサイトエンドポイントは HTTPS をサポートしていません。Amazon S3 バケットで HTTPS を使用する方法については、「CloudFront を使用して Amazon S3 バケットに HTTPS リクエストを提供するには、どうすればよいですか?」と「CloudFront と Amazon S3 オリジンとの通信で HTTPS を必須にする」を参照してください。
http://<bucket name>.s3-website-<region name>.amazonaws.com/<file path>
https://<bucket name>.s3-website-<region name>.amazonaws.com/<file path>
# ローカルが削除されたら、リモートも削除する場合 -s3cmd sync --delete-removed /path/to/ s3:/BUCKET/path/to/
s3cmd -H du s3://com.example.test 33k s3://com.example.test/
s3cmd ls s3://bucket-name ERROR: S3 error: The provided security credentials are not valid.
echo "signature_v2 = True" >> ~/.s3cfg
s3cmd ls s3://com.example.www/ WARNING: Redirected to: com.example.www.s3-us-west-2.amazonaws.com
vim ~/.s3cfg ---- bucket_location = us-west-2 host_base = s3-us-west-2.amazonaws.com host_bucket = %(bucket)s.s3-us-west-2.amazonaws.com simpledb_host = sdb.us-west-2.amazonaws.com ----
cURL error: SSL: certificate subject name '*.s3.amazonaws.com' does not match target host name 'com.example.www.s3.amazonaws.com'
$s3->use_ssl = false; // SSLを使わない
$ret = $s3->list_buckets ( array( "curlopts" => array(CURLOPT_SSL_VERIFYPEER => false), ) );
\---com.example.www \---group01 \---logs \---2013 \---01 +---01 | +---server01 | | message.log | | | \---server02 | message.log | \---02 +---server01 | message.log | \---server02 message.log
{ "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/*" ] } ] }
{ "Statement": [ { "Effect": "Allow", "Action": "s3:*", "Resource":[ "arn:aws:s3:::com.example.test", "arn:aws:s3:::com.example.test/*", ] } ] }
{ "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/*" ] }, ] }