@@ -245,6 +245,103 @@ describe('key policies', () => {
245245 } ) ;
246246 } ) ;
247247
248+ testFutureBehavior ( 'grant for a principal in a different region' , flags , cdk . App , ( app ) => {
249+ const principalStack = new cdk . Stack ( app , 'PrincipalStack' , { env : { region : 'testregion1' } } ) ;
250+ const principal = new iam . Role ( principalStack , 'Role' , {
251+ assumedBy : new iam . AnyPrincipal ( ) ,
252+ roleName : 'MyRolePhysicalName' ,
253+ } ) ;
254+
255+ const keyStack = new cdk . Stack ( app , 'KeyStack' , { env : { region : 'testregion2' } } ) ;
256+ const key = new kms . Key ( keyStack , 'Key' ) ;
257+
258+ key . grantEncrypt ( principal ) ;
259+
260+ expect ( keyStack ) . toHaveResourceLike ( 'AWS::KMS::Key' , {
261+ KeyPolicy : {
262+ Statement : arrayWith (
263+ {
264+ Action : [
265+ 'kms:Encrypt' ,
266+ 'kms:ReEncrypt*' ,
267+ 'kms:GenerateDataKey*' ,
268+ ] ,
269+ Effect : 'Allow' ,
270+ Principal : { AWS : { 'Fn::Join' : [ '' , [ 'arn:' , { Ref : 'AWS::Partition' } , ':iam::' , { Ref : 'AWS::AccountId' } , ':role/MyRolePhysicalName' ] ] } } ,
271+ Resource : '*' ,
272+ } ,
273+ ) ,
274+ Version : '2012-10-17' ,
275+ } ,
276+ } ) ;
277+ expect ( principalStack ) . toHaveResourceLike ( 'AWS::IAM::Policy' , {
278+ PolicyDocument : {
279+ Statement : [
280+ {
281+ Action : [
282+ 'kms:Encrypt' ,
283+ 'kms:ReEncrypt*' ,
284+ 'kms:GenerateDataKey*' ,
285+ ] ,
286+ Effect : 'Allow' ,
287+ Resource : '*' ,
288+ } ,
289+ ] ,
290+ Version : '2012-10-17' ,
291+ } ,
292+ } ) ;
293+ } ) ;
294+
295+ testFutureBehavior ( 'grant for a principal in a different account' , flags , cdk . App , ( app ) => {
296+ const principalStack = new cdk . Stack ( app , 'PrincipalStack' , { env : { account : '0123456789012' } } ) ;
297+ const principal = new iam . Role ( principalStack , 'Role' , {
298+ assumedBy : new iam . AnyPrincipal ( ) ,
299+ roleName : 'MyRolePhysicalName' ,
300+ } ) ;
301+
302+ const keyStack = new cdk . Stack ( app , 'KeyStack' , { env : { account : '111111111111' } } ) ;
303+ const key = new kms . Key ( keyStack , 'Key' ) ;
304+
305+ key . grantEncrypt ( principal ) ;
306+
307+ expect ( keyStack ) . toHaveResourceLike ( 'AWS::KMS::Key' , {
308+ KeyPolicy : {
309+ Statement : [
310+ {
311+ // Default policy, unmodified
312+ } ,
313+ {
314+ Action : [
315+ 'kms:Encrypt' ,
316+ 'kms:ReEncrypt*' ,
317+ 'kms:GenerateDataKey*' ,
318+ ] ,
319+ Effect : 'Allow' ,
320+ Principal : { AWS : { 'Fn::Join' : [ '' , [ 'arn:' , { Ref : 'AWS::Partition' } , ':iam::0123456789012:role/MyRolePhysicalName' ] ] } } ,
321+ Resource : '*' ,
322+ } ,
323+ ] ,
324+ Version : '2012-10-17' ,
325+ } ,
326+ } ) ;
327+ expect ( principalStack ) . toHaveResourceLike ( 'AWS::IAM::Policy' , {
328+ PolicyDocument : {
329+ Statement : [
330+ {
331+ Action : [
332+ 'kms:Encrypt' ,
333+ 'kms:ReEncrypt*' ,
334+ 'kms:GenerateDataKey*' ,
335+ ] ,
336+ Effect : 'Allow' ,
337+ Resource : '*' ,
338+ } ,
339+ ] ,
340+ Version : '2012-10-17' ,
341+ } ,
342+ } ) ;
343+ } ) ;
344+
248345 testFutureBehavior ( 'additional key admins can be specified (with imported/immutable principal)' , flags , cdk . App , ( app ) => {
249346 const stack = new cdk . Stack ( app ) ;
250347 const adminRole = iam . Role . fromRoleArn ( stack , 'Admin' , 'arn:aws:iam::123456789012:role/TrustedAdmin' ) ;
0 commit comments