Skip to content

Commit dea7687

Browse files
author
ievgeniia ieromenko
committed
adding sqs queue record to state table
1 parent 5178f76 commit dea7687

File tree

4 files changed

+187
-83
lines changed

4 files changed

+187
-83
lines changed

aws_sra_examples/solutions/genai/bedrock_guardrails/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# SRA Bedrock Organizations Solution
1+
# SRA Bedrock Guardrails Solution
22

33
## Table of Contents
44
- [Introduction](#introduction)

aws_sra_examples/solutions/genai/bedrock_guardrails/lambda/src/app.py

Lines changed: 105 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
"""This script performs operations to enable, configure, and disable Bedrock security controls.
1+
"""This script performs operations to create, configure, and delete Bedrock guardrails.
22
33
Version: 1.0
44
@@ -28,6 +28,7 @@
2828
import sra_repo
2929
import sra_s3
3030
import sra_sns
31+
import sra_sqs
3132
import sra_ssm_params
3233
import sra_sts
3334

@@ -53,7 +54,6 @@ def load_kms_key_policies() -> dict:
5354
SOLUTION_NAME: str = "sra-bedrock-guardrails"
5455
GOVERNED_REGIONS = []
5556
ORGANIZATION_ID = ""
56-
# SRA_ALARM_EMAIL: str = ""
5757
SRA_ALARM_TOPIC_ARN: str = ""
5858
STATE_TABLE: str = "sra_state" # for saving resource info
5959
CFN_CUSTOM_RESOURCE: str = "Custom::LambdaCustomResource"
@@ -173,6 +173,7 @@ def load_kms_key_policies() -> dict:
173173
cloudwatch = sra_cloudwatch.SRACloudWatch()
174174
kms = sra_kms.SRAKMS()
175175
bedrock = sra_bedrock.SRABedrock()
176+
sqs = sra_sqs.SRASQS()
176177

177178
# propagate solution name to class objects
178179
cloudwatch.SOLUTION_NAME = SOLUTION_NAME
@@ -191,7 +192,6 @@ def get_resource_parameters(event: dict) -> None:
191192
global DRY_RUN
192193
global GOVERNED_REGIONS
193194
global CFN_RESPONSE_DATA
194-
# global SRA_ALARM_EMAIL
195195
global ORGANIZATION_ID
196196

197197
param_validation: dict = validate_parameters(event["ResourceProperties"], PARAMETER_VALIDATION_RULES)
@@ -238,9 +238,6 @@ def get_resource_parameters(event: dict) -> None:
238238
LOGGER.info("Error retrieving SRA staging bucket ssm parameter. Is the SRA common prerequisites solution deployed?")
239239
raise ValueError("Error retrieving SRA staging bucket ssm parameter. Is the SRA common prerequisites solution deployed?") from None
240240

241-
# if event["ResourceProperties"]["SRA_ALARM_EMAIL"] != "":
242-
# SRA_ALARM_EMAIL = event["ResourceProperties"]["SRA_ALARM_EMAIL"]
243-
244241
if event["ResourceProperties"]["DRY_RUN"] == "true":
245242
# dry run
246243
LOGGER.info("Dry run enabled...")
@@ -586,6 +583,33 @@ def create_kms_key(acct: str, region: str) -> None:
586583
)
587584

588585

