package Ġcom . cluster Ċ Ċ import Ġcom . amazonaws . services . identity management . Amazon Identity Management Ċ import Ġcom . amazonaws . services . identity management . Amazon Identity Management Client Ċ import Ġcom . fasterxml . jackson . annotation . JsonIgnore Properties Ċ import Ġcom . fasterxml . jackson . core . Json Parser Ċ import Ġcom . fasterxml . jackson . databind . Deserialization Context Ċ import Ġcom . fasterxml . jackson . databind . Json Deserializer Ċ import Ġcom . fasterxml . jackson . databind . JsonNode Ċ import Ġcom . fasterxml . jackson . databind . annotation . Json Deserialize Ċ import Ġcom . fasterxml . jackson . module . kotlin . jackson ObjectMapper Ċ import Ġcom . fasterxml . jackson . module . kotlin . readValue Ċ import Ġjava . net . URL Decoder Ċ import Ġcom . amazonaws . services . identity management . model .* Ċ import Ġcom . fasterxml . jackson . databind . module . Simple Module ĊĊĊ Ċ class ĠAws Resource Finder IAM ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġiam Client : Ġ( region : ĠString ) Ġ-> ĠAmazon Identity Management Ġ= ĠAws Configurator . region Client From ( Amazon Identity Management Client . builder ()) Ċ ): ĠAws Resource . Finder { ĊĠĠĠ Ġoverride Ġfun Ġfind In ( account : ĠString , Ġregions : ĠList < String >): ĠList < Aws Resource . Relationships > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġregions . flatMap { Ġiam Resources ( it ) Ġ+ Ġinstance Profile Resources ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġiam Resources ( region : ĠString ): ĠList < Aws Resource . Relationships >{ ĊĠĠĠĠĠĠĠ Ġval Ġiam Client Ġ= Ġiam Client ( region ) ĊĠĠĠĠĠĠĠ Ġreturn ĠAws Resource . Finder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect All ( Ġ{ Ġit . marker Ġ} Ġ){ Ġiam Client . list Roles ( List Roles Request (). with Marker ( it )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġit . roles Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrole Arn Ġ= ĠAws Resource . Arn . from ( it . arn ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . out . println ( role Arn . arn ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAws Resource . Relationships ( Aws Resource ( role Arn , ĠAws Resource . Info ( it . role Name , ĠAws ResourceType . ROLE . type ())), related Ar ns For ( iam Client , Ġit )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinstance Profile Resources ( region : ĠString ): ĠList < Aws Resource . Relationships >{ ĊĠĠĠĠĠĠĠ Ġval Ġiam Client Ġ= Ġiam Client ( region ) ĊĠĠĠĠĠĠĠ Ġreturn ĠAws Resource . Finder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect All ({ Ġit . marker Ġ} ){ Ġiam Client . list Instance Profiles ( List Instance Profiles Request (). with Marker ( it ))} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġit . instance Profiles Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprofile Arn Ġ= ĠAws Resource . Arn . from ( it . arn ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . out . println ( profile Arn . arn ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAws Resource . Relationships ( Aws Resource ( profile Arn , ĠAws Resource . Info ( it . instance Profile Name , ĠAws ResourceType . INSTANCE _ PROFILE . type ())), Ġrelated Ar ns For ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrelated Ar ns For ( instance Profile : ĠInstance Profile ): ĠList < Aws Resource . Arn >{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinstance Profile . roles . map Ġ{ ĠAws Resource . Arn . from ( it . arn ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrelated Ar ns For ( iam Client : ĠAmazon Identity Management , Ġrole : ĠRole ): ĠList < Aws Resource . Arn >{ ĊĠĠĠĠĠĠĠ Ġreturn ĠAws Resource . Finder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect All ( Ġ{ Ġit . marker Ġ} Ġ){ Ġiam Client . list Role Policies ( List Role Policies Request (). with Marker ( it ). with Role Name ( role . role Name )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġit . policy Names . flatMap Ġ{ Ġresource Access List From ( iam Client , Ġrole . role Name , Ġit ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresource Actions Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice List Ġ= Ġresource Actions . actions . groupBy Ġ{ Ġif ( it Ġ== Ġ"* ") Ġit Ġelse Ġit . substring Before (': ') Ġ}. keys ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresource Actions . resources . flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ== Ġ"*" Ġ-> Ġservice List . map Ġ{ ĠAws Resource . Arn ( it , Ġ"", Ġ"", Ġ"* ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . startsWith (" arn ") Ġ-> Ġ ĠlistOf ( Aws Resource . Arn . from ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġresource Access List From ( iam Client : ĠAmazon Identity Management , Ġrole Name : ĠString , Ġpolicy Name : ĠString ): ĠList < Resource Actions > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAws Resource . Finder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. client Call Ġ{ Ġiam Client . get Role Policy ( Get Role Policy Request (). with Role Name ( role Name ). with Policy Name ( policy Name )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġj ack son Mapper . readValue < Iam Policy >( URL Decoder . decode ( it ?. policy Document , Ġ" UTF - 8 ")) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġit . Statement . filter Ġ{ Ġit . Effect Ġ== Ġ" Allow " Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResource Actions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . Resource . is Text ual ) ĠlistOf ( it . Resource . as Text ()) Ġelse Ġit . Resource . map Ġ{ Ġit . as Text () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . Action . is Text ual ) ĠlistOf ( it . Action . as Text ()) Ġelse Ġit . Action . map Ġ{ Ġit . as Text () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠI am Policy Deserializer : ĠJson Deserializer < Iam Policy > (){ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdeserialize ( parser : ĠJson Parser , Ġcontext : ĠDeserial ization Context ): ĠI am Policy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġparser . codec . read Tree < JsonNode >( parser ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġversion Ġ= Ġif ( node . has (" Version ")) Ġnode [" Version "]. text Value () Ġelse Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnode [" Statement "]. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( it . isObject ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI am Policy ( Version Ġ= Ġversion , ĠStatement Ġ= ĠlistOf ( parser . codec . tree To Value ( it , ĠI am Policy Statement :: class . java ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠI am Policy ( Version Ġ= Ġversion , ĠStatement Ġ= Ġit . elements (). as Sequence (). toList (). map Ġ{ Ġparser . codec . tree To Value ( it , ĠI am Policy Statement :: class . java )}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ JsonIgnore Properties ( ignore Unknown Ġ= Ġtrue ) ĊĠĠĠ Ġ@ Json Deserialize ( using Ġ= ĠI am Policy Deserializer :: class ) ĊĠĠĠ Ġdata Ġclass ĠI am Policy ( val ĠVersion : ĠString Ġ= Ġ"", Ġval ĠStatement : ĠList < Iam Policy Statement >) ĊĠĠĠ Ġ@ JsonIgnore Properties ( ignore Unknown Ġ= Ġtrue ) ĊĠĠĠ Ġdata Ġclass ĠI am Policy Statement ( val ĠAction : ĠJsonNode , Ġval ĠResource : ĠJsonNode , Ġval ĠEffect : ĠString ) ĊĠĠĠ Ġdata Ġclass ĠResource Actions ( val Ġresources : ĠList < String >, Ġval Ġactions : ĠList < String >) ĊĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġj ack son Mapper Ġ= Ġj ack son ObjectMapper () ĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodule Ġ= ĠSimple Module () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodule . add Deserializer ( Iam Policy :: class . java , ĠI am Policy Deserializer ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġj ack son Mapper . register Module ( module ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }