[アップデート]新API「UpdateObjectEncryption」により、既存のAmazon S3オブジェクトの暗号化タイプが変更可能になりました。
既存のS3オブジェクトの暗号化タイプを変更できるようになったぞ
おのやんです。
Amazon S3(以下、S3)にUpdateObjectEncryption APIが追加されました。
記事執筆時点ではAPIのみ生えている形ですが、この機能により既存のS3オブジェクトの暗号化タイプを変更できるようになりました。これまで暗号化設定を変更するためにはオブジェクトのコピーが必要でしたが、その制約が解消された形です。
ただし、SSE-KMSからSSE-S3へは変更できませんので、注意が必要です。
ということで今回は、この新機能の概要と実際にAWS CloudShell(以下、CloudShell)で検証した結果をまとめていきたいと思います。
いままではどうしていたか?
S3オブジェクトの暗号化タイプを変更したいという要件は、例えば「セキュリティポリシーの変更によりSSE-S3からSSE-KMSへ移行したい」とか「コンプライアンス要件で特定のAWS KMS(以下、KMS)キーを使用する必要が出てきた」みたいなシーンで出ていました。
この作業を実施する場合、例えばこんな感じで、オブジェクトをコピーする必要がありました。
aws s3 cp s3://bucket/object s3://bucket/object \
--server-side-encryption aws:kms \
--ssekms-key-id arn:aws:kms:region:account:key/key-id
こちらに関しては、過去に弊社ブログでもご案内しています。
この方法だと、大量データの場合に時間やコストがかかったり、一時的にストレージ容量が2倍になる可能性がありました。また、バージョニング有効時は新バージョンが作成されますので、意図していないコストがかかる可能性もありました。
UpdateObjectEncryption APIの概要
新しく追加されたUpdateObjectEncryptionのAPIを使用すると、単純にS3オブジェクトはそのままで暗号化設定のみを変更できます。また既存のバージョンを維持した状態で変更できます。
UpdateObjectEncryptionのAPIで可能な変更は次の通りです。
- SSE-S3 => SSE-KMSへの移行
- KMSキーの切り替え(異なるカスタマー管理キーへの変更)
- S3バケットキーの有効化・無効化
今回のアップデートは汎用バケットのみ対応しています。それ以外の、例えばディレクトリバケットや S3 on Outposts は非対応となります。また暗号化されていないオブジェクト、KMSキーを使用した2層サーバー側の暗号化(DSSE-KMS)、顧客提供キーを使用したサーバー側暗号化(SSE-C)で暗号化されたオブジェクトも非対応となります。
また、SSE-KMSからSSE-S3へは変更できません。SSE-S3からSSE-KMSへ変更した後に「やっぱりSSE-S3へ戻そう」という操作はできませんので、注意してください。これは、ドキュメントにも記述があります。
Note
Additionally, you cannot specify SSE-S3 encryption as the requested new encryption type UpdateObjectEncryption request.
実際にやってみた
それでは、CloudShell上でコマンドを実行する形で、実際にこの機能を検証してみます。準備として、CloudShellのAWS CLIのバージョンを最新にしておきます。
事前準備
まず検証用の環境を準備します。S3バケット名や、各種変数を定義していきます。
AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
BUCKET_NAME="test-encryption-change-${AWS_ACCOUNT_ID}"
REGION="ap-northeast-1"
TEST_FILE="test-object.txt"
touch ${TEST_FILE}
テスト用のS3バケットを作成します。
aws s3api create-bucket \
--bucket ${BUCKET_NAME} \
--region ${REGION} \
--create-bucket-configuration LocationConstraint=${REGION}
こんな感じのメッセージが表示されたら、正常に実行できています。
{
"Location": "http://test-encryption-change-123456789012.s3.amazonaws.com/",
"BucketArn": "arn:aws:s3:::test-encryption-change-123456789012"
}
テスト用ファイルの作成とアップロードを行い、SSE-S3で暗号化します。
aws s3api put-object \
--bucket ${BUCKET_NAME} \
--key ${TEST_FILE} \
--body ${TEST_FILE} \
--server-side-encryption AES256
こんな感じのメッセージが表示されたら、正常に実行できています。
{
"ETag": "\"a270d834b07d05cd5774e84d4abf1e4b\"",
"ChecksumCRC64NVME": "IJRcEj0/MeA=",
"ChecksumType": "FULL_OBJECT",
"ServerSideEncryption": "AES256"
}
S3のコンソールでも、検証用バケットにファイルが保存されているのが確認できます。

検証用のKMSキーを作成し、ARNを取得します。
# KMSキーの作成
KMS_KEY_ID=$(aws kms create-key \
--description "Test key for S3 encryption change" \
--region ${REGION} \
--query 'KeyMetadata.KeyId' \
--output text)
# KMSキーのARNを取得(UpdateObjectEncryption APIでは完全なARNが必要)
KMS_KEY_ARN="arn:aws:kms:${REGION}:${AWS_ACCOUNT_ID}:key/${KMS_KEY_ID}"
キーのエイリアスを作成しておきます。
aws kms create-alias \
--alias-name alias/test-s3-encryption \
--target-key-id ${KMS_KEY_ID} \
--region ${REGION}
AWSのKMSコンソールからも、カスタマー管理キーが作成されていますね

