@@ -273,7 +273,7 @@ data "aws_iam_policy_document" "s3_audit_bucket_policy" {
273273 }
274274}
275275
276- # Attach s3 write policy to external write role
276+ # Attach s3 write policy to lambda write role - rename below to lambda_s3_audit_write_policy
277277resource "aws_iam_role_policy" "external_s3_write_policy" {
278278 name = " S3WriteAccess"
279279 role = aws_iam_role. eligibility_lambda_role . id
@@ -351,6 +351,7 @@ resource "aws_kms_key_policy" "s3_rules_kms_key" {
351351 policy = data. aws_iam_policy_document . s3_rules_kms_key_policy . json
352352}
353353
354+ # KMS key policy for consumer mapping file
354355data "aws_iam_policy_document" "s3_consumer_mapping_kms_key_policy" {
355356 # checkov:skip=CKV_AWS_111: Root user needs full KMS key management
356357 # checkov:skip=CKV_AWS_356: Root user needs full KMS key management
@@ -755,3 +756,60 @@ resource "aws_iam_role_policy_attachment" "attach_rotation_sfn" {
755756 role = aws_iam_role. rotation_sfn_role . name
756757 policy_arn = aws_iam_policy. rotation_sfn_policy . arn
757758}
759+
760+ # DQ policies
761+ # Policy doc for S3 DQ bucket
762+ data "aws_iam_policy_document" "s3_dq_bucket_policy" {
763+ statement {
764+ sid = " AllowSSLRequestsOnly"
765+ actions = [
766+ " s3:ListBucket" ,
767+ " s3:GetBucketLocation" ,
768+ " s3:GetObject" ,
769+ " s3:PutObject" ,
770+ " s3:DeleteObject" , // Critical for Spark staging/committing
771+ " s3:AbortMultipartUpload" // Important for large dataframes if job fails
772+ ]
773+ resources = [
774+ module . s3_dq_metrics_bucket . storage_bucket_arn ,
775+ " ${ module . s3_dq_metrics_bucket . storage_bucket_arn } /*" ,
776+ ]
777+ condition {
778+ test = " Bool"
779+ values = [" true" ]
780+ variable = " aws:SecureTransport"
781+ }
782+ }
783+ }
784+
785+ # Attach DQ s3 write policy to external write role
786+ resource "aws_iam_role_policy" "external_dq_s3_write_policy" {
787+ count = length (aws_iam_role. write_access_role )
788+ name = " S3DQWriteAccess"
789+ role = aws_iam_role. write_access_role [count . index ]. id
790+ policy = data. aws_iam_policy_document . s3_dq_bucket_policy . json
791+ }
792+
793+ # KMS access policy for S3 DQ bucket to external write role
794+ data "aws_iam_policy_document" "s3_dq_kms_access_policy" {
795+ statement {
796+ actions = [
797+ " kms:Encrypt" ,
798+ " kms:Decrypt" ,
799+ " kms:ReEncrypt*" ,
800+ " kms:GenerateDataKey*" ,
801+ " kms:DescribeKey"
802+ ]
803+ resources = [
804+ module . s3_dq_metrics_bucket . storage_bucket_kms_key_arn
805+ ]
806+ }
807+ }
808+
809+ # Attach KMS policy to external write role
810+ resource "aws_iam_role_policy" "external_s3_kms_access_policy" {
811+ count = length (aws_iam_role. write_access_role )
812+ name = " KMSAccessForS3DQ"
813+ role = aws_iam_role. write_access_role [count . index ]. id
814+ policy = data. aws_iam_policy_document . s3_dq_kms_access_policy . json
815+ }
0 commit comments