From c5bb8886b9c38ba876becbf52f585b3416fd4177 Mon Sep 17 00:00:00 2001 From: Brian Peterson Date: Sun, 13 Dec 2020 12:56:56 -0600 Subject: [PATCH] fix(@aws0cdk/aws-elasticsearch): 2 domains 1 stack Fixes issue #12017 where 2 elastic search Domains with logging enabled and deployed in the same stack fail to synth due to log group logical naming conflict. BREAKING CHANGE: ES Domain LogGroup LogicalId will change, which will trigger new log group resources to be created --- .../@aws-cdk/aws-elasticsearch/lib/domain.ts | 6 +- .../aws-elasticsearch/test/domain.test.ts | 87 +++++++++++++- .../test/integ.elasticsearch.expected.json | 112 +++++++++--------- 3 files changed, 143 insertions(+), 62 deletions(-) diff --git a/packages/@aws-cdk/aws-elasticsearch/lib/domain.ts b/packages/@aws-cdk/aws-elasticsearch/lib/domain.ts index 1016d7e065da0..3e5e3ef50c344 100644 --- a/packages/@aws-cdk/aws-elasticsearch/lib/domain.ts +++ b/packages/@aws-cdk/aws-elasticsearch/lib/domain.ts @@ -1378,7 +1378,7 @@ export class Domain extends DomainBase implements IDomain { if (props.logging?.slowSearchLogEnabled) { this.slowSearchLogGroup = props.logging.slowSearchLogGroup ?? - new logs.LogGroup(scope, 'SlowSearchLogs', { + new logs.LogGroup(this, 'SlowSearchLogs', { retention: logs.RetentionDays.ONE_MONTH, }); @@ -1387,7 +1387,7 @@ export class Domain extends DomainBase implements IDomain { if (props.logging?.slowIndexLogEnabled) { this.slowIndexLogGroup = props.logging.slowIndexLogGroup ?? - new logs.LogGroup(scope, 'SlowIndexLogs', { + new logs.LogGroup(this, 'SlowIndexLogs', { retention: logs.RetentionDays.ONE_MONTH, }); @@ -1396,7 +1396,7 @@ export class Domain extends DomainBase implements IDomain { if (props.logging?.appLogEnabled) { this.appLogGroup = props.logging.appLogGroup ?? - new logs.LogGroup(scope, 'AppLogs', { + new logs.LogGroup(this, 'AppLogs', { retention: logs.RetentionDays.ONE_MONTH, }); diff --git a/packages/@aws-cdk/aws-elasticsearch/test/domain.test.ts b/packages/@aws-cdk/aws-elasticsearch/test/domain.test.ts index e4b8abf50e29d..668bd76a04aa2 100644 --- a/packages/@aws-cdk/aws-elasticsearch/test/domain.test.ts +++ b/packages/@aws-cdk/aws-elasticsearch/test/domain.test.ts @@ -81,7 +81,7 @@ describe('log groups', () => { SEARCH_SLOW_LOGS: { CloudWatchLogsLogGroupArn: { 'Fn::GetAtt': [ - 'SlowSearchLogsE00DC2E7', + 'DomainSlowSearchLogs5B35A97A', 'Arn', ], }, @@ -113,7 +113,7 @@ describe('log groups', () => { INDEX_SLOW_LOGS: { CloudWatchLogsLogGroupArn: { 'Fn::GetAtt': [ - 'SlowIndexLogsAD49DED0', + 'DomainSlowIndexLogsFE2F1061', 'Arn', ], }, @@ -136,7 +136,7 @@ describe('log groups', () => { ES_APPLICATION_LOGS: { CloudWatchLogsLogGroupArn: { 'Fn::GetAtt': [ - 'AppLogsC5DF83A6', + 'DomainAppLogs21698C1B', 'Arn', ], }, @@ -152,6 +152,87 @@ describe('log groups', () => { }); }); + test('two domains with logging enabled can be created in same stack', () => { + new Domain(stack, 'Domain1', { + version: ElasticsearchVersion.V7_7, + logging: { + appLogEnabled: true, + slowSearchLogEnabled: true, + slowIndexLogEnabled: true, + }, + }); + new Domain(stack, 'Domain2', { + version: ElasticsearchVersion.V7_7, + logging: { + appLogEnabled: true, + slowSearchLogEnabled: true, + slowIndexLogEnabled: true, + }, + }); + expect(stack).toHaveResourceLike('AWS::Elasticsearch::Domain', { + LogPublishingOptions: { + ES_APPLICATION_LOGS: { + CloudWatchLogsLogGroupArn: { + 'Fn::GetAtt': [ + 'Domain1AppLogs6E8D1D67', + 'Arn', + ], + }, + Enabled: true, + }, + SEARCH_SLOW_LOGS: { + CloudWatchLogsLogGroupArn: { + 'Fn::GetAtt': [ + 'Domain1SlowSearchLogs8F3B0506', + 'Arn', + ], + }, + Enabled: true, + }, + INDEX_SLOW_LOGS: { + CloudWatchLogsLogGroupArn: { + 'Fn::GetAtt': [ + 'Domain1SlowIndexLogs9354D098', + 'Arn', + ], + }, + Enabled: true, + }, + }, + }); + expect(stack).toHaveResourceLike('AWS::Elasticsearch::Domain', { + LogPublishingOptions: { + ES_APPLICATION_LOGS: { + CloudWatchLogsLogGroupArn: { + 'Fn::GetAtt': [ + 'Domain2AppLogs810876E2', + 'Arn', + ], + }, + Enabled: true, + }, + SEARCH_SLOW_LOGS: { + CloudWatchLogsLogGroupArn: { + 'Fn::GetAtt': [ + 'Domain2SlowSearchLogs0C75F64B', + 'Arn', + ], + }, + Enabled: true, + }, + INDEX_SLOW_LOGS: { + CloudWatchLogsLogGroupArn: { + 'Fn::GetAtt': [ + 'Domain2SlowIndexLogs0CB900D0', + 'Arn', + ], + }, + Enabled: true, + }, + }, + }); + }); + }); describe('grants', () => { diff --git a/packages/@aws-cdk/aws-elasticsearch/test/integ.elasticsearch.expected.json b/packages/@aws-cdk/aws-elasticsearch/test/integ.elasticsearch.expected.json index 1956a13379bac..6cdefe4f285d9 100644 --- a/packages/@aws-cdk/aws-elasticsearch/test/integ.elasticsearch.expected.json +++ b/packages/@aws-cdk/aws-elasticsearch/test/integ.elasticsearch.expected.json @@ -1,5 +1,47 @@ { "Resources": { + "DomainSlowSearchLogs5B35A97A": { + "Type": "AWS::Logs::LogGroup", + "Properties": { + "RetentionInDays": 30 + }, + "UpdateReplacePolicy": "Retain", + "DeletionPolicy": "Retain" + }, + "DomainAppLogs21698C1B": { + "Type": "AWS::Logs::LogGroup", + "Properties": { + "RetentionInDays": 30 + }, + "UpdateReplacePolicy": "Retain", + "DeletionPolicy": "Retain" + }, + "DomainESLogGroupPolicyCustomResourcePolicyB35C8E41": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "logs:PutResourcePolicy", + "Effect": "Allow", + "Resource": "*" + }, + { + "Action": "logs:DeleteResourcePolicy", + "Effect": "Allow", + "Resource": "*" + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "DomainESLogGroupPolicyCustomResourcePolicyB35C8E41", + "Roles": [ + { + "Ref": "AWS679f53fac002430cb0da5b7982bd2287ServiceRoleC1EA0FF2" + } + ] + } + }, "DomainESLogGroupPolicy5373A2E8": { "Type": "Custom::CloudwatchLogResourcePolicy", "Properties": { @@ -21,14 +63,14 @@ "{\"Statement\":[{\"Action\":[\"logs:PutLogEvents\",\"logs:CreateLogStream\"],\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"es.amazonaws.com\"},\"Resource\":[\"", { "Fn::GetAtt": [ - "SlowSearchLogsE00DC2E7", + "DomainSlowSearchLogs5B35A97A", "Arn" ] }, "\",\"", { "Fn::GetAtt": [ - "AppLogsC5DF83A6", + "DomainAppLogs21698C1B", "Arn" ] }, @@ -53,14 +95,14 @@ "{\"Statement\":[{\"Action\":[\"logs:PutLogEvents\",\"logs:CreateLogStream\"],\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"es.amazonaws.com\"},\"Resource\":[\"", { "Fn::GetAtt": [ - "SlowSearchLogsE00DC2E7", + "DomainSlowSearchLogs5B35A97A", "Arn" ] }, "\",\"", { "Fn::GetAtt": [ - "AppLogsC5DF83A6", + "DomainAppLogs21698C1B", "Arn" ] }, @@ -83,11 +125,11 @@ }, "InstallLatestAwsSdk": true }, - "UpdateReplacePolicy": "Delete", - "DeletionPolicy": "Delete", "DependsOn": [ "DomainESLogGroupPolicyCustomResourcePolicyB35C8E41" - ] + ], + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" }, "Domain66AC69E0": { "Type": "AWS::Elasticsearch::Domain", @@ -118,7 +160,7 @@ "ES_APPLICATION_LOGS": { "CloudWatchLogsLogGroupArn": { "Fn::GetAtt": [ - "AppLogsC5DF83A6", + "DomainAppLogs21698C1B", "Arn" ] }, @@ -127,7 +169,7 @@ "SEARCH_SLOW_LOGS": { "CloudWatchLogsLogGroupArn": { "Fn::GetAtt": [ - "SlowSearchLogsE00DC2E7", + "DomainSlowSearchLogs5B35A97A", "Arn" ] }, @@ -146,22 +188,6 @@ "DomainESLogGroupPolicy5373A2E8" ] }, - "SlowSearchLogsE00DC2E7": { - "Type": "AWS::Logs::LogGroup", - "Properties": { - "RetentionInDays": 30 - }, - "UpdateReplacePolicy": "Retain", - "DeletionPolicy": "Retain" - }, - "AppLogsC5DF83A6": { - "Type": "AWS::Logs::LogGroup", - "Properties": { - "RetentionInDays": 30 - }, - "UpdateReplacePolicy": "Retain", - "DeletionPolicy": "Retain" - }, "AWS679f53fac002430cb0da5b7982bd2287ServiceRoleC1EA0FF2": { "Type": "AWS::IAM::Role", "Properties": { @@ -193,32 +219,6 @@ ] } }, - "DomainESLogGroupPolicyCustomResourcePolicyB35C8E41": { - "Type": "AWS::IAM::Policy", - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": "logs:PutResourcePolicy", - "Effect": "Allow", - "Resource": "*" - }, - { - "Action": "logs:DeleteResourcePolicy", - "Effect": "Allow", - "Resource": "*" - } - ], - "Version": "2012-10-17" - }, - "PolicyName": "DomainESLogGroupPolicyCustomResourcePolicyB35C8E41", - "Roles": [ - { - "Ref": "AWS679f53fac002430cb0da5b7982bd2287ServiceRoleC1EA0FF2" - } - ] - } - }, "AWS679f53fac002430cb0da5b7982bd22872D164C4C": { "Type": "AWS::Lambda::Function", "Properties": { @@ -276,10 +276,6 @@ } }, "Parameters": { - "AssetParametersb64b129569a5ac7a9abf88a18ac0b504d1fb1208872460476ed3fd435830eb94ArtifactHash782948FC": { - "Type":"String", - "Description":"Artifact hash for asset \"b64b129569a5ac7a9abf88a18ac0b504d1fb1208872460476ed3fd435830eb94\"" - }, "AssetParametersb64b129569a5ac7a9abf88a18ac0b504d1fb1208872460476ed3fd435830eb94S3Bucket38F1BB8E": { "Type": "String", "Description": "S3 bucket for asset \"b64b129569a5ac7a9abf88a18ac0b504d1fb1208872460476ed3fd435830eb94\"" @@ -287,6 +283,10 @@ "AssetParametersb64b129569a5ac7a9abf88a18ac0b504d1fb1208872460476ed3fd435830eb94S3VersionKeyCCDC67C0": { "Type": "String", "Description": "S3 key for asset version \"b64b129569a5ac7a9abf88a18ac0b504d1fb1208872460476ed3fd435830eb94\"" + }, + "AssetParametersb64b129569a5ac7a9abf88a18ac0b504d1fb1208872460476ed3fd435830eb94ArtifactHash782948FC": { + "Type": "String", + "Description": "Artifact hash for asset \"b64b129569a5ac7a9abf88a18ac0b504d1fb1208872460476ed3fd435830eb94\"" } } -} +} \ No newline at end of file