Skip to content

Commit a6572c7

Browse files
committed
Enable logging of searches
1 parent f54e6ca commit a6572c7

File tree

1 file changed

+127
-3
lines changed

1 file changed

+127
-3
lines changed

docs/cloudformation/geocore-semantic-search-with-opensearch.yml

Lines changed: 127 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ Parameters:
5353
OSSecretID:
5454
Type: String
5555
Default: dev/OpenSearch/SemanticSearch
56-
Description: SSM parameter name for OpenSearch user name and password
56+
Description: SSM parameter name for OpenSearch user name and password
5757

5858

5959
Conditions:
@@ -77,6 +77,14 @@ Resources:
7777
AWS: '*'
7878
Action: 'es:*'
7979
Resource: !Sub arn:aws:es:${AWS::Region}:${AWS::AccountId}:domain/*/*
80+
- Effect: Allow
81+
Principal:
82+
Service: es.amazonaws.com
83+
Action: logs:PutLogEvents
84+
Resource:
85+
- !Sub arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/${Environment}/webpresence/search-audit-logs:*
86+
- !Sub arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/${Environment}/webpresence/search-slow-search-logs:*
87+
- !Sub arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/${Environment}/webpresence/search-slow-index-logs:*
8088
EngineVersion: 'OpenSearch_2.11'
8189
DomainName: semantic-search
8290
ClusterConfig:
@@ -100,6 +108,21 @@ Resources:
100108
KmsKeyId: alias/aws/es
101109
DomainEndpointOptions:
102110
EnforceHTTPS: True
111+
LogPublishingOptions:
112+
SEARCH_SLOW_LOGS:
113+
CloudWatchLogsLogGroupArn: !Sub "arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/${Environment}/webpresence/search-audit-logs"
114+
Enabled: True
115+
INDEX_SLOW_LOGS:
116+
CloudWatchLogsLogGroupArn: !Sub "arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/${Environment}/webpresence/search-slow-search-logs"
117+
Enabled: True
118+
AUDIT_LOGS:
119+
CloudWatchLogsLogGroupArn: !Sub "arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/${Environment}/webpresence/search-slow-index-logs"
120+
Enabled: True
121+
DependsOn:
122+
- AuditLogsLogGroup
123+
- SlowSearchLogsLogGroup
124+
- SlowIndexLogsLogGroup
125+
- OSLogGroupResourcePolicy
103126

104127
OpenSearchSecret:
105128
Type: AWS::SecretsManager::Secret
@@ -108,6 +131,62 @@ Resources:
108131
Description: OpenSearch username and password
109132
SecretString: !Sub '{ "username" : "${OpenSearchUsername}", "password" : "${OpenSearchPassword}" }'
110133

134+
########################################################
135+
# Post OpenSearch configurations
136+
########################################################
137+
138+
SlowLogConfigFunction:
139+
Type: 'AWS::Lambda::Function'
140+
Properties:
141+
Handler: index.lambda_handler
142+
Role: !GetAtt InvokeSagemakerLambdaExecutionRole.Arn
143+
FunctionName: "SlowLogConfigFunction"
144+
Runtime: python3.9
145+
Timeout: 60
146+
Environment:
147+
Variables:
148+
OSEndpoint: !Ref OSEndpoint
149+
Code:
150+
ZipFile: |
151+
import json
152+
import boto3
153+
import urllib.request
154+
155+
from os import environ
156+
157+
def lambda_handler(event, context):
158+
endpoint = environ['OSEndpoint']
159+
160+
# The slow log settings to apply
161+
settings = {
162+
"settings": {
163+
"index.search.slowlog.threshold.query.warn": "5ms", # Capture all queries
164+
"index.search.slowlog.level": "TRACE", # Capture detailed query information
165+
"index.search.slowlog.source": "1000" # Capture the query source for up to 1000 characters
166+
}
167+
}
168+
169+
# Convert settings to JSON string
170+
data = json.dumps(settings).encode('utf-8')
171+
172+
# Set headers for the request
173+
req = urllib.request.Request(
174+
f"{endpoint}/_settings", data=data, headers={'Content-Type': 'application/json'}, method='PUT'
175+
)
176+
177+
try:
178+
with urllib.request.urlopen(req) as response:
179+
response_body = response.read()
180+
return {
181+
'Status': 'SUCCESS',
182+
'Message': 'Slow logs settings applied successfully',
183+
'Data': json.loads(response_body)
184+
}
185+
except Exception as e:
186+
return {
187+
'Status': 'FAILED',
188+
'Message': f"Failed to apply slow logs settings: {str(e)}"
189+
}
111190
112191
########################################################
113192
# Set up SageMaker notebook instance
@@ -213,7 +292,6 @@ Resources:
213292
CodeUri:
214293
Bucket: !Ref DeploymentBucket
215294
Key: cloudformation-templates/lambda/semantic-search/Invoke-sagemaker-pretrain-20241216-1700.zip
216-
217295
MemorySize: 3009
218296
Timeout: 900
219297
Handler: app.lambda_handler
@@ -505,12 +583,58 @@ Resources:
505583
gatewayresponse.header.Access-Control-Allow-Methods: "'GET,OPTIONS'"
506584
gatewayresponse.header.Access-Control-Allow-Origin: "'*'"
507585
gatewayresponse.header.Access-Control-Allow-Headers: "'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'"
508-
509586

587+
OSLogGroupResourcePolicy:
588+
Type: AWS::Logs::ResourcePolicy
589+
Properties:
590+
PolicyName: OpenSearchLogPolicy
591+
PolicyDocument:
592+
Fn::Sub: |
593+
{
594+
"Version": "2012-10-17",
595+
"Statement": [
596+
{
597+
"Effect": "Allow",
598+
"Principal": {
599+
"Service": "es.amazonaws.com"
600+
},
601+
"Action": [
602+
"logs:CreateLogStream",
603+
"logs:PutLogEvents"
604+
],
605+
"Resource": [
606+
"arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/${Environment}/webpresence/search-audit-logs:*",
607+
"arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/${Environment}/webpresence/search-slow-search-logs:*",
608+
"arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/${Environment}/webpresence/search-slow-index-logs:*"
609+
]
610+
}
611+
]
612+
}
510613

511614
LogGroup:
512615
Type: Custom::LogGroup
513616
Properties:
514617
ServiceToken: !ImportValue LogGroupHelperLambdaArn
515618
LogGroupName: !Sub '/${Environment}/webpresence/search'
516619
RetentionInDays: 3653
620+
621+
AuditLogsLogGroup:
622+
Type: Custom::LogGroup
623+
Properties:
624+
ServiceToken: !ImportValue LogGroupHelperLambdaArn
625+
LogGroupName: !Sub '/${Environment}/webpresence/search-audit-logs'
626+
RetentionInDays: 3653
627+
628+
SlowSearchLogsLogGroup:
629+
Type: Custom::LogGroup
630+
Properties:
631+
ServiceToken: !ImportValue LogGroupHelperLambdaArn
632+
LogGroupName: !Sub '/${Environment}/webpresence/search-slow-search-logs'
633+
RetentionInDays: 3653
634+
635+
SlowIndexLogsLogGroup:
636+
Type: Custom::LogGroup
637+
Properties:
638+
ServiceToken: !ImportValue LogGroupHelperLambdaArn
639+
LogGroupName: !Sub '/${Environment}/webpresence/search-slow-index-logs'
640+
RetentionInDays: 3653

0 commit comments

Comments
 (0)