ECSクラスターのECS Execのログ設定で暗号化を有効化するオプションの効力を確認してみた
ECSクラスターのECS Execのログ設定で暗号化を有効化するオプションの意味が気になる
こんにちは、のんピ(@non____97)です。
皆さんはECSクラスターのECS Execのログ設定で暗号化を有効化するオプションの意味が気になったことはありますか? 私はあります。
具体的には以下項目です。

CloudWatch 暗号化を有効にする
セキュリティを強化するために、AWS KMS キーを使用して CloudWatch Logs に保存されているログデータを暗号化できます。詳細S3 暗号化を有効にする
Amazon S3 に保存されているデータのサーバー側暗号化を有効にします。詳細
と記載されています。
これらオプションを有効化すると何が行われるのでしょうか。
CloudWatch Logsロググループの保存時の暗号化設定はCloudWatch Logsロググループ側で行う形です。ログストリーム毎に暗号化キーを変更することはできないため、ECSクラスター側で設定したとて影響範囲が分かりづらいです。
S3バケットにおいてはオブジェクト毎に異なる暗号化キーを使用することが可能です。PUT時に暗号化キーを指定しない場合はS3バケットで設定した暗号化キーが使用されます。
すべての Amazon S3 バケットにはデフォルトで暗号化が設定されており、S3 バケットにアップロードされたすべての新しいオブジェクトは保存時に自動的に暗号化されます。Amazon S3 マネージドキーによるサーバー側の暗号化 (SSE-S3) は、Amazon S3 のすべてのバケットでのデフォルトの暗号化設定です。別のタイプの暗号化を使用するには、S3 PUT リクエストで使用するサーバー側の暗号化のタイプを指定するか、宛先バケットにデフォルトの暗号化設定を更新できます。
PUT リクエストで別の暗号化タイプを指定する場合は、AWS Key Management Service (AWS KMS) キーによるサーバー側の暗号化 (SSE-KMS)、AWS KMS キーによる二層式サーバー側の暗号化 (DSSE-KMS)、または顧客提供のキーによるサーバー側の暗号化 (SSE-C) を使用できます。宛先バケットに別のデフォルト暗号化設定を設定する場合は、SSE-KMS または DSSE-KMS を使用できます。
このオプションを有効化することで何に作用するのか気になります。ECS Exec セッションの KMS キー IDで指定したKMSキーで暗号化をしてくれるのでしょうか。
いきなりまとめ
CloudWatch 暗号化を有効にするはロググループ側でKMSによる暗号化が行われているかどうかチェックする機能- これを有効化することで追加で暗号化を行うものではない
- ロググループ側でKMSキーを指定した暗号化を行なっていない場合、ECS Exec時にエラーになり、セッションを開始できない
S3 暗号化を有効にするもSSE-S3やSSE-KMS、DSSE-KMSとS3バケット側での暗号化が行われていない場合にエラーを吐くオプションと想像- しかし、現在は新規作成するS3バケットはデフォルト暗号化が行われているので、その効力は感じにくい
- こちらはS3バケットのデフォルト暗号化設定がSSE-S3であってもエラーにはならない
やっていみた
検証環境
検証環境は以下のとおりです。

以下記事で使用したものを流用します。
コードは以下リポジトリに保存しています。
ECS Exec セッションの KMS キー ID が未指定 かつ ロググループ側での暗号化していない かつ "CloudWatch 暗号化を有効にする" が有効な状態でECS Exec
ECS Exec セッションの KMS キー ID が未指定 かつ ロググループ側での暗号化していない かつ CloudWatch 暗号化を有効にする が有効な状態でECS Execを行います。
ECS Exec セッションの KMS キー IDはローカルクライアントとコンテナ間のデータを暗号化する際に使用するものです。この値はセッションログの保存とは関係ないかもしれないですが確認します。ちなみに、KMSキーを指定しなくとも暗号化はしてくれます。
デフォルトでは、ローカルクライアントとコンテナ間で転送されるデータは、AWSが提供するTLS 1.2暗号化を使用します。独自のKMSキーを使用してデータをさらに暗号化するには、KMSキーを作成し、kms:Decrypt タスクIAMロールに権限を追加する必要があります。
ECS Exec で Amazon ECS コンテナを監視する - Amazon Elastic Container Service
AWS CDKのコードは以下のとおりです。
// ECS Exec log destinations
const ecsExecLogGroup = new cdk.aws_logs.LogGroup(this, "EcsExecLogGroup");
const ecsExecLogBucketConstruct = new BucketConstruct(
this,
"ecsExecLogBucketConstruct"
);
// ECS Cluster
const cluster = new cdk.aws_ecs.Cluster(this, "Cluster", {
vpc,
containerInsightsV2: cdk.aws_ecs.ContainerInsights.ENHANCED,
executeCommandConfiguration: {
logConfiguration: {
cloudWatchLogGroup: ecsExecLogGroup,
cloudWatchEncryptionEnabled: true,
s3Bucket: ecsExecLogBucketConstruct.bucket,
s3EncryptionEnabled: true,
},
logging: cdk.aws_ecs.ExecuteCommandLogging.OVERRIDE,
},
});
.
.
(中略)
.
.
ecsExecLogGroup.grantWrite(taskDefinition.taskRole);
ecsExecLogBucketConstruct.bucket.grantPut(taskDefinition.taskRole);
デプロイすると以下のような状態になっていました。