586+
def check_sqs_queue() -> str:
587+
"""Add sqs queue record if DLQ exists.
588+
589+
Returns:
590+
str: sns topic arn
591+
"""
592+
global DRY_RUN_DATA
593+
global LIVE_RUN_DATA
594+
global CFN_RESPONSE_DATA
595+
596+
sns.SNS_CLIENT = sts.assume_role(sts.MANAGEMENT_ACCOUNT, sts.CONFIGURATION_ROLE, "sns", sts.HOME_REGION)
597+
queue_search = sqs.find_sqs_queue(f"{SOLUTION_NAME}-DLQ")
598+
if queue_search is None:
599+
LOGGER.info(f"{SOLUTION_NAME}-DLQ doesn't exist")
600+
601+
else:
602+
LOGGER.info(f"{SOLUTION_NAME}-DLQ sqs queue exists.")
603+
queue_arn = queue_search
604+
if DRY_RUN is False:
605+
# SQS State table record:
606+
add_state_table_record("sqs", "implemented", "sqs queue", "queue", queue_arn, ACCOUNT, sts.HOME_REGION, f"{SOLUTION_NAME}-DLQ")
607+
else:
608+
DRY_RUN_DATA["SQSCreate"] = f"DRY_RUN: {SOLUTION_NAME}-DLQ sqs queue exists"
609+
610+
return queue_arn
611+
612+
589613
def create_guardrail(acct: str, region: str, params: dict) -> None:
590614
"""Deploy the Bedrock guardrail.
591615
@@ -631,7 +655,6 @@ def set_guardrail_config(params: dict, guardrail_key_id: str) -> Dict:
631655
"description": "sra bedrock guardrail",
632656
"blockedInputMessaging": params["BLOCKED_INPUT_MESSAGING"],
633657
"blockedOutputsMessaging": params["BLOCKED_OUTPUTS_MESSAGING"],
634-
# "clientRequestToken": 'sra-client-request-token-12',
635658
"kmsKeyId": guardrail_key_id,
636659
"tags": [
637660
{"key": "sra-solution", "value": params["SOLUTION_NAME"]},
@@ -668,6 +691,75 @@ def set_guardrail_config(params: dict, guardrail_key_id: str) -> Dict:
668691
return guardrail_params
669692

670693

694+
def delete_bedrock_guardrails_key(acct: str, region: str) -> None:
695+
"""Delete KMS key.
696+
697+
Args:
698+
acct (str): AWS account ID
699+
region (str): AWS region name
700+
"""
701+
# Delete KMS key (schedule deletion) and delete kms alias
702+
kms.KMS_CLIENT = sts.assume_role(acct, sts.CONFIGURATION_ROLE, "kms", region)
703+
search_bedrock_guardrails_kms_key, bedrock_guardrails_key_alias, bedrock_guardrails_key_id, bedrock_guardrails_key_arn = kms.check_alias_exists(
704+
kms.KMS_CLIENT, f"alias/{GUARDRAILS_KEY_ALIAS}"
705+
)
706+
if search_bedrock_guardrails_kms_key is True:
707+
if DRY_RUN is False:
708+
LOGGER.info(f"Deleting {GUARDRAILS_KEY_ALIAS} KMS key")
709+
kms.delete_alias(kms.KMS_CLIENT, f"alias/{GUARDRAILS_KEY_ALIAS}")
710+
LIVE_RUN_DATA[f"KMSDeleteAlias-{acct}-{region}"] = f"Deleted {GUARDRAILS_KEY_ALIAS} KMS key alias"
711+
CFN_RESPONSE_DATA["deployment_info"]["action_count"] += 1
712+
CFN_RESPONSE_DATA["deployment_info"]["resources_deployed"] -= 1
713+
LOGGER.info(f"Deleting {GUARDRAILS_KEY_ALIAS} KMS key ({bedrock_guardrails_key_id})")
714+
remove_state_table_record(bedrock_guardrails_key_arn)
715+
716+
kms.schedule_key_deletion(kms.KMS_CLIENT, bedrock_guardrails_key_id)
717+
LIVE_RUN_DATA[f"KMSDelete-{acct}-{region}"] = f"Deleted {GUARDRAILS_KEY_ALIAS} KMS key ({bedrock_guardrails_key_id})"
718+
CFN_RESPONSE_DATA["deployment_info"]["action_count"] += 1
719+
CFN_RESPONSE_DATA["deployment_info"]["resources_deployed"] -= 1
720+
LOGGER.info(f"Scheduled deletion of {GUARDRAILS_KEY_ALIAS} KMS key ({bedrock_guardrails_key_id})")
721+
kms_key_arn = f"arn:{sts.PARTITION}:kms:{region}:{acct}:key/{bedrock_guardrails_key_id}"
722+
remove_state_table_record(kms_key_arn)
723+
724+
else:
725+
LOGGER.info(f"DRY_RUN: Deleting {GUARDRAILS_KEY_ALIAS} KMS key")
726+
DRY_RUN_DATA[f"KMSAliasDelete-{acct}-{region}"] = f"DRY_RUN: Delete {GUARDRAILS_KEY_ALIAS} KMS key"
727+
LOGGER.info(f"DRY_RUN: Deleting {GUARDRAILS_KEY_ALIAS} KMS key ({bedrock_guardrails_key_id})")
728+
DRY_RUN_DATA[f"KMSDelete-{acct}-{region}"] = f"DRY_RUN: Delete {GUARDRAILS_KEY_ALIAS} KMS key ({bedrock_guardrails_key_id})"
729+
else:
730+
LOGGER.info(f"{GUARDRAILS_KEY_ALIAS} KMS key does not exist.")
731+
732+
733+
def delete_guardrails(account: str, region: str, guardrail_name: str) -> None:
734+
"""Delete the Bedrock guardrails.
735+
736+
Args:
737+
account: AWS account id
738+
region: AWS region
739+
guardrail_name: Name of the Bedrock guardrail to delete.
740+
"""
741+
global DRY_RUN_DATA
742+
global LIVE_RUN_DATA
743+
global CFN_RESPONSE_DATA
744+
745+
if DRY_RUN is False:
746+
bedrock.BEDROCK_CLIENT = sts.assume_role(account, sts.CONFIGURATION_ROLE, "bedrock", region)
747+
LOGGER.info(f"Deleting Bedrock guardrail in {account} in {region}...")
748+
guardrail_id = bedrock.get_guardrail_id(guardrail_name)
749+
if guardrail_id != "":
750+
bedrock.delete_guardrail(guardrail_id)
751+
LIVE_RUN_DATA[f"Bedrock-guardrail-{account}_{region}"] = f"Deleted Bedrock Guardrail ({guardrail_name}) in {account} in {region}"
752+
CFN_RESPONSE_DATA["deployment_info"]["action_count"] += 1
753+
CFN_RESPONSE_DATA["deployment_info"]["resources_deployed"] -= 1
754+
guardrail_arn = f"arn:aws:bedrock:{region}:{account}:guardrail/{guardrail_id}"
755+
remove_state_table_record(guardrail_arn)
756+
else:
757+
LOGGER.info(f"Guardrail {guardrail_name} does not exist in {account} in {region}")
758+
else:
759+
LOGGER.info(f"DRY_RUN: Delete Bedrock guardrail {guardrail_name} in {account} in {region}")
760+
DRY_RUN_DATA[f"Bedrock-guardrail-{account}_{region}"] = f"DRY_RUN: Delete Bedrock guardrail {guardrail_name}"
761+
762+
671763
def create_event(event: dict, context: Any) -> str:
672764
"""Create event.
673765
@@ -731,7 +823,7 @@ def create_event(event: dict, context: Any) -> str:
731823
LOGGER.info(f"Guardrail {event['ResourceProperties']['BEDROCK_GUARDRAIL_NAME']} does not exist in {acct} in {region}")
732824
create_kms_key(acct, region)
733825
create_guardrail(acct, region, event["ResourceProperties"])
734-
826+
check_sqs_queue()
735827
# End
736828
if DRY_RUN is False:
737829
LOGGER.info(json.dumps({"RUN STATS": CFN_RESPONSE_DATA, "RUN DATA": LIVE_RUN_DATA}))
@@ -771,75 +863,6 @@ def update_event(event: dict, context: Any) -> str:
771863
return CFN_RESOURCE_ID
772864

