Memo/AmazonWebServices/awscli/S3

https://dexlab.net:443/pukiwiki/index.php?Memo/AmazonWebServices/awscli/S3
 

S3

  • バケット作成:LocationConstraintを指定しないとus-east-1に作成される
    aws s3api create-bucket --bucket mybucket --create-bucket-configuration LocationConstraint=ap-northeast-1
  • その他
    # バケット一覧
    aws s3 ls s3://mybucket
    
    # s3バケットを再帰的にローカルにコピー
    aws s3 cp s3://mybucket/myfolder myfolder --recursive
    
    # s3バケットとローカルを同期
    aws s3 sync s3://mybucket/myfolder myfolder --exclude *.tmp
    
    # デフォルトに指定したリージョン以外の操作には --region オプションを付ける
    aws s3 cp s3://mybucket/myfolder myfolder --recursive --region ap-northeast-1
  • バケット内一括削除。確認は無いので注意
    aws s3 rm s3://mybucket/ --recursive
  • バケットライフサイクルの指定。JSONが複雑なのでManagement Consoleで設定して、その値を取得すると楽
    aws s3api get-bucket-lifecycle --bucket mybucket > bucket-lifecycle.30.json
    
    cat bucket-lifecycle.30.json 
    {
        "Rules": [
            {
                "Status": "Enabled",
                "Prefix": "",
                "Expiration": {
                    "Days": 30
                },
                "ID": "lifecycle-30"
            }
        ]
    }
    
    aws s3api put-bucket-lifecycle --bucket mybucket --lifecycle-configuration file://bucket-lifecycle.30.json

ファイル数と合計ファイルサイズ

  • awscli cloudwatchから取得。速い
    aws_profile=example
    region=ap-northeast-1
    bucket_name=example-bucket
    start_time="$(date +%Y-%m-%d -d '-1 day')T00:00:00Z"
    end_time="$(date +%Y-%m-%d -d '-1 day')T23:59:59Z"
    period=86400
    bucket_size_info=$(aws cloudwatch get-metric-statistics \
    --profile ${aws_profile} \
    --region ${region} \
    --namespace AWS/S3 \
    --metric-name BucketSizeBytes \
    --dimensions Name=BucketName,Value=${bucket_name} Name=StorageType,Value=StandardStorage \
    --statistics Sum \
    --start-time ${start_time} \
    --end-time ${end_time} \
    --period ${period})
    
    bucket_size=$(echo ${bucket_size_info} | jq -r '.Datapoints[].Sum')
    bucket_size_gb=$(echo "scale=2; ${bucket_size} / 1024 / 1024 / 1024" | bc)
  • ファイル数が欲しい場合
    bucket_objects=$(aws cloudwatch get-metric-statistics \
    --profile ${aws_profile} \
    --region ${region} \
    --namespace AWS/S3 \
    --metric-name NumberOfObjects \
    --dimensions Name=BucketName,Value=${bucket_name} Name=StorageType,Value=AllStorageTypes \
    --statistics Average \
    --start-time ${start_time} \
    --end-time ${end_time} \
    --period ${period})
    
    bucket_objects_count=$(echo ${bucket_objects} | jq -r '.Datapoints[].Average')
  • awscli s3: このコマンドはオブジェクトが多いと非常に遅い。CloudWatchのメトリクスを参照した方が良い
    aws s3 ls s3://my-bucket/ --recursive --human --sum --profile example
    ...
    Total Objects: 14
       Total Size: 56.5 KiB

署名付オブジェクトURLでアップロードを行う

  • awscliのpresignはダウンロードのみ対応。
  • boto3の s3.generate_presigned_url()でput可能なpresign urlを払い出せるようだ。
  • 使用したアクセスキーの有効期限により、指定した有効期限より短い時間で切れる事がある
    • IAM user: max 7 days
    • IAM instance profile: max 6 hour
    • STS: max 36 hour

署名付きオブジェクトURLの生成

  • AWS CLI v1.10.59から presign が実装された。例:1時間で有効期限が切れるURLを発行。IAMでS3Readonly権限を付与したアカウントを用意した後、
    aws s3 presign s3://mybucket/example.txt --expires-in 3600
  • AWS CLI(2015-10-15)では未実装だが、botoに実装済みなので、短いスクリプトで生成できるようだ

S3 cp: ワイルドカードを使う

  • 以下のような指定はできない。
    aws s3 cp s3://mybucket/logs/*.log ./
  • --recursive --exclude "*" --include "..." を使う
    aws s3 cp s3://mybucket/ ./ --recursive --exclude "*" --include "*.log"

S3 sync

  • 例: test01とtest02だけをダウンロードしたい
    mybucket
      |-test01
      |-test02
      |-test03
aws s3 sync s3://mybucket/ ./ --exclude "*" --include "test01/*" --include "test02/*"

S3のbucket policy取得

AWS_PROFILE=default
for bucket in $(aws --profile $AWS_PROFILE s3api list-buckets --query "Buckets[].[Name]" --output text); do \
region=$(aws --profile $AWS_PROFILE s3api get-bucket-location --bucket $bucket --output text); \
echo "---- $bucket"; \
aws --profile $AWS_PROFILE --region $region s3api get-bucket-policy --bucket $bucket; \
done > $AWS_PROFILE.s3.bucket-policy.json

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-09-02 (月) 16:08:16 (15d)