AWSでオブジェクトロック、バージョニング、ライフサイクルを理解するE2E検証をする場合の環境設定

投稿者: | 2月 13, 2025

最近、家の事情というか、とある相続の過程で、A4びっしりの直筆の文章を書く必要があった。もちろん、辞表とか始末書ではない。今時、辞表も始末書もパソコンで済ますことが可能なのに、このご時世、完全、直筆手書きで、さらに名前、住所、捺印をしてくださいと。。。なんなんw その書類を書いていて思ったのだが、まず、漢字は出てこない、さらに横と縦をまっすぐに書くのもの難しい。。。まぁ書き上げて提出したが、どうなったのか、次の書類が来たから物事が進んだと思われる。

こんなことをしていて、ふと思ったのだが、コロナ禍開けてから、手帳やノートを使っている人が結構減った気がする。会社でもパソコンだけ広げてあーでもない、こーでもないとやっているように見える。自分からするとよくまとまるなと思う。自分はパワポ作成でネタが出てこないときは紙に絵コンテとか書いちゃう派なんだよなぁ。これも自分の周りだけの話かもしれないが。

 

閑話休題

 

ここに記載されている設定は、以下のMinIOの検証をAWS S3で行う場合の設定を記載した。

https://www.blog.slow-fire.net/2025/02/13/minioでオブジェクトロック、バージョニング、ライ/

  • AWSCLIで管理者権限のユーザプロファイルがあるのが前提。またMinIOのmcクライアントもインストールされていることが前提。
  • ポリシーのパラメータでは、プロバイダーから割り当てられたIPv4アドレスとIPv6レンジの指定が必要。(さすが、今時のご時世、IPアドレス全開けもできないし、今は大抵IPv6が配られているし。というか、自環境の事情でもある。。。)
  • パラメータの名前は、hoge-s3で始まるものにしているが、他の名前にしたほうがいい。
  • 殴り書きレベルなので、全部は試していない。

 

環境構築

# リージョンの指定
AWS_DEFAULT_REGION=ap-northeast-1

# IAMユーザの作成 (hoge-s3-test)
aws iam list-users
aws iam create-user --user-name hoge-s3-test
aws iam list-users

# アクセスキーを作成し、環境変数へ設定
CREDENTIALS_JSON=$(aws iam create-access-key --user-name hoge-s3-test)

# アクセスキーをファイルに保存
echo "$CREDENTIALS_JSON" > hoge-s3-test-credentials.json
cat hoge-s3-test-credentials.json

# 環境変数へ設定
export S3TEST_AWS_ACCESS_KEY_ID=$(echo $CREDENTIALS_JSON | jq -r '.AccessKey.AccessKeyId')
export S3TEST_AWS_SECRET_ACCESS_KEY=$(echo $CREDENTIALS_JSON | jq -r '.AccessKey.SecretAccessKey')

# 確認
echo "AWS_ACCESS_KEY_ID=$S3TEST_AWS_ACCESS_KEY_ID"
echo "AWS_SECRET_ACCESS_KEY=$S3TEST_AWS_SECRET_ACCESS_KEY"

# mcクライアントのエイリアスを作成
mc alias set testuser https://s3.$AWS_DEFAULT_REGION.amazonaws.com $S3TEST_AWS_ACCESS_KEY_ID $S3TEST_AWS_SECRET_ACCESS_KEY --api s3v4

# バケット名
BUCKET_NAME="hoge-s3-test-$(shuf -i 1000-9999 -n 1)"
echo "Bucket Name: $BUCKET_NAME"

# IAMポリシーファイルを作成
cat > hoge-s3-test-iam-policy.json <<EOF
{
"Version": "2012-10-17",
"Statement": [
  {
    "Effect": "Allow",
    "Action": [
      "s3:ListAllMyBuckets",
      "s3:ListBucket",
      "s3:GetObject",
      "s3:PutObject",
      "s3:DeleteObject",
      "s3:GetBucketVersioning",
      "s3:ListBucketVersions",
      "s3:GetObjectVersion",
      "s3:GetBucketObjectLockConfiguration",
      "s3:GetObjectRetention",
      "s3:PutObjectRetention",
      "s3:BypassGovernanceRetention",
      "s3:GetLifecycleConfiguration",
      "s3:PutObjectLegalHold",
      "s3:GetObjectLegalHold"
    ],
    "Resource": [
      "arn:aws:s3:::${BUCKET_NAME}",
      "arn:aws:s3:::${BUCKET_NAME}*"
    ],
    "Condition": {
      "IpAddress": {
        "aws:SourceIp": [
          "<プロバイダーから割り当てられたIPv4アドレス>",
          "<プロバイダーから割り当てられたIPv6アドレスレンジ>"
        ]
      }
    }
  }
]
}
EOF

# IAMポリシーを適用
aws iam put-user-policy --user-name hoge-s3-test --policy-name S3TestAccessPolicy --policy-document file://hoge-s3-test-iam-policy.json
# IAMポリシー確認
aws iam get-user-policy --user-name hoge-s3-test --policy-name S3TestAccessPolicy

# バケット作成
aws s3api create-bucket --bucket $BUCKET_NAME --region $AWS_DEFAULT_REGION \
  --create-bucket-configuration LocationConstraint=$AWS_DEFAULT_REGION \
  --object-lock-enabled-for-bucket

# バージョニングを有効化
aws s3api put-bucket-versioning --bucket $BUCKET_NAME \
  --versioning-configuration Status=Enabled
