Amazon SQS に入るメッセージを
AWS Key Management Service(KMS)で暗号化する仕組み。
■ 何が起きているか
SQSにメッセージを送ると:
- メッセージはそのまま保存されない
- KMSのキーで暗号化される
- SQS内部には暗号化された状態で保存
- 取得時に自動で復号される
👉 アプリ側は暗号化を意識しなくてOK
■ 何のためにやるのか
✔ セキュリティ
- 内部データ漏洩対策
- ストレージ侵害時の保護
✔ コンプライアンス
- 金融・個人情報系ではほぼ必須
■ KMS暗号化の2パターン
① AWS管理キー(簡単)
- AWSがキー管理
- 設定だけでOK
👉 初学者・通常用途はこれで十分
② カスタマー管理キー(CMK)
- 自分でキー管理
- IAMポリシーで細かく制御可能
👉 本番・厳しいセキュリティ要件
■ CDKでの書き方
① AWS管理キーを使う(おすすめ)
import * as sqs from 'aws-cdk-lib/aws-sqs';
const queue = new sqs.Queue(this, 'MyQueue', {
encryption: sqs.QueueEncryption.KMS_MANAGED,
});
👉 裏でKMSが使われる
② カスタマー管理キーを使う
import * as sqs from 'aws-cdk-lib/aws-sqs';
import * as kms from 'aws-cdk-lib/aws-kms';
const key = new kms.Key(this, 'MyKey', {
enableKeyRotation: true,
});
const queue = new sqs.Queue(this, 'MyQueue', {
encryption: sqs.QueueEncryption.KMS,
encryptionMasterKey: key,
});
■ 実務設定
const queue = new sqs.Queue(this, 'MyQueue', {
encryption: sqs.QueueEncryption.KMS,
encryptionMasterKey: key,
dataKeyReuse: Duration.minutes(5), // コスト最適化
});
■ 注意点
① 権限が必要
KMS使うと:
- SQS
- Lambda / EC2
👉 両方にKMSの権限が必要
例:
"kms:Decrypt",
"kms:GenerateDataKey"
② コスト
KMSは無料ではない
- APIコールごとに課金
- dataKeyReuseで抑える
③ クロスサービス連携
例:
- SQS → Lambda
👉 Lambda側にKMS権限がないと
メッセージ読めない(ハマりポイント)
■ まとめ
- SQSのKMS暗号化 = 保存データを自動で暗号化
- CDKでは
encryptionを指定するだけ - 本番は KMS権限設計が本質