@@ -119,14 +119,18 @@ export class IamAssets extends cdk.Construct {
119119 }
120120 } ;
121121
122- const createIamSSMLogArchivePolicy = ( ) : iam . ManagedPolicy => {
123- const policyName = createPolicyName ( 'SSMAccessPolicy' ) ;
124- const iamSSMLogArchiveAccessPolicy = new iam . ManagedPolicy ( this , `IAM-SSM-LogArchive-Policy-${ accountKey } ` , {
125- managedPolicyName : policyName ,
126- description : policyName ,
127- } ) ;
122+ const createIamSSMLogArchiveWritePolicy = ( ) : iam . ManagedPolicy => {
123+ const policyName = createPolicyName ( 'SSMWriteAccessPolicy' ) ;
124+ const iamSSMLogArchiveWriteAccessPolicy = new iam . ManagedPolicy (
125+ this ,
126+ `IAM-SSM-LogArchive-Write-Policy-${ accountKey } ` ,
127+ {
128+ managedPolicyName : policyName ,
129+ description : policyName ,
130+ } ,
131+ ) ;
128132
129- iamSSMLogArchiveAccessPolicy . addStatements (
133+ iamSSMLogArchiveWriteAccessPolicy . addStatements (
130134 new iam . PolicyStatement ( {
131135 effect : iam . Effect . ALLOW ,
132136 actions : [ 'kms:DescribeKey' , 'kms:GenerateDataKey*' , 'kms:Decrypt' , 'kms:Encrypt' , 'kms:ReEncrypt*' ] ,
@@ -152,11 +156,43 @@ export class IamAssets extends cdk.Construct {
152156 } ) ,
153157 ) ;
154158 new CfnIamPolicyOutput ( this , `IamSsmPolicyOutput` , {
155- policyName : iamSSMLogArchiveAccessPolicy . managedPolicyName ,
156- policyArn : iamSSMLogArchiveAccessPolicy . managedPolicyArn ,
157- policyKey : 'IamSsmAccessPolicy ' ,
159+ policyName : iamSSMLogArchiveWriteAccessPolicy . managedPolicyName ,
160+ policyArn : iamSSMLogArchiveWriteAccessPolicy . managedPolicyArn ,
161+ policyKey : 'IamSsmWriteAccessPolicy ' ,
158162 } ) ;
159- return iamSSMLogArchiveAccessPolicy ;
163+ return iamSSMLogArchiveWriteAccessPolicy ;
164+ } ;
165+
166+ const createIamSSMLogArchiveReadOnlyPolicy = ( ) : iam . ManagedPolicy => {
167+ const policyName = createPolicyName ( 'SSMReadOnlyAccessPolicy' ) ;
168+ const iamSSMLogArchiveReadOnlyAccessPolicy = new iam . ManagedPolicy (
169+ this ,
170+ `IAM-SSM-LogArchive-ReadOnly-Policy-${ accountKey } ` ,
171+ {
172+ managedPolicyName : policyName ,
173+ description : policyName ,
174+ } ,
175+ ) ;
176+
177+ iamSSMLogArchiveReadOnlyAccessPolicy . addStatements (
178+ new iam . PolicyStatement ( {
179+ effect : iam . Effect . ALLOW ,
180+ actions : [ 'kms:Decrypt' , 'kms:DescribeKey' , 'kms:GenerateDataKey' ] ,
181+ resources : [ logBucket . encryptionKey ?. keyArn || '*' ] ,
182+ } ) ,
183+
184+ new iam . PolicyStatement ( {
185+ effect : iam . Effect . ALLOW ,
186+ actions : [ 's3:GetObject' ] ,
187+ resources : [ logBucket . arnForObjects ( '*' ) ] ,
188+ } ) ,
189+ ) ;
190+ new CfnIamPolicyOutput ( this , `IamSsmReadOnlyPolicyOutput` , {
191+ policyName : iamSSMLogArchiveReadOnlyAccessPolicy . managedPolicyName ,
192+ policyArn : iamSSMLogArchiveReadOnlyAccessPolicy . managedPolicyArn ,
193+ policyKey : 'IamSsmReadOnlyAccessPolicy' ,
194+ } ) ;
195+ return iamSSMLogArchiveReadOnlyAccessPolicy ;
160196 } ;
161197
162198 if ( ! IamConfigType . is ( iamConfig ) ) {
@@ -191,8 +227,15 @@ export class IamAssets extends cdk.Construct {
191227 return ;
192228 }
193229
194- const ssmLogArchivePolicy =
195- iamRoles . filter ( i => i [ 'ssm-log-archive-access' ] ) . length > 0 ? createIamSSMLogArchivePolicy ( ) : undefined ;
230+ const ssmLogArchiveWritePolicy =
231+ iamRoles . filter ( i => i [ 'ssm-log-archive-write-access' ] || i [ 'ssm-log-archive-access' ] ) . length > 0
232+ ? createIamSSMLogArchiveWritePolicy ( )
233+ : undefined ;
234+
235+ const ssmLogArchiveReadOnlyPolicy =
236+ iamRoles . filter ( i => i [ 'ssm-log-archive-read-only-access' ] ) . length > 0
237+ ? createIamSSMLogArchiveReadOnlyPolicy ( )
238+ : undefined ;
196239
197240 for ( const iamRole of iamRoles ) {
198241 if ( ! IamRoleConfigType . is ( iamRole ) ) {
@@ -224,8 +267,15 @@ export class IamAssets extends cdk.Construct {
224267 roleKey : 'IamAccountRole' ,
225268 } ) ;
226269
227- if ( iamRole [ 'ssm-log-archive-access' ] && ssmLogArchivePolicy ) {
228- role . addManagedPolicy ( ssmLogArchivePolicy ) ;
270+ if (
271+ ( iamRole [ 'ssm-log-archive-write-access' ] || iamRole [ 'ssm-log-archive-access' ] ) &&
272+ ssmLogArchiveWritePolicy
273+ ) {
274+ role . addManagedPolicy ( ssmLogArchiveWritePolicy ) ;
275+ }
276+
277+ if ( iamRole [ 'ssm-log-archive-read-only-access' ] && ssmLogArchiveReadOnlyPolicy ) {
278+ role . addManagedPolicy ( ssmLogArchiveReadOnlyPolicy ) ;
229279 }
230280 }
231281 }
0 commit comments