SSE-S3からSSE-KMSへの変更
まず、SSE-S3からSSE-KMSへの変更を検証します。オブジェクトの現在の暗号化設定を確認します。
aws s3api head-object \
--bucket ${BUCKET_NAME} \
--key ${TEST_FILE}
こんなメッセージが表示されたらOKです。ServerSideEncryptionがAES256(SSE-S3)であることが確認できます。
{
"AcceptRanges": "bytes",
"LastModified": "2026-01-29T04:46:18+00:00",
"ContentLength": 17,
"ETag": "\"a270d834b07d05cd5774e84d4abf1e4b\"",
"ContentType": "binary/octet-stream",
"ServerSideEncryption": "AES256",
"Metadata": {}
}
それでは、SSE-S3からSSE-KMSへ暗号化タイプを変更します。こちらのAPIが、今回のアップデートで追加されたものになります。
aws s3api update-object-encryption \
--bucket ${BUCKET_NAME} \
--key ${TEST_FILE} \
--object-encryption "{
\"SSEKMS\": {
\"KMSKeyArn\": \"${KMS_KEY_ARN}\",
\"BucketKeyEnabled\": false
}
}"
オブジェクトのメタデータを確認してみましょう。
# 変更後のメタデータ確認
aws s3api head-object \
--bucket ${BUCKET_NAME} \
--key ${TEST_FILE}
このようなメッセージが表示されましたら、正常に変更できています。先ほどのメタデータ確認の際に確認できたETagの内容はそのままで、ServerSideEncryptionがAES256(SSE-S3)からaws:kmsになっています。またSSEKMSKeyIdが追加されています。ETagが一緒なので、同一のS3オブジェクトの暗号化タイプが変更されていますね!
{
"AcceptRanges": "bytes",
"LastModified": "2026-01-29T04:46:18+00:00",
"ContentLength": 17,
"ETag": "\"a270d834b07d05cd5774e84d4abf1e4b\"",
"ContentType": "binary/octet-stream",
"ServerSideEncryption": "aws:kms",
"Metadata": {},
"SSEKMSKeyId": "arn:aws:kms:ap-northeast-1:123456789012:key/f4ff7e84-0ef1-4754-b79f-e4ecd3e528f2"
}
KMSキーの切り替え
別のKMSキーへの切り替えも試してみます。 2つ目のKMSキーを作成します。
KMS_KEY_ID_2=$(aws kms create-key \
--description "Second test key for S3 encryption change" \
--region ${REGION} \
--query 'KeyMetadata.KeyId' \
--output text)
# 2つ目のKMSキーのARNを作成
KMS_KEY_ARN_2="arn:aws:kms:${REGION}:${AWS_ACCOUNT_ID}:key/${KMS_KEY_ID_2}"
キーのエイリアスを作成しておきます。
aws kms create-alias \
--alias-name alias/test-s3-encryption-2 \
--target-key-id ${KMS_KEY_ID_2} \
--region ${REGION}
KMSキーを切り替えます。
aws s3api update-object-encryption \
--bucket ${BUCKET_NAME} \
--key ${TEST_FILE} \
--object-encryption "{
\"SSEKMS\": {
\"KMSKeyArn\": \"${KMS_KEY_ARN_2}\",
\"BucketKeyEnabled\": false
}
}"
同様に、オブジェクトのメタデータを確認してみましょう。
aws s3api head-object \
--bucket ${BUCKET_NAME} \
--key ${TEST_FILE} \
ETagはそのままで、先ほどはKMSキーISがf4ff7e84-0ef1-4754-b79f-e4ecd3e528f2だったのが、今度は異なるKMSキーIDである8c159485-3aa4-4dca-9699-cd0ef47335e5に設定されていることが確認できます。
{
"AcceptRanges": "bytes",
"LastModified": "2026-01-29T04:46:18+00:00",
"ContentLength": 17,
"ETag": "\"a270d834b07d05cd5774e84d4abf1e4b\"",
"ContentType": "binary/octet-stream",
"ServerSideEncryption": "aws:kms",
"Metadata": {},
"SSEKMSKeyId": "arn:aws:kms:ap-northeast-1:123456789012:key/8c159485-3aa4-4dca-9699-cd0ef47335e5"
}
既存のS3オブジェクトの暗号化変更は、今後はこちらがメインになりそう
普通にめっちゃありがたいアップデートでした。逆に今まで暗号化形式ってそのままだと変更できなかったんですね。
いままではコピーなど何かしらのアクションが必要でしたが、今後はAPI操作でできるようになります。
記事執筆時点ではAPIのみ生えている形ですが、今後AWSコンソール上でも同様の操作ができるようになりそうですね。