# オブジェクトロックの有効化
aws s3api put-object-lock-configuration --bucket $BUCKET_NAME \
    --object-lock-configuration "ObjectLockEnabled=Enabled"

#バケットへのアクセス確認
mc ls testuser/$BUCKET_NAME

#バケットポリシーファイルを作成
ACCOUNT_ID=$(aws sts get-caller-identity --query "Account" --output text)

cat > hoge-s3-test-bucket-policy.json <<EOF
{
"Version": "2012-10-17",
"Statement": [
  {
    "Effect": "Allow",
    "Principal": {
      "AWS": "arn:aws:iam::${ACCOUNT_ID}:user/hoge-s3-test"
    },
    "Action": [
      "s3:ListBucket",
      "s3:GetObject",
      "s3:PutObject",
      "s3:DeleteObject",
      "s3:ListBucketVersions",
      "s3:GetObjectVersion",
      "s3:GetBucketObjectLockConfiguration",
      "s3:GetObjectRetention",
      "s3:PutObjectRetention",
      "s3:BypassGovernanceRetention",
      "s3:GetLifecycleConfiguration",
      "s3:PutObjectLegalHold",
      "s3:GetObjectLegalHold"
    ],
    "Resource": [
      "arn:aws:s3:::${BUCKET_NAME}",
      "arn:aws:s3:::${BUCKET_NAME}/*"
    ],
    "Condition": {
      "IpAddressIfExists": {
        "aws:SourceIp": [
          "<プロバイダーから割り当てられたIPv4アドレス>",
          "<プロバイダーから割り当てられたIPv6アドレスレンジ>"
        ]
      }
    }
  }
]
}
EOF

#バケットポリシーの適用
aws s3api put-bucket-policy --bucket $BUCKET_NAME --policy file://hoge-s3-test-bucket-policy.json
#バケットポリシー確認
aws s3api get-bucket-policy --bucket $BUCKET_NAME

#バージョンとオブジェクトロック確認
aws s3api get-object-lock-configuration --bucket $BUCKET_NAME
aws s3api get-bucket-versioning --bucket $BUCKET_NAME
mc version info testuser/$BUCKET_NAME

#バケットへのアクセス確認
mc ls testuser/$BUCKET_NAME

 

ライフサイクルの設定

# ライフサイクルのポリシー作成
cat > hoge-s3-test-lifecycle-policy.json <<EOF
{
"Rules": [
  {
    "ID": "ExpireNonCurrentVersions",
    "Status": "Enabled",
    "Filter": {},
    "NoncurrentVersionExpiration": {
      "NoncurrentDays": 1
    }
  }
]
}
EOF

# ライフサイクルのポリシーの適用
aws s3api put-bucket-lifecycle-configuration --bucket ${BUCKET_NAME} --lifecycle-configuration file://hoge-s3-test-lifecycle-policy.json

 

削除したい時

パブリッククラウドの場合、作って、使い終わったら、ゴミにならないように必ず消す習慣が必要。変に残しておいてセキュリティ事故や課金が発生したらたまったもんじゃない。

# 事前に取得したバケット名を指定
BUCKET_NAME=$(aws s3api list-buckets --query "Buckets[?starts_with(Name, 'hoge-s3-test-')].Name" --output text)
USER_NAME="hoge-s3-test"
POLICY_NAME="S3TestAccessPolicy"

echo "Remove for bucket: $BUCKET_NAME"
echo "Remove for user: $USER_NAME"
echo "Remove IAM policy: $POLICY_NAME"

#ライフサイクルポリシーの削除
aws s3api delete-bucket-lifecycle --bucket ${BUCKET_NAME}

# バケットポリシーを削除
aws s3api delete-bucket-policy --bucket $BUCKET_NAME

# バケット内のオブジェクトを削除
aws s3api list-object-versions --bucket $BUCKET_NAME --query '{Objects: Versions[].{Key:Key,VersionId:VersionId}}' --output json | jq -c '.Objects[]' | while read obj; do
KEY=$(echo $obj | jq -r '.Key')
VERSION_ID=$(echo $obj | jq -r '.VersionId')
aws s3api delete-object --bucket $BUCKET_NAME --key "$KEY" --version-id "$VERSION_ID"
done

#バケット内の削除マーカーを削除
aws s3api list-object-versions --bucket $BUCKET_NAME --query '{Objects: DeleteMarkers[].{Key:Key,VersionId:VersionId}}' --output json | jq -c '.Objects[]' | while read obj; do
KEY=$(echo $obj | jq -r '.Key')
VERSION_ID=$(echo $obj | jq -r '.VersionId')
aws s3api delete-object --bucket $BUCKET_NAME --key "$KEY" --version-id "$VERSION_ID"
done

# バケットを削除
aws s3api delete-bucket --bucket $BUCKET_NAME

# IAMポリシーを削除
aws iam delete-user-policy --user-name $USER_NAME --policy-name $POLICY_NAME

# IAMアクセスキーを削除
aws iam list-access-keys --user-name $USER_NAME --query 'AccessKeyMetadata[].AccessKeyId' --output text | while read key_id; do
aws iam delete-access-key --user-name $USER_NAME --access-key-id $key_id
done

# IAMユーザを削除"
aws iam delete-user --user-name $USER_NAME

# mcクライアントのエイリアス削除
mc alias remove testuser

# 作成されたファイルの削除
rm hoge-s3-test-credentials.json hoge-s3-test-iam-policy.json hoge-s3-test-bucket-policy.json hoge-s3-test-lifecycle-policy.json

 

こんな感じとなる。それにしてもMinIOのmcクライアントは本当によくできているなぁ。

コメントを残す