この状態でECS Execをします。
$ aws ecs execute-command --cluster EcsNativeBlueGreenStack-EcsConstructCluster14AE103B-1MjYOc4hurGm --task fccb314295bf438aa3dc08d17330871a --container app --interactive --command '/bin/sh'
The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.
Starting session with SessionId: ecs-execute-command-z5jcak4cga3aoe9ti5b2y8vczq
SessionId: ecs-execute-command-z5jcak4cga3aoe9ti5b2y8vczq : We couldn't start the session because encryption is not set up on the selected CloudWatch Logs log group. Either encrypt the log group or choose an option to enable logging without encryption.
はい、エラーになりました。
エラーの文言的にCloudWatch Logsのロググループで暗号化を行なっていないがためにエラーになっていそうです。
ログ出力先をS3バケットのみにしてECS Exec
ログ出力先をS3バケットのみにしてECS Execにします。
cdk diffの結果は以下のとおりです。
> cdk diff --no-change-set
[Warning at /EcsNativeBlueGreenStack/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/ServiceRole] Failed to add construct metadata for node [ServiceRole]. Reason: ValidationError: The result of fromAwsManagedPolicyName can not be used in this API [ack: @aws-cdk/core:addConstructMetadataFailed]
[Warning at /EcsNativeBlueGreenStack/EcsConstruct/Service/AlternateTargetRole] Failed to add construct metadata for node [AlternateTargetRole]. Reason: ValidationError: The result of fromAwsManagedPolicyName can not be used in this API [ack: @aws-cdk/core:addConstructMetadataFailed]
Stack EcsNativeBlueGreenStack
IAM Statement Changes
┌───┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬────────┬──────────────────────────────────┬─────────────────────────────────────────────┬───────────┐
│ │ Resource │ Effect │ Action │ Principal │ Condition │
├───┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼────────┼──────────────────────────────────┼─────────────────────────────────────────────┼───────────┤
│ - │ * │ Allow │ logs:DescribeLogGroups │ AWS:${EcsConstruct/TaskDefinition/TaskRole} │ │
│ │ │ │ s3:GetBucketLocation │ │ │
│ │ │ │ ssmmessages:CreateControlChannel │ │ │
│ │ │ │ ssmmessages:CreateDataChannel │ │ │
│ │ │ │ ssmmessages:OpenControlChannel │ │ │
│ │ │ │ ssmmessages:OpenDataChannel │ │ │
├───┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼────────┼──────────────────────────────────┼─────────────────────────────────────────────┼───────────┤
│ - │ arn:${AWS::Partition}:logs:${AWS::Region}:${AWS::AccountId}:log-group:${EcsConstructEcsExecLogGroup567B87CF}:* │ Allow │ logs:CreateLogStream │ AWS:${EcsConstruct/TaskDefinition/TaskRole} │ │
│ │ │ │ logs:DescribeLogStreams │ │ │
│ │ │ │ logs:PutLogEvents │ │ │
├───┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼────────┼──────────────────────────────────┼─────────────────────────────────────────────┼───────────┤
│ + │ * │ Allow │ s3:GetBucketLocation │ AWS:${EcsConstruct/TaskDefinition/TaskRole} │ │
│ │ │ │ ssmmessages:CreateControlChannel │ │ │
│ │ │ │ ssmmessages:CreateDataChannel │ │ │
│ │ │ │ ssmmessages:OpenControlChannel │ │ │
│ │ │ │ ssmmessages:OpenDataChannel │ │ │
└───┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴────────┴──────────────────────────────────┴─────────────────────────────────────────────┴───────────┘
(NOTE: There may be security-related changes not in this list. See https://github.com/aws/aws-cdk/issues/1299)
Resources
[~] AWS::ECS::Cluster EcsConstruct/Cluster EcsConstructCluster14AE103B
└─ [~] Configuration
└─ [~] .ExecuteCommandConfiguration:
└─ [~] .LogConfiguration:
├─ [-] Removed: .CloudWatchEncryptionEnabled
└─ [-] Removed: .CloudWatchLogGroupName
[~] AWS::IAM::Policy EcsConstruct/TaskDefinition/TaskRole/DefaultPolicy EcsConstructTaskDefinitionTaskRoleDefaultPolicy0C05A2A5
└─ [~] PolicyDocument
└─ [~] .Statement:
└─ @@ -90,7 +90,6 @@
[ ] },
[ ] {
[ ] "Action": [
[-] "logs:DescribeLogGroups",
[ ] "s3:GetBucketLocation",
[ ] "ssmmessages:CreateControlChannel",
[ ] "ssmmessages:CreateDataChannel",
@@ -101,38 +100,6 @@
[ ] "Resource": "*"
[ ] },
[ ] {
[-] "Action": [
[-] "logs:CreateLogStream",
[-] "logs:DescribeLogStreams",
[-] "logs:PutLogEvents"
[-] ],
[-] "Effect": "Allow",
[-] "Resource": {
[-] "Fn::Join": [
[-] "",
[-] [
[-] "arn:",
[-] {
[-] "Ref": "AWS::Partition"
[-] },
[-] ":logs:",
[-] {
[-] "Ref": "AWS::Region"
[-] },
[-] ":",
[-] {
[-] "Ref": "AWS::AccountId"
[-] },
[-] ":log-group:",
[-] {
[-] "Ref": "EcsConstructEcsExecLogGroup567B87CF"
[-] },
[-] ":*"
[-] ]
[-] ]
[-] }
[-] },
[-] {
[ ] "Action": "s3:PutObject",
[ ] "Effect": "Allow",
[ ] "Resource": {
✨ Number of stacks with differences: 1
S3バケットではデフォルト暗号化でSSE-S3を使用しています。S3 暗号化を有効にするが有効だと何か変わるのでしょうか。
ECS Execでコンテナに接続します。
~ $ aws ecs execute-command --cluster EcsNativeBlueGreenStack-EcsConstructCluster14AE103B-1MjYOc4hurGm --task fccb314295bf438aa3dc08d17330871a --container web --interactive --command '/bin/sh'
The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.
Starting session with SessionId: ecs-execute-command-pbl86xd5nnszhvyzr2oqtsi33i
/ # ls -l
total 76
drwxr-xr-x 1 root root 4096 Jan 20 09:03 bin
drwxr-xr-x 5 root root 360 Jan 20 09:06 dev
drwxr-xr-x 1 root root 4096 Dec 24 05:18 docker-entrypoint.d
-rwxr-xr-x 1 root root 1620 Dec 24 05:18 docker-entrypoint.sh
drwxr-xr-x 1 root root 4096 Jan 20 09:06 etc
drwxr-xr-x 2 root root 4096 Dec 17 07:03 home
drwxr-xr-x 1 root root 4096 Dec 17 07:03 lib
drwxr-xr-x 3 root root 4096 Jan 20 09:06 managed-agents
drwxr-xr-x 5 root root 4096 Dec 17 07:03 media
drwxr-xr-x 2 root root 4096 Dec 17 07:03 mnt
drwxr-xr-x 2 root root 4096 Dec 17 07:03 opt
dr-xr-xr-x 210 root root 0 Jan 20 09:06 proc
drwx------ 1 root root 4096 Jan 20 09:29 root
drwxr-xr-x 1 root root 4096 Jan 20 09:06 run
drwxr-xr-x 1 root root 4096 Jan 20 09:03 sbin
drwxr-xr-x 2 root root 4096 Dec 17 07:03 srv
dr-xr-xr-x 12 root root 0 Jan 20 09:05 sys
drwxrwxrwt 2 root root 4096 Dec 17 07:03 tmp
drwxr-xr-x 1 root root 4096 Dec 17 07:03 usr
drwxr-xr-x 1 root root 4096 Dec 17 07:03 var
/ # exit
Exiting session with sess
問題なく接続できました。
exitをすると、S3バケットにECS ExecセッションIDのキーでログオブジェクトが出力されていました。暗号化タイプはSSE-S3ですね。

ECS Exec セッションの KMS キー ID が指定 かつ ロググループ側での暗号化していない かつ "CloudWatch 暗号化を有効にする" が有効な状態でECS Exec
ECS Exec セッションの KMS キー ID が指定 かつ ロググループ側での暗号化していない かつ CloudWatch 暗号化を有効にする が有効な状態でECS Execをしてみます。
AWS CDKのコードを以下のように変更します。
// ECS Exec log destinations
const kmsKey = new cdk.aws_kms.Key(this, "Key");
const ecsExecLogGroup = new cdk.aws_logs.LogGroup(this, "EcsExecLogGroup");
const ecsExecLogBucketConstruct = new BucketConstruct(
this,
"ecsExecLogBucketConstruct"
);
// ECS Cluster
const cluster = new cdk.aws_ecs.Cluster(this, "Cluster", {
vpc,
containerInsightsV2: cdk.aws_ecs.ContainerInsights.ENHANCED,
executeCommandConfiguration: {
kmsKey,
logConfiguration: {
cloudWatchLogGroup: ecsExecLogGroup,
cloudWatchEncryptionEnabled: true,
s3Bucket: ecsExecLogBucketConstruct.bucket,
s3EncryptionEnabled: true,
},
logging: cdk.aws_ecs.ExecuteCommandLogging.OVERRIDE,
},
});
cdk diffの結果は以下のとおりです。
> cdk diff
[Warning at /EcsNativeBlueGreenStack/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/ServiceRole] Failed to add construct metadata for node [ServiceRole]. Reason: ValidationError: The result of fromAwsManagedPolicyName can not be used in this API [ack: @aws-cdk/core:addConstructMetadataFailed]
[Warning at /EcsNativeBlueGreenStack/EcsConstruct/Service/AlternateTargetRole] Failed to add construct metadata for node [AlternateTargetRole]. Reason: ValidationError: The result of fromAwsManagedPolicyName can not be used in this API [ack: @aws-cdk/core:addConstructMetadataFailed]
start: Building EcsNativeBlueGreenStack Template
success: Built EcsNativeBlueGreenStack Template
start: Publishing EcsNativeBlueGreenStack Template (current_account-current_region-6d05c18c)
success: Published EcsNativeBlueGreenStack Template (current_account-current_region-6d05c18c)
Hold on while we create a read-only change set to get a diff with accurate replacement information (use --no-change-set to use a less accurate but faster template-only diff)
Stack EcsNativeBlueGreenStack
IAM Statement Changes
┌───┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬────────┬──────────────────────────────────┬───────────────────────────────────────────────────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ │ Resource │ Effect │ Action │ Principal │ Condition │
├───┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼────────┼──────────────────────────────────┼───────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ - │ * │ Allow │ s3:GetBucketLocation │ AWS:${EcsConstruct/TaskDefinition/TaskRole} │ │
│ │ │ │ ssmmessages:CreateControlChannel │ │ │
│ │ │ │ ssmmessages:CreateDataChannel │ │ │
│ │ │ │ ssmmessages:OpenControlChannel │ │ │
│ │ │ │ ssmmessages:OpenDataChannel │ │ │
├───┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼────────┼──────────────────────────────────┼───────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ + │ ${EcsConstruct/Key.Arn} │ Allow │ kms:* │ AWS:arn:${AWS::Partition}:iam::${AWS::AccountId}:root │ │
│ + │ ${EcsConstruct/Key.Arn} │ Allow │ kms:Decrypt* │ Service:logs.${AWS::Region}.amazonaws.com │ "ArnLike": { │
│ │ │ │ kms:Describe* │ │ "kms:EncryptionContext:aws:logs:arn": "arn:${AWS::Partition}:logs:${AWS::Region}:${AWS::AccountId}:*" │
│ │ │ │ kms:Encrypt* │ │ } │
│ │ │ │ kms:GenerateDataKey* │ │ │
│ │ │ │ kms:ReEncrypt* │ │ │
│ + │ ${EcsConstruct/Key.Arn} │ Allow │ kms:Decrypt │ AWS:${EcsConstruct/TaskDefinition/TaskRole} │ │
│ │ │ │ kms:GenerateDataKey │ │ │
├───┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼────────┼──────────────────────────────────┼───────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ + │ * │ Allow │ logs:DescribeLogGroups │ AWS:${EcsConstruct/TaskDefinition/TaskRole} │ │
│ │ │ │ s3:GetBucketLocation │ │ │
│ │ │ │ ssmmessages:CreateControlChannel │ │ │
│ │ │ │ ssmmessages:CreateDataChannel │ │ │
│ │ │ │ ssmmessages:OpenControlChannel │ │ │
│ │ │ │ ssmmessages:OpenDataChannel │ │ │
├───┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼────────┼──────────────────────────────────┼───────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ + │ arn:${AWS::Partition}:logs:${AWS::Region}:${AWS::AccountId}:log-group:${EcsConstructEcsExecLogGroup567B87CF}:* │ Allow │ logs:CreateLogStream │ AWS:${EcsConstruct/TaskDefinition/TaskRole} │ │
│ │ │ │ logs:DescribeLogStreams │ │ │
│ │ │ │ logs:PutLogEvents │ │ │
└───┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴────────┴──────────────────────────────────┴───────────────────────────────────────────────────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────┘
(NOTE: There may be security-related changes not in this list. See https://github.com/aws/aws-cdk/issues/1299)
Resources
[+] AWS::KMS::Key EcsConstruct/Key EcsConstructKeyDE871070
[~] AWS::ECS::Cluster EcsConstruct/Cluster EcsConstructCluster14AE103B
└─ [~] Configuration
└─ [~] .ExecuteCommandConfiguration:
├─ [+] Added: .KmsKeyId
└─ [~] .LogConfiguration:
├─ [+] Added: .CloudWatchEncryptionEnabled
└─ [+] Added: .CloudWatchLogGroupName
[~] AWS::IAM::Policy EcsConstruct/TaskDefinition/TaskRole/DefaultPolicy EcsConstructTaskDefinitionTaskRoleDefaultPolicy0C05A2A5
└─ [~] PolicyDocument
└─ [~] .Statement:
└─ @@ -90,6 +90,7 @@
[ ] },
[ ] {
[ ] "Action": [
[+] "logs:DescribeLogGroups",
[ ] "s3:GetBucketLocation",
[ ] "ssmmessages:CreateControlChannel",
[ ] "ssmmessages:CreateDataChannel",
@@ -100,6 +101,51 @@
[ ] "Resource": "*"
[ ] },
[ ] {
[+] "Action": [
[+] "kms:Decrypt",
[+] "kms:GenerateDataKey"
[+] ],
[+] "Effect": "Allow",
[+] "Resource": {
[+] "Fn::GetAtt": [
[+] "EcsConstructKeyDE871070",
[+] "Arn"
[+] ]
[+] }
[+] },
[+] {
[+] "Action": [
[+] "logs:CreateLogStream",
[+] "logs:DescribeLogStreams",
[+] "logs:PutLogEvents"
[+] ],
[+] "Effect": "Allow",
[+] "Resource": {
[+] "Fn::Join": [
[+] "",
[+] [
[+] "arn:",
[+] {
[+] "Ref": "AWS::Partition"
[+] },
[+] ":logs:",
[+] {
[+] "Ref": "AWS::Region"
[+] },
[+] ":",
[+] {
[+] "Ref": "AWS::AccountId"
[+] },
[+] ":log-group:",
[+] {
[+] "Ref": "EcsConstructEcsExecLogGroup567B87CF"
[+] },
[+] ":*"
[+] ]
[+] ]
[+] }
[+] },
[+] {
[ ] "Action": "s3:PutObject",
[ ] "Effect": "Allow",
[ ] "Resource": {
✨ Number of stacks with differences: 1
これでデプロイして、ECS Execでコンテナに接続します。
~ $ aws ecs execute-command --cluster EcsNativeBlueGreenStack-EcsConstructCluster14AE103B-1MjYOc4hurGm --task fccb314295bf438aa3dc08d17330871a --container web --interactive --command '/bin/sh'
The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.
Starting session with SessionId: ecs-execute-command-h7y4vzsz94o9kzux9lqjvpxqkq
This session is encrypted using AWS KMS.
SessionId: ecs-execute-command-h7y4vzsz94o9kzux9lqjvpxqkq : We couldn't start the session because encryption is not set up on the selected CloudWatch Logs log group. Either encrypt the log group or choose an option to enable logging without encryption.
はい、先ほどと全く同じエラーで失敗しました。
もしかすると、CloudWatch 暗号化を有効にするはロググループ側でKMSによる暗号化が行われているかどうかチェックするだけの機能かもしれません。ちなみに、ロググループではKMSキーを指定しなくとも暗号化はなされています。
ロググループのデータは常に CloudWatch Logs で暗号化されます。デフォルトでは、CloudWatch Logs は 256 ビットの Advanced Encryption Standard Galois/Counter Mode (AES-GCM) によるサーバー側の暗号化を使用して、保管中のログデータを暗号化します。別の方法として、この暗号化には AWS Key Management Service を使用できます。その場合、暗号化は AWS KMS キーを使用して行われます。を使用した暗号化 AWS KMS は、ロググループの作成時または作成後に、KMS キーをロググループに関連付けることで、ロググループレベルで有効になります。
を使用して CloudWatch Logs のログデータを暗号化する AWS Key Management Service - Amazon CloudWatch Logs
ECS Exec セッションの KMS キー ID が指定 かつ ロググループ側での暗号化している かつ "CloudWatch 暗号化を有効にする" が有効な状態でECS Exec
では、ECS Exec セッションの KMS キー ID が指定 かつ ロググループ側での暗号化している かつ CloudWatch 暗号化を有効にする が有効な状態でECS Execを行います。
以下のようにAWS CDKのコード内でロググループにKMSキーを指定しました。
// ECS Exec log destinations
const kmsKey = new cdk.aws_kms.Key(this, "Key");
const ecsExecLogGroup = new cdk.aws_logs.LogGroup(this, "EcsExecLogGroup", {
encryptionKey: kmsKey,
});
const ecsExecLogBucketConstruct = new BucketConstruct(
this,
"ecsExecLogBucketConstruct"
);
cdk diffの結果は以下のとおりです。
> cdk diff --no-change-set
[Warning at /EcsNativeBlueGreenStack/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/ServiceRole] Failed to add construct metadata for node [ServiceRole]. Reason: ValidationError: The result of fromAwsManagedPolicyName can not be used in this API [ack: @aws-cdk/core:addConstructMetadataFailed]
[Warning at /EcsNativeBlueGreenStack/EcsConstruct/Service/AlternateTargetRole] Failed to add construct metadata for node [AlternateTargetRole]. Reason: ValidationError: The result of fromAwsManagedPolicyName can not be used in this API [ack: @aws-cdk/core:addConstructMetadataFailed]
Stack EcsNativeBlueGreenStack
Resources
[~] AWS::Logs::LogGroup EcsConstruct/EcsExecLogGroup EcsConstructEcsExecLogGroup567B87CF
└─ [+] KmsKeyId
└─ {"Fn::GetAtt":["EcsConstructKeyDE871070","Arn"]}
✨ Number of stacks with differences: 1
ロググループを確認するとKMSキーが設定されていました。

この状態でECS Execをします。
~ $ aws ecs execute-command --cluster EcsNativeBlueGreenStack-EcsConstructCluster14AE103B-1MjYOc4hurGm --task fccb314295bf438aa3dc08d17330871a --container web --interactive --command '/bin/sh'
The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.
Starting session with SessionId: ecs-execute-command-hgkazf7cu2vkn4oztskb8e225u
This session is encrypted using AWS KMS.
/ # whoami
root
/ # exit
Exiting session with sessionId: ecs-execute-command-hgkazf7cu2vkn4oztskb8e225u.
問題なく接続できました。
ロググループを確認すると、ログストリームが作成され、先ほどターミナルで入力および出力された文字が記録されていました。

S3バケットを確認すると、SSE-S3で暗号化されたオブジェクトが新規で追加されていました。

S3 暗号化を有効にするもSSE-S3やSSE-KMS、DSSE-KMSとS3バケット側での暗号化が行われていない場合にエラーを吐くオプションなのかもしれないですが、現在は新規作成するS3バケットはデフォルト暗号化が行われているので、その効力は感じにくくなっています。
ロググループ側でKMSキーによる暗号化を強制化したい時に使おう
ECSクラスターのECS Execのログ設定で暗号化を有効化するオプションの効力を確認してみました。
ロググループ側でKMSキーによる暗号化を強制化したい時に使うものかなと感じました。S3バケットにおいてはSSE-KMSであることを強制するものではないため、ロググループと同じく利用者側でKMSキーによる暗号化をコントロールしたい要件がある場合はキチンとS3バケット側のデフォルト暗号化設定を確認しましょう。
この記事が誰かの助けになれば幸いです。
以上、クラウド事業本部 コンサルティング部の のんピ(@non____97)でした!