773865

774-
def delete_bedrock_guardrails_key(acct: str, region: str) -> None:
775-
"""Delete KMS key.
776-
777-
Args:
778-
acct (str): AWS account ID
779-
region (str): AWS region name
780-
"""
781-
# Delete KMS key (schedule deletion) and delete kms alias
782-
kms.KMS_CLIENT = sts.assume_role(acct, sts.CONFIGURATION_ROLE, "kms", region)
783-
search_bedrock_guardrails_kms_key, bedrock_guardrails_key_alias, bedrock_guardrails_key_id, bedrock_guardrails_key_arn = kms.check_alias_exists(
784-
kms.KMS_CLIENT, f"alias/{GUARDRAILS_KEY_ALIAS}"
785-
)
786-
if search_bedrock_guardrails_kms_key is True:
787-
if DRY_RUN is False:
788-
LOGGER.info(f"Deleting {GUARDRAILS_KEY_ALIAS} KMS key")
789-
kms.delete_alias(kms.KMS_CLIENT, f"alias/{GUARDRAILS_KEY_ALIAS}")
790-
LIVE_RUN_DATA[f"KMSDeleteAlias-{acct}-{region}"] = f"Deleted {GUARDRAILS_KEY_ALIAS} KMS key alias"
791-
CFN_RESPONSE_DATA["deployment_info"]["action_count"] += 1
792-
CFN_RESPONSE_DATA["deployment_info"]["resources_deployed"] -= 1
793-
LOGGER.info(f"Deleting {GUARDRAILS_KEY_ALIAS} KMS key ({bedrock_guardrails_key_id})")
794-
remove_state_table_record(bedrock_guardrails_key_arn)
795-
796-
kms.schedule_key_deletion(kms.KMS_CLIENT, bedrock_guardrails_key_id)
797-
LIVE_RUN_DATA[f"KMSDelete-{acct}-{region}"] = f"Deleted {GUARDRAILS_KEY_ALIAS} KMS key ({bedrock_guardrails_key_id})"
798-
CFN_RESPONSE_DATA["deployment_info"]["action_count"] += 1
799-
CFN_RESPONSE_DATA["deployment_info"]["resources_deployed"] -= 1
800-
LOGGER.info(f"Scheduled deletion of {GUARDRAILS_KEY_ALIAS} KMS key ({bedrock_guardrails_key_id})")
801-
kms_key_arn = f"arn:{sts.PARTITION}:kms:{region}:{acct}:key/{bedrock_guardrails_key_id}"
802-
remove_state_table_record(kms_key_arn)
803-
804-
else:
805-
LOGGER.info(f"DRY_RUN: Deleting {GUARDRAILS_KEY_ALIAS} KMS key")
806-
DRY_RUN_DATA[f"KMSAliasDelete-{acct}-{region}"] = f"DRY_RUN: Delete {GUARDRAILS_KEY_ALIAS} KMS key"
807-
LOGGER.info(f"DRY_RUN: Deleting {GUARDRAILS_KEY_ALIAS} KMS key ({bedrock_guardrails_key_id})")
808-
DRY_RUN_DATA[f"KMSDelete-{acct}-{region}"] = f"DRY_RUN: Delete {GUARDRAILS_KEY_ALIAS} KMS key ({bedrock_guardrails_key_id})"
809-
else:
810-
LOGGER.info(f"{GUARDRAILS_KEY_ALIAS} KMS key does not exist.")
811-
812-
813-
def delete_guardrails(account: str, region: str, guardrail_name: str) -> None:
814-
"""Delete the Bedrock guardrails.
815-
816-
Args:
817-
account: AWS account id
818-
region: AWS region
819-
guardrail_name: Name of the Bedrock guardrail to delete.
820-
"""
821-
global DRY_RUN_DATA
822-
global LIVE_RUN_DATA
823-
global CFN_RESPONSE_DATA
824-
825-
if DRY_RUN is False:
826-
bedrock.BEDROCK_CLIENT = sts.assume_role(account, sts.CONFIGURATION_ROLE, "bedrock", region)
827-
LOGGER.info(f"Deleting Bedrock guardrail in {account} in {region}...")
828-
guardrail_id = bedrock.get_guardrail_id(guardrail_name)
829-
if guardrail_id != "":
830-
bedrock.delete_guardrail(guardrail_id)
831-
LIVE_RUN_DATA[f"Bedrock-guardrail-{account}_{region}"] = f"Deleted Bedrock Guardrail ({guardrail_name}) in {account} in {region}"
832-
CFN_RESPONSE_DATA["deployment_info"]["action_count"] += 1
833-
CFN_RESPONSE_DATA["deployment_info"]["resources_deployed"] -= 1
834-
guardrail_arn = f"arn:aws:bedrock:{region}:{account}:guardrail/{guardrail_id}"
835-
remove_state_table_record(guardrail_arn)
836-
else:
837-
LOGGER.info(f"Guardrail {guardrail_name} does not exist in {account} in {region}")
838-
else:
839-
LOGGER.info(f"DRY_RUN: Delete Bedrock guardrail {guardrail_name} in {account} in {region}")
840-
DRY_RUN_DATA[f"Bedrock-guardrail-{account}_{region}"] = f"DRY_RUN: Delete Bedrock guardrail {guardrail_name}"
841-
842-
843866
def delete_event(event: dict, context: Any) -> None: # noqa: CFQ001, CCR001, C901
844867
"""Delete event function.
845868
@@ -854,15 +877,18 @@ def delete_event(event: dict, context: Any) -> None: # noqa: CFQ001, CCR001, C9
854877
LIVE_RUN_DATA = {}
855878
LOGGER.info("Delete event function")
856879

857-
# 4) Delete Bedrock guardrails
880+
# Delete Bedrock guardrails
858881
accounts, regions = get_accounts_and_regions(
859882
event["ResourceProperties"]["SRA_BEDROCK_ACCOUNTS"], event["ResourceProperties"]["SRA_BEDROCK_REGIONS"]
860883
)
861884
for acct in accounts:
862885
for region in regions:
863886
delete_guardrails(acct, region, event["ResourceProperties"]["BEDROCK_GUARDRAIL_NAME"])
864887
delete_bedrock_guardrails_key(acct, region)
865-
888+
# Remove sqs queue record
889+
queue_arn = check_sqs_queue()
890+
if queue_arn is not None:
891+
remove_state_table_record(queue_arn)
866892
# Must infer the execution role arn because the function is being reported as non-existent at this point
867893
execution_role_arn = f"arn:aws:iam::{sts.MANAGEMENT_ACCOUNT}:role/{SOLUTION_NAME}-lambda"
868894
LOGGER.info(f"Removing state table record for lambda IAM execution role: {execution_role_arn}")
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
"""Lambda module to setup SRA SQS resources in the organization.
2+
3+
Version: 0.1
4+
5+
SQS module for SRA in the repo, https://github.com/aws-samples/aws-security-reference-architecture-examples
6+
7+
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
8+
SPDX-License-Identifier: MIT-0
9+
"""
10+
from __future__ import annotations
11+
12+
import json
13+
import logging
14+
import os
15+
from time import sleep
16+
from typing import TYPE_CHECKING
17+
18+
import boto3
19+
import sra_sts
20+
from botocore.config import Config
21+
from botocore.exceptions import ClientError
22+
23+
if TYPE_CHECKING:
24+
from mypy_boto3_sqs.client import SQSClient
25+
26+
27+
class SRASQS:
28+
"""Class to setup SRA SQS resources in the organization."""
29+
30+
# Setup Default Logger
31+
LOGGER = logging.getLogger(__name__)
32+
log_level: str = os.environ.get("LOG_LEVEL", "INFO")
33+
LOGGER.setLevel(log_level)
34+
35+
BOTO3_CONFIG = Config(retries={"max_attempts": 10, "mode": "standard"})
36+
UNEXPECTED = "Unexpected!"
37+
38+
try:
39+
MANAGEMENT_ACCOUNT_SESSION = boto3.Session()
40+
SQS_CLIENT: SQSClient = MANAGEMENT_ACCOUNT_SESSION.client("sqs", config=BOTO3_CONFIG)
41+
except Exception:
42+
LOGGER.exception(UNEXPECTED)
43+
raise ValueError("Unexpected error executing Lambda function. Review CloudWatch logs for details.") from None
44+
45+
sts = sra_sts.SRASTS()
46+
47+
def find_sqs_queue(self, queue_name: str, region: str = "default", account: str = "default") -> str | None:
48+
"""Find SQS Queue ARN.
49+
50+
Args:
51+
queue_name (str): SQS Queue Name
52+
region (str): AWS Region
53+
account (str): AWS Account
54+
55+
Raises:
56+
ValueError: Error finding SQS Queue
57+
58+
Returns:
59+
str: SQS Queue ARN
60+
"""
61+
if region == "default":
62+
region = self.sts.HOME_REGION
63+
if account == "default":
64+
account = self.sts.MANAGEMENT_ACCOUNT
65+
try:
66+
response = self.SQS_CLIENT.get_queue_attributes(
67+
QueueUrl=f"https://sqs.{region}.amazonaws.com/{account}/{queue_name}", AttributeNames=["QueueArn"]
68+
)
69+
return response["Attributes"]["QueueArn"]
70+
except ClientError as e:
71+
if e.response["Error"]["Code"] == "NotFoundException":
72+
self.LOGGER.info(f"SQS Queue '{queue_name}' not found exception.")
73+
return None
74+
if e.response["Error"]["Code"] == "NotFound":
75+
self.LOGGER.info(f"SQS Queue '{queue_name}' not found.")
76+
return None
77+
raise ValueError(f"Error finding SQS topic: {e}") from None

aws_sra_examples/solutions/genai/bedrock_guardrails/templates/sra-bedrock-guardrails-main.yaml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
AWSTemplateFormatVersion: '2010-09-09'
2-
Description: CloudFormation template to create a Lambda function and its execution role
2+
Description: CloudFormation template to create a Lambda function and its execution role to deploy Bedrock guardrails - 'bedrock_guardrails' solution in the repo,
3+
https://github.com/aws-samples/aws-security-reference-architecture-examples(sra-1u3sd7f8i)
34

45
Metadata:
56
AWS::CloudFormation::Interface:
@@ -224,7 +225,6 @@ Parameters:
224225
'^\[(?:\s*\{\s*\"type\"\s*:\s*\"(ADDRESS|AGE|AWS_ACCESS_KEY|AWS_SECRET_KEY|CA_HEALTH_NUMBER|CA_SOCIAL_INSURANCE_NUMBER|CREDIT_DEBIT_CARD_CVV|CREDIT_DEBIT_CARD_EXPIRY|CREDIT_DEBIT_CARD_NUMBER|DRIVER_ID|EMAIL|INTERNATIONAL_BANK_ACCOUNT_NUMBER|IP_ADDRESS|LICENSE_PLATE|MAC_ADDRESS|NAME|PASSWORD|PHONE|PIN|SWIFT_CODE|UK_NATIONAL_HEALTH_SERVICE_NUMBER|UK_NATIONAL_INSURANCE_NUMBER|UK_UNIQUE_TAXPAYER_REFERENCE_NUMBER|URL|USERNAME|US_BANK_ACCOUNT_NUMBER|US_BANK_ROUTING_NUMBER|US_INDIVIDUAL_TAX_IDENTIFICATION_NUMBER|US_PASSPORT_NUMBER|US_SOCIAL_SECURITY_NUMBER|VEHICLE_IDENTIFICATION_NUMBER)\"\s*,\s*\"action\"\s*:\s*\"(BLOCK|ANONYMIZE)\"\s*\})(?!.*\"type\"\s*:\s*\"\1\")(?:\s*,\s*\{\s*\"type\"\s*:\s*\"(ADDRESS|AGE|AWS_ACCESS_KEY|AWS_SECRET_KEY|CA_HEALTH_NUMBER|CA_SOCIAL_INSURANCE_NUMBER|CREDIT_DEBIT_CARD_CVV|CREDIT_DEBIT_CARD_EXPIRY|CREDIT_DEBIT_CARD_NUMBER|DRIVER_ID|EMAIL|INTERNATIONAL_BANK_ACCOUNT_NUMBER|IP_ADDRESS|LICENSE_PLATE|MAC_ADDRESS|NAME|PASSWORD|PHONE|PIN|SWIFT_CODE|UK_NATIONAL_HEALTH_SERVICE_NUMBER|UK_NATIONAL_INSURANCE_NUMBER|UK_UNIQUE_TAXPAYER_REFERENCE_NUMBER|URL|USERNAME|US_BANK_ACCOUNT_NUMBER|US_BANK_ROUTING_NUMBER|US_INDIVIDUAL_TAX_IDENTIFICATION_NUMBER|US_PASSPORT_NUMBER|US_SOCIAL_SECURITY_NUMBER|VEHICLE_IDENTIFICATION_NUMBER)\"\s*,\s*\"action\"\s*:\s*\"(BLOCK|ANONYMIZE)\"\s*\}(?!.*\"type\"\s*:\s*\"\3\"))*\s*\]$'
225226
ConstraintDescription: Must be a valid JSON array of objects. Each object must have a 'type' (valid PII entity type) and an 'action' (BLOCK or ANONYMIZE). At least one configuration is required.
226227

227-
# consider adding GuardrailRegexConfig
228228
pDeployContextualGroundingPolicy:
229229
Type: String
230230
Default: 'true'
@@ -296,7 +296,8 @@ Resources:
296296
Statement:
297297
- Effect: Allow
298298
Action:
299-
- sqs:SendMessage
299+
- 'sqs:SendMessage'
300+
- 'sqs:GetQueueAttributes'
300301
Resource: !GetAtt rBedrockGuardrailsDLQ.Arn
301302
- PolicyDocument:
302303
Version: '2012-10-17'

0 commit comments

Comments
 (0)