@kensio/yulin 1.20.15 → 1.20.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (355) hide show
  1. package/README.md +13 -0
  2. package/dist/sdk/module/sim-sdk-module-client-interceptor.d.ts +5 -0
  3. package/dist/sdk/module/sim-sdk-module-client-interceptor.js +14 -0
  4. package/dist/sdk/module/sim-sdk-static-client-factory.d.ts +26 -0
  5. package/dist/sdk/module/sim-sdk-static-client-factory.js +59 -0
  6. package/dist/sdk/send-patch.d.ts +8 -0
  7. package/dist/sdk/send-patch.js +11 -0
  8. package/dist/service/aws/caller/sim-aws-ambient-caller.d.ts +23 -0
  9. package/dist/service/aws/caller/sim-aws-ambient-caller.js +12 -0
  10. package/dist/service/aws/caller/sim-aws-caller-resolver.d.ts +39 -6
  11. package/dist/service/aws/caller/sim-aws-caller-resolver.js +32 -30
  12. package/dist/service/aws/caller/sim-aws-caller.d.ts +9 -0
  13. package/dist/service/aws/caller/sim-aws-resolved-caller.d.ts +19 -0
  14. package/dist/service/aws/caller/sim-aws-resolved-caller.js +26 -0
  15. package/dist/service/aws/factory/sim-aws-account-region-service-builder.d.ts +12 -0
  16. package/dist/service/aws/factory/sim-aws-account-region-service-builder.js +6 -0
  17. package/dist/service/aws/factory/sim-aws-account-service-cache.d.ts +12 -0
  18. package/dist/service/aws/factory/sim-aws-account-service-cache.js +9 -0
  19. package/dist/service/aws/factory/sim-aws-registered-service-builder.js +3 -1
  20. package/dist/service/aws/factory/sim-aws-service-factory.d.ts +5 -0
  21. package/dist/service/aws/factory/sim-aws-service-factory.js +14 -0
  22. package/dist/service/aws/sim-aws-properties.d.ts +15 -0
  23. package/dist/service/aws/sim-aws.js +2 -1
  24. package/dist/service/cloudformation/command/create-stack/create-stack.handler.d.ts +4 -0
  25. package/dist/service/cloudformation/command/create-stack/create-stack.handler.js +4 -1
  26. package/dist/service/cloudformation/deploy/sim-cfn-cdk-out-deployer.js +2 -1
  27. package/dist/service/cloudformation/deploy/sim-cfn-cdk-out-plan.d.ts +11 -2
  28. package/dist/service/cloudformation/deploy/sim-cfn-cdk-out-plan.js +2 -1
  29. package/dist/service/cloudformation/deploy/sim-cfn-cdk-out-stack-options.d.ts +6 -0
  30. package/dist/service/cloudformation/deploy/sim-cfn-template-deployer.d.ts +11 -0
  31. package/dist/service/cloudformation/deploy/sim-cfn-template-deployer.js +17 -15
  32. package/dist/service/cloudformation/deploy/sim-cfn-template-file-loader.d.ts +12 -0
  33. package/dist/service/cloudformation/deploy/sim-cfn-template-file-loader.js +2 -1
  34. package/dist/service/cloudformation/resource/cfn/cloudfront/sim-cloudfront-cache-policy-cfn.d.ts +23 -0
  35. package/dist/service/cloudformation/resource/cfn/cloudfront/sim-cloudfront-cache-policy-cfn.js +30 -0
  36. package/dist/service/cloudformation/resource/cfn/cloudfront/sim-cloudfront-cfn-value-adapter.js +8 -0
  37. package/dist/service/cloudformation/resource/name/sim-cfn-generated-resource-name.d.ts +29 -12
  38. package/dist/service/cloudformation/resource/name/sim-cfn-generated-resource-name.js +51 -20
  39. package/dist/service/cloudformation/stack/deploy/sim-cfn-resource-order.d.ts +19 -0
  40. package/dist/service/cloudformation/stack/deploy/sim-cfn-resource-order.js +6 -0
  41. package/dist/service/cloudformation/stack/deploy/sim-cfn-stack-resource-batch-creator.d.ts +7 -0
  42. package/dist/service/cloudformation/stack/deploy/sim-cfn-stack-resource-batch-creator.js +9 -2
  43. package/dist/service/cloudformation/stack/deploy/sim-cfn-stack-resource-creator.d.ts +2 -0
  44. package/dist/service/cloudformation/stack/deploy/sim-cfn-stack-resource-creator.js +2 -1
  45. package/dist/service/cloudformation/stack/sim-cfn-stack-resource-operations.d.ts +6 -0
  46. package/dist/service/cloudformation/stack/sim-cfn-stack-resource-operations.js +4 -1
  47. package/dist/service/cloudformation/stack/sim-cfn-stack.js +2 -1
  48. package/dist/service/cloudformation/stack/sim-cfn-stack.type.d.ts +6 -0
  49. package/dist/service/cloudfront/behaviour/sim-cloud-front-behavior.d.ts +5 -0
  50. package/dist/service/cloudfront/cache-policy/sim-cf-cache-policy-registry.d.ts +37 -0
  51. package/dist/service/cloudfront/cache-policy/sim-cf-cache-policy-registry.js +50 -0
  52. package/dist/service/cloudfront/cache-policy/sim-cf-cache-policy.d.ts +25 -0
  53. package/dist/service/cloudfront/cache-policy/sim-cf-cache-policy.js +21 -0
  54. package/dist/service/cloudfront/cache-policy/sim-cf-managed-cache-policies.d.ts +28 -0
  55. package/dist/service/cloudfront/cache-policy/sim-cf-managed-cache-policies.js +48 -0
  56. package/dist/service/cloudfront/cff/function-code-input/cff-function-code-input.d.ts +8 -0
  57. package/dist/service/cloudfront/cff/function-code-input/cff-function-code-input.js +13 -0
  58. package/dist/service/cloudfront/cff/sim-cf-function-commands.d.ts +52 -0
  59. package/dist/service/cloudfront/cff/sim-cf-function-commands.js +51 -0
  60. package/dist/service/cloudfront/cff/sim-cff-configuration.d.ts +41 -0
  61. package/dist/service/cloudfront/cff/sim-cff-configuration.js +34 -0
  62. package/dist/service/cloudfront/cff/sim-cff-stage.d.ts +23 -0
  63. package/dist/service/cloudfront/cff/sim-cff-stage.js +30 -0
  64. package/dist/service/cloudfront/cff/sim-cloudfront-function.d.ts +6 -1
  65. package/dist/service/cloudfront/cff/sim-cloudfront-function.js +6 -0
  66. package/dist/service/cloudfront/cfn/cache-policy/sim-cfn-cf-cache-policy-config.d.ts +27 -0
  67. package/dist/service/cloudfront/cfn/cache-policy/sim-cfn-cf-cache-policy-config.js +42 -0
  68. package/dist/service/cloudfront/cfn/cache-policy/sim-cfn-cf-cache-policy-creator.d.ts +24 -0
  69. package/dist/service/cloudfront/cfn/cache-policy/sim-cfn-cf-cache-policy-creator.js +32 -0
  70. package/dist/service/cloudfront/cfn/distro/{sim-cfn-cf-distro-response-headers-policy.d.ts → sim-cfn-cf-distro-behavior-policies.d.ts} +8 -7
  71. package/dist/service/cloudfront/cfn/distro/{sim-cfn-cf-distro-response-headers-policy.js → sim-cfn-cf-distro-behavior-policies.js} +11 -37
  72. package/dist/service/cloudfront/cfn/distro/sim-cfn-cf-distro-creator.d.ts +6 -5
  73. package/dist/service/cloudfront/cfn/distro/sim-cfn-cf-distro-creator.js +8 -7
  74. package/dist/service/cloudfront/cfn/distro/sim-cfn-cf-distro-policy-drops.d.ts +23 -0
  75. package/dist/service/cloudfront/cfn/distro/sim-cfn-cf-distro-policy-drops.js +50 -0
  76. package/dist/service/cloudfront/cfn/sim-cfn-cloudfront-resource-factory.d.ts +1 -0
  77. package/dist/service/cloudfront/cfn/sim-cfn-cloudfront-resource-factory.js +10 -0
  78. package/dist/service/cloudfront/command/create-distribution/create-distribution.command.d.ts +1 -0
  79. package/dist/service/cloudfront/command/create-distribution/create-distribution.handler.d.ts +2 -0
  80. package/dist/service/cloudfront/command/create-function/create-function.handler.js +7 -1
  81. package/dist/service/cloudfront/command/function/sim-cf-describe-function.d.ts +22 -0
  82. package/dist/service/cloudfront/command/function/sim-cf-describe-function.js +32 -0
  83. package/dist/service/cloudfront/command/function/sim-cf-function-access.d.ts +48 -0
  84. package/dist/service/cloudfront/command/function/sim-cf-function-access.js +48 -0
  85. package/dist/service/cloudfront/command/function/sim-cf-function-command.types.d.ts +97 -0
  86. package/dist/service/cloudfront/command/function/sim-cf-function-command.types.js +10 -0
  87. package/dist/service/cloudfront/command/function/sim-cf-function-lookup.d.ts +12 -0
  88. package/dist/service/cloudfront/command/function/sim-cf-function-lookup.js +21 -0
  89. package/dist/service/cloudfront/command/function/sim-cf-function-summary.d.ts +11 -0
  90. package/dist/service/cloudfront/command/function/sim-cf-function-summary.js +30 -0
  91. package/dist/service/cloudfront/command/function/sim-cf-get-function.d.ts +23 -0
  92. package/dist/service/cloudfront/command/function/sim-cf-get-function.js +33 -0
  93. package/dist/service/cloudfront/command/function/sim-cf-list-functions.d.ts +22 -0
  94. package/dist/service/cloudfront/command/function/sim-cf-list-functions.js +38 -0
  95. package/dist/service/cloudfront/command/update-distribution/update-distribution.handler.d.ts +2 -0
  96. package/dist/service/cloudfront/distribution/configurator/sim-cf-behavior-cache-policy.d.ts +18 -0
  97. package/dist/service/cloudfront/distribution/configurator/sim-cf-behavior-cache-policy.js +30 -0
  98. package/dist/service/cloudfront/distribution/configurator/sim-cf-behavior-policies.d.ts +28 -0
  99. package/dist/service/cloudfront/distribution/configurator/sim-cf-behavior-policies.js +41 -0
  100. package/dist/service/cloudfront/distribution/configurator/sim-cf-behavior-properties.d.ts +2 -2
  101. package/dist/service/cloudfront/distribution/configurator/sim-cf-behavior-properties.js +6 -3
  102. package/dist/service/cloudfront/distribution/configurator/sim-cf-behavior-response-headers-policy.d.ts +0 -10
  103. package/dist/service/cloudfront/distribution/configurator/sim-cf-behavior-response-headers-policy.js +0 -19
  104. package/dist/service/cloudfront/distribution/configurator/sim-cf-distribution-configurator.factory.d.ts +2 -0
  105. package/dist/service/cloudfront/distribution/configurator/sim-cf-distribution-configurator.factory.js +4 -2
  106. package/dist/service/cloudfront/distribution/configurator/sim-cloud-front-behavior-configurator.d.ts +3 -3
  107. package/dist/service/cloudfront/distribution/configurator/sim-cloud-front-behavior-configurator.js +5 -5
  108. package/dist/service/cloudfront/distribution/configurator/sim-cloud-front-distribution-configurator.d.ts +3 -3
  109. package/dist/service/cloudfront/distribution/configurator/sim-cloud-front-distribution-configurator.js +4 -4
  110. package/dist/service/cloudfront/distribution/sim-cf-distribution-configuration-state.d.ts +3 -1
  111. package/dist/service/cloudfront/distribution/sim-cf-distribution-reconfigurer.d.ts +2 -0
  112. package/dist/service/cloudfront/error/sim-cloudfront.error.d.ts +21 -0
  113. package/dist/service/cloudfront/error/sim-cloudfront.error.js +25 -0
  114. package/dist/service/cloudfront/key-value-store/sim-cf-key-value-store-access.js +2 -10
  115. package/dist/service/cloudfront/key-value-store/sim-cf-key-value-store.js +2 -1
  116. package/dist/service/cloudfront/sdk/sim-cloudfront-sdk-command-router.js +12 -0
  117. package/dist/service/cloudfront/sim-cf-authorize.d.ts +16 -0
  118. package/dist/service/cloudfront/sim-cf-authorize.js +19 -0
  119. package/dist/service/cloudfront/sim-cf-etag.d.ts +7 -0
  120. package/dist/service/cloudfront/sim-cf-etag.js +10 -0
  121. package/dist/service/cloudfront/sim-cloudfront-commands.d.ts +8 -12
  122. package/dist/service/cloudfront/sim-cloudfront-commands.js +8 -17
  123. package/dist/service/cloudfront/sim-cloudfront-policies.d.ts +43 -0
  124. package/dist/service/cloudfront/sim-cloudfront-policies.js +53 -0
  125. package/dist/service/cloudfront/sim-cloudfront.d.ts +13 -17
  126. package/dist/service/cloudfront/sim-cloudfront.js +22 -25
  127. package/dist/service/ecr/authorize/sim-ecr-authorizer.d.ts +31 -0
  128. package/dist/service/ecr/authorize/sim-ecr-authorizer.js +38 -0
  129. package/dist/service/ecr/cfn/repository/sim-cfn-ecr-repository-creator.d.ts +11 -2
  130. package/dist/service/ecr/cfn/repository/sim-cfn-ecr-repository-creator.js +11 -2
  131. package/dist/service/ecr/cfn/sim-ecr-cfn-resource-factory.d.ts +4 -2
  132. package/dist/service/ecr/cfn/sim-ecr-cfn-resource-factory.js +8 -9
  133. package/dist/service/ecr/cfn/sim-ecr-cfn-unsupported-resource.d.ts +7 -0
  134. package/dist/service/ecr/cfn/sim-ecr-cfn-unsupported-resource.js +9 -0
  135. package/dist/service/ecr/sim-ecr.d.ts +7 -0
  136. package/dist/service/ecr/sim-ecr.js +16 -4
  137. package/dist/service/ecs/command/authorize/sim-ecs-authorizer.d.ts +12 -0
  138. package/dist/service/ecs/command/authorize/sim-ecs-authorizer.js +21 -0
  139. package/dist/service/ecs/command/register-task-definition/register-task-definition.handler.js +1 -0
  140. package/dist/service/ecs/sim-ecs-service-principal.d.ts +8 -0
  141. package/dist/service/ecs/sim-ecs-service-principal.js +8 -0
  142. package/dist/service/eventbridge/command/authorize/sim-event-bridge-authorizer.d.ts +12 -0
  143. package/dist/service/eventbridge/command/authorize/sim-event-bridge-authorizer.js +21 -0
  144. package/dist/service/eventbridge/command/rule/sim-event-bridge-rule-access.d.ts +13 -0
  145. package/dist/service/eventbridge/command/rule/sim-event-bridge-rule-access.js +9 -0
  146. package/dist/service/eventbridge/command/target/sim-event-bridge-put-targets.js +1 -0
  147. package/dist/service/firehose/command/authorize/sim-firehose-authorizer.d.ts +12 -0
  148. package/dist/service/firehose/command/authorize/sim-firehose-authorizer.js +20 -0
  149. package/dist/service/firehose/command/sim-firehose-delivery-stream-access.d.ts +4 -0
  150. package/dist/service/firehose/command/sim-firehose-delivery-stream-access.js +6 -0
  151. package/dist/service/firehose/command/stream/sim-firehose-create-delivery-stream.js +3 -1
  152. package/dist/service/firehose/sim-firehose-service-principal.d.ts +8 -0
  153. package/dist/service/firehose/sim-firehose-service-principal.js +8 -0
  154. package/dist/service/firehose/source/sim-firehose-source.d.ts +5 -0
  155. package/dist/service/firehose/source/sim-firehose-source.js +5 -0
  156. package/dist/service/glue/cfn/database/sim-cfn-glue-database-properties.js +2 -2
  157. package/dist/service/glue/cfn/sim-cfn-glue-generated-name.d.ts +10 -0
  158. package/dist/service/glue/cfn/sim-cfn-glue-generated-name.js +25 -0
  159. package/dist/service/glue/cfn/table/sim-cfn-glue-table-properties.js +2 -3
  160. package/dist/service/iam/authorize/allow/sim-iam-allow-requirement.d.ts +33 -2
  161. package/dist/service/iam/authorize/allow/sim-iam-allow-requirement.js +33 -2
  162. package/dist/service/iam/authorize/allow/sim-iam-allow-statements.d.ts +4 -3
  163. package/dist/service/iam/authorize/allow/sim-iam-allow-statements.js +9 -3
  164. package/dist/service/iam/authorize/context/sim-iam-auth-z-allow-requirement.d.ts +14 -5
  165. package/dist/service/iam/authorize/context/sim-iam-auth-z-allow-requirement.js +16 -12
  166. package/dist/service/iam/authorize/context/sim-iam-auth-z-caller-context-builder.d.ts +36 -7
  167. package/dist/service/iam/authorize/context/sim-iam-auth-z-caller-context-builder.js +22 -11
  168. package/dist/service/iam/authorize/context/sim-iam-auth-z-context-builder.d.ts +10 -71
  169. package/dist/service/iam/authorize/context/sim-iam-auth-z-context-builder.js +7 -2
  170. package/dist/service/iam/authorize/context/sim-iam-auth-z-input.d.ts +87 -0
  171. package/dist/service/iam/authorize/context/sim-iam-auth-z-input.js +1 -0
  172. package/dist/service/iam/authorize/match/sim-iam-policy-principal-matcher.d.ts +21 -3
  173. package/dist/service/iam/authorize/match/sim-iam-policy-principal-matcher.js +34 -10
  174. package/dist/service/iam/authorize/match/sim-iam-principal-match.d.ts +29 -8
  175. package/dist/service/iam/authorize/match/sim-iam-principal-match.js +38 -13
  176. package/dist/service/iam/authorize/pass-role/sim-iam-pass-role-authorizer.d.ts +74 -0
  177. package/dist/service/iam/authorize/pass-role/sim-iam-pass-role-authorizer.js +92 -0
  178. package/dist/service/iam/authorize/sim-iam-account-auth-z.d.ts +21 -5
  179. package/dist/service/iam/authorize/sim-iam-account-auth-z.js +7 -3
  180. package/dist/service/iam/authorize/sim-iam-authorizer.d.ts +5 -2
  181. package/dist/service/iam/authorize/sim-iam-authorizer.js +3 -1
  182. package/dist/service/iam/authorize/sim-iam-inter-service-auth-z.d.ts +1 -1
  183. package/dist/service/iam/authorize/sim-iam-wildcard.js +39 -4
  184. package/dist/service/iam/cfn/managed-policy/sim-cfn-iam-managed-policy-creator.js +2 -1
  185. package/dist/service/iam/cfn/name/sim-cfn-iam-generated-name.d.ts +16 -0
  186. package/dist/service/iam/cfn/name/sim-cfn-iam-generated-name.js +36 -0
  187. package/dist/service/iam/cfn/role/sim-cfn-iam-role-properties-parser.js +9 -8
  188. package/dist/service/iam/cfn/sim-cfn-iam-optional-string.d.ts +17 -0
  189. package/dist/service/iam/cfn/sim-cfn-iam-optional-string.js +17 -0
  190. package/dist/service/iam/cfn/user/sim-cfn-iam-user-properties-parser.js +4 -8
  191. package/dist/service/iam/command/policy/create-policy/create-policy-input-resolver.js +2 -0
  192. package/dist/service/iam/command/policy/put-role-policy/put-role-policy.handler.js +5 -0
  193. package/dist/service/iam/command/policy/put-user-policy/put-user-policy.handler.js +5 -0
  194. package/dist/service/iam/command/role/create-role/create-role.handler.js +4 -1
  195. package/dist/service/iam/error/sim-iam.error.d.ts +11 -0
  196. package/dist/service/iam/error/sim-iam.error.js +13 -0
  197. package/dist/service/iam/index.d.ts +1 -0
  198. package/dist/service/iam/policy/sim-iam-policy-document-of-size.d.ts +18 -0
  199. package/dist/service/iam/policy/sim-iam-policy-document-of-size.js +41 -0
  200. package/dist/service/iam/role/sim-iam-deploy-role.d.ts +56 -0
  201. package/dist/service/iam/role/sim-iam-deploy-role.js +50 -0
  202. package/dist/service/iam/role/sim-iam-role-with-policy.factory.d.ts +11 -0
  203. package/dist/service/iam/role/sim-iam-role-with-policy.factory.js +4 -2
  204. package/dist/service/iam/sim-iam-account-parts.d.ts +16 -0
  205. package/dist/service/iam/sim-iam-account-parts.js +2 -0
  206. package/dist/service/iam/sim-iam.d.ts +12 -2
  207. package/dist/service/iam/sim-iam.js +12 -0
  208. package/dist/service/iam/validate/size/sim-iam-policy-document-size.d.ts +57 -0
  209. package/dist/service/iam/validate/size/sim-iam-policy-document-size.js +71 -0
  210. package/dist/service/kms/command/authorize/sim-kms-authorizer.d.ts +3 -1
  211. package/dist/service/kms/command/authorize/sim-kms-authorizer.js +4 -1
  212. package/dist/service/kms/command/sim-kms-request-options.d.ts +11 -0
  213. package/dist/service/kms/key/sim-kms-key-policy.d.ts +5 -4
  214. package/dist/service/kms/key/sim-kms-key-policy.js +4 -3
  215. package/dist/service/lambda/cfn/function/sim-cfn-lambda-function-properties-parser.d.ts +2 -2
  216. package/dist/service/lambda/cfn/function/sim-cfn-lambda-function-properties-parser.js +4 -3
  217. package/dist/service/lambda/cfn/function/sim-cfn-lambda-generated-function-name.d.ts +10 -0
  218. package/dist/service/lambda/cfn/function/sim-cfn-lambda-generated-function-name.js +25 -0
  219. package/dist/service/lambda/command/authorize/sim-lambda-resource-policies.d.ts +1 -1
  220. package/dist/service/lambda/command/create-function/create-function-authorizer.d.ts +9 -2
  221. package/dist/service/lambda/command/create-function/create-function-authorizer.js +16 -2
  222. package/dist/service/lambda/command/create-function/create-function.handler.js +1 -1
  223. package/dist/service/lambda/command/update-function-configuration/update-function-configuration-authorizer.d.ts +7 -2
  224. package/dist/service/lambda/command/update-function-configuration/update-function-configuration-authorizer.js +14 -2
  225. package/dist/service/lambda/command/update-function-configuration/update-function-configuration.handler.js +1 -1
  226. package/dist/service/lambda/function/logging/sim-lambda-function-logging.d.ts +10 -1
  227. package/dist/service/lambda/function/logging/sim-lambda-function-logging.js +25 -1
  228. package/dist/service/lambda/function/logging/sim-lambda-invoke-error-log.d.ts +13 -0
  229. package/dist/service/lambda/function/logging/sim-lambda-invoke-error-log.js +18 -0
  230. package/dist/service/lambda/sim-lambda-service-principal.d.ts +7 -0
  231. package/dist/service/lambda/sim-lambda-service-principal.js +7 -0
  232. package/dist/service/logs/cfn/delivery/sim-cfn-delivery-authorization.d.ts +46 -0
  233. package/dist/service/logs/cfn/delivery/sim-cfn-delivery-authorization.js +49 -0
  234. package/dist/service/logs/cfn/delivery/sim-cfn-delivery-creator.d.ts +5 -0
  235. package/dist/service/logs/cfn/delivery/sim-cfn-delivery-creator.js +6 -0
  236. package/dist/service/logs/cfn/delivery/sim-cfn-delivery-destination-creator.d.ts +5 -0
  237. package/dist/service/logs/cfn/delivery/sim-cfn-delivery-destination-creator.js +6 -0
  238. package/dist/service/logs/cfn/delivery/sim-cfn-delivery-source-creator.d.ts +5 -0
  239. package/dist/service/logs/cfn/delivery/sim-cfn-delivery-source-creator.js +6 -0
  240. package/dist/service/logs/cfn/group/sim-cfn-log-group-creator.d.ts +9 -2
  241. package/dist/service/logs/cfn/group/sim-cfn-log-group-creator.js +34 -5
  242. package/dist/service/logs/cfn/sim-logs-cfn-resource-deleter.js +1 -1
  243. package/dist/service/logs/cfn/sim-logs-cfn-resource-factory.d.ts +4 -0
  244. package/dist/service/logs/cfn/sim-logs-cfn-resource-factory.js +9 -4
  245. package/dist/service/logs/sim-logs-commands.d.ts +3 -0
  246. package/dist/service/logs/sim-logs-commands.js +4 -0
  247. package/dist/service/logs/sim-logs.js +6 -1
  248. package/dist/service/s3/cfn/bucket/sim-cfn-s3-bucket-creator.d.ts +2 -2
  249. package/dist/service/s3/cfn/bucket/sim-cfn-s3-bucket-creator.js +4 -3
  250. package/dist/service/s3/cfn/bucket/sim-cfn-s3-bucket-generated-name.d.ts +12 -0
  251. package/dist/service/s3/cfn/bucket/sim-cfn-s3-bucket-generated-name.js +22 -0
  252. package/dist/service/s3/command/authorize/sim-s3-bucket-resource-policies.d.ts +1 -1
  253. package/dist/service/scheduler/command/authorize/sim-scheduler-authorizer.d.ts +10 -1
  254. package/dist/service/scheduler/command/authorize/sim-scheduler-authorizer.js +19 -1
  255. package/dist/service/scheduler/command/schedule/sim-scheduler-create-schedule.js +1 -0
  256. package/dist/service/scheduler/command/schedule/sim-scheduler-schedule-access.d.ts +8 -0
  257. package/dist/service/scheduler/command/schedule/sim-scheduler-schedule-access.js +9 -0
  258. package/dist/service/scheduler/command/schedule/sim-scheduler-update-schedule.js +1 -0
  259. package/dist/service/secretsmanager/cfn/secret/sim-cfn-secrets-manager-generated-name.d.ts +15 -0
  260. package/dist/service/secretsmanager/cfn/secret/sim-cfn-secrets-manager-generated-name.js +22 -0
  261. package/dist/service/secretsmanager/cfn/secret/sim-cfn-secrets-manager-secret-properties.d.ts +4 -10
  262. package/dist/service/secretsmanager/cfn/secret/sim-cfn-secrets-manager-secret-properties.js +13 -31
  263. package/dist/service/secretsmanager/cfn/secret/sim-cfn-secrets-manager-secret-value.d.ts +17 -0
  264. package/dist/service/secretsmanager/cfn/secret/sim-cfn-secrets-manager-secret-value.js +30 -0
  265. package/dist/service/secretsmanager/secret/sim-secrets-manager-secret-name.d.ts +6 -0
  266. package/dist/service/secretsmanager/secret/sim-secrets-manager-secret-name.js +8 -3
  267. package/dist/service/sns/command/authorize/sim-sns-topic-resource-policies.d.ts +1 -1
  268. package/dist/service/sqs/command/authorize/sim-sqs-queue-resource-policies.d.ts +1 -1
  269. package/dist/service/ssm/cfn/parameter/sim-cfn-ssm-generated-parameter-name.d.ts +16 -0
  270. package/dist/service/ssm/cfn/parameter/sim-cfn-ssm-generated-parameter-name.js +23 -0
  271. package/dist/service/ssm/cfn/parameter/sim-cfn-ssm-parameter-properties.d.ts +2 -4
  272. package/dist/service/ssm/cfn/parameter/sim-cfn-ssm-parameter-properties.js +5 -5
  273. package/dist/service/ssm/parameter/sim-ssm-kms-crypto.d.ts +6 -4
  274. package/dist/service/ssm/parameter/sim-ssm-kms-crypto.js +4 -4
  275. package/dist/service/ssm/parameter/sim-ssm-parameter-arn.d.ts +17 -0
  276. package/dist/service/ssm/parameter/sim-ssm-parameter-arn.js +20 -0
  277. package/dist/service/ssm/parameter/sim-ssm-parameter-kms.d.ts +15 -9
  278. package/dist/service/ssm/parameter/sim-ssm-parameter-kms.js +20 -10
  279. package/dist/service/ssm/parameter/sim-ssm-parameter-name.js +3 -12
  280. package/dist/service/stepfunctions/command/authorize/sim-step-functions-authorizer.d.ts +41 -0
  281. package/dist/service/stepfunctions/command/authorize/sim-step-functions-authorizer.js +64 -0
  282. package/dist/service/stepfunctions/command/machine/sim-state-machine-create.d.ts +5 -2
  283. package/dist/service/stepfunctions/command/machine/sim-state-machine-create.js +6 -2
  284. package/dist/service/stepfunctions/command/machine/sim-state-machine-delete.d.ts +26 -0
  285. package/dist/service/stepfunctions/command/machine/sim-state-machine-delete.js +29 -0
  286. package/dist/service/stepfunctions/command/machine/sim-state-machine-lookup.d.ts +7 -0
  287. package/dist/service/stepfunctions/command/machine/sim-state-machine-lookup.js +12 -3
  288. package/dist/service/stepfunctions/command/machine/sim-state-machine-update.d.ts +19 -0
  289. package/dist/service/stepfunctions/command/machine/{sim-state-machine-writes.js → sim-state-machine-update.js} +3 -14
  290. package/dist/service/stepfunctions/sim-step-functions.d.ts +8 -2
  291. package/dist/service/stepfunctions/sim-step-functions.js +26 -9
  292. package/dist/service/sts/auth-z/assume-role-auth-z-coordinator.d.ts +9 -2
  293. package/dist/service/sts/auth-z/assume-role-auth-z-coordinator.js +2 -2
  294. package/dist/service/sts/auth-z/assume-role-source-account-auth-z.d.ts +10 -4
  295. package/dist/service/sts/auth-z/assume-role-source-account-auth-z.js +8 -7
  296. package/dist/service/sts/auth-z/assume-role-target-auth-z.d.ts +2 -2
  297. package/dist/service/sts/auth-z/assume-role-trust-policy-authorizer.d.ts +6 -2
  298. package/dist/service/sts/auth-z/assume-role-trust-policy-authorizer.js +14 -11
  299. package/dist/service/sts/command/assume-role/assume-role.handler.d.ts +10 -1
  300. package/dist/service/sts/command/assume-role/assume-role.handler.js +6 -2
  301. package/dist/service/sts/command/get-caller-identity/get-caller-identity.handler.d.ts +10 -1
  302. package/dist/service/sts/command/get-caller-identity/get-caller-identity.handler.js +5 -1
  303. package/dist/service/sts/service-role/sim-service-role.js +5 -1
  304. package/dist/service/sts/sim-sts.d.ts +18 -1
  305. package/dist/service/sts/sim-sts.js +8 -0
  306. package/dist/util/memo/bounded-memo.d.ts +36 -0
  307. package/dist/util/memo/bounded-memo.js +58 -0
  308. package/docs/README.md +54 -0
  309. package/docs/ai-skill/README.md +69 -0
  310. package/docs/cli/README.md +284 -0
  311. package/docs/factories/README.md +140 -0
  312. package/docs/lint/README.md +176 -0
  313. package/docs/non-aws-dependencies/README.md +261 -0
  314. package/docs/sdk/README.md +274 -0
  315. package/docs/serve/README.md +1126 -0
  316. package/docs/services/acm/README.md +823 -0
  317. package/docs/services/apigateway/README.md +1919 -0
  318. package/docs/services/apigatewayv2/README.md +2678 -0
  319. package/docs/services/athena/README.md +1044 -0
  320. package/docs/services/bedrock/README.md +350 -0
  321. package/docs/services/cloudformation/README.md +3625 -0
  322. package/docs/services/cloudfront/README.md +3098 -0
  323. package/docs/services/cloudwatch/README.md +422 -0
  324. package/docs/services/cognito/README.md +4924 -0
  325. package/docs/services/dynamodb/README.md +3785 -0
  326. package/docs/services/ecr/README.md +302 -0
  327. package/docs/services/ecs/README.md +2021 -0
  328. package/docs/services/elbv2/README.md +1901 -0
  329. package/docs/services/eventbridge/README.md +1118 -0
  330. package/docs/services/firehose/README.md +811 -0
  331. package/docs/services/glue/README.md +507 -0
  332. package/docs/services/iam/README.md +1578 -0
  333. package/docs/services/kinesis/README.md +455 -0
  334. package/docs/services/kms/README.md +664 -0
  335. package/docs/services/lambda/README.md +3719 -0
  336. package/docs/services/logs/README.md +882 -0
  337. package/docs/services/organizations/README.md +574 -0
  338. package/docs/services/personalize/README.md +835 -0
  339. package/docs/services/rekognition/README.md +1070 -0
  340. package/docs/services/route53/README.md +1783 -0
  341. package/docs/services/s3/README.md +3029 -0
  342. package/docs/services/scheduler/README.md +814 -0
  343. package/docs/services/secretsmanager/README.md +670 -0
  344. package/docs/services/ses/README.md +1013 -0
  345. package/docs/services/sns/README.md +1904 -0
  346. package/docs/services/sqs/README.md +1185 -0
  347. package/docs/services/ssm/README.md +1096 -0
  348. package/docs/services/stepfunctions/README.md +1341 -0
  349. package/docs/services/sts/README.md +245 -0
  350. package/docs/services/wafv2/README.md +1380 -0
  351. package/docs/terraform/README.md +248 -0
  352. package/docs/time/README.md +284 -0
  353. package/llms.txt +59 -0
  354. package/package.json +7 -4
  355. package/dist/service/stepfunctions/command/machine/sim-state-machine-writes.d.ts +0 -25
@@ -0,0 +1,574 @@
1
+ # Simulated Organizations
2
+
3
+ Yulin simulates AWS Organizations service control policies. A test can find out that the
4
+ organization around an account forbids something before a deployment does.
5
+
6
+ A service control policy filters what an account's principals may do and grants nothing. Policies
7
+ attach to the organization root, to an organizational unit, or to one account, and an account
8
+ inherits every policy on the path down to it. Sim IAM evaluates them ahead of that account's
9
+ identity and resource policies. An SCP therefore applies to a CloudFormation deployment, an
10
+ intercepted SDK client, and a direct service call alike.
11
+
12
+ ## Attach a policy to an organizational unit
13
+
14
+ A policy is usually attached to an organizational unit rather than to one account, and every account
15
+ under that unit inherits it. Units nest, and the root sits above all of them.
16
+
17
+ ```typescript sim-organizations-organizational-unit
18
+ /**
19
+ * Inheriting a service control policy from an organizational unit.
20
+ */
21
+
22
+ import { SimAws } from "@kensio/yulin";
23
+
24
+ const simAws = new SimAws({ defaultAccountId: "123456789012" });
25
+ const organizations = simAws.organizations();
26
+
27
+ const workloads = organizations.createOrganizationalUnit("Workloads");
28
+ const production = organizations.createOrganizationalUnit(
29
+ "Production",
30
+ workloads,
31
+ );
32
+
33
+ organizations.moveAccount("123456789012", production);
34
+ organizations.attachServiceControlPolicy(workloads, {
35
+ Version: "2012-10-17",
36
+ Statement: { Effect: "Deny", Action: "s3:CreateBucket", Resource: "*" },
37
+ });
38
+
39
+ const decision = simAws.account("123456789012").iam().authorize({
40
+ action: "s3:CreateBucket",
41
+ resource: "arn:aws:s3:::reports-bucket",
42
+ });
43
+
44
+ console.log(decision.value); // "ExplicitDeny"
45
+ ```
46
+
47
+ The policy hangs two levels above the account and still reaches it. `createOrganizationalUnit` takes
48
+ a parent unit as its second argument, and leaves the unit under the root without one.
49
+ `organizations.root()` is the node above everything, and a policy attached there covers every
50
+ account in the organization.
51
+
52
+ ## Every level has to allow the action
53
+
54
+ An account is filtered by each node on the path from the root down to it, and each one has to allow
55
+ an action on its own. A root allowing S3 and a unit allowing DynamoDB leave an account beneath them
56
+ able to do neither.
57
+
58
+ ```typescript sim-organizations-every-level-allows
59
+ /**
60
+ * Each level of the organization allowing the action separately.
61
+ */
62
+
63
+ import { SimAws } from "@kensio/yulin";
64
+
65
+ const simAws = new SimAws({ defaultAccountId: "123456789012" });
66
+ const organizations = simAws.organizations();
67
+ const workloads = organizations.createOrganizationalUnit("Workloads");
68
+
69
+ organizations.moveAccount("123456789012", workloads);
70
+
71
+ organizations.detachFullAwsAccess(organizations.root());
72
+ organizations.attachServiceControlPolicy(organizations.root(), {
73
+ Version: "2012-10-17",
74
+ Statement: { Effect: "Allow", Action: "s3:*", Resource: "*" },
75
+ });
76
+
77
+ organizations.detachFullAwsAccess(workloads);
78
+ organizations.attachServiceControlPolicy(workloads, {
79
+ Version: "2012-10-17",
80
+ Statement: { Effect: "Allow", Action: "dynamodb:*", Resource: "*" },
81
+ });
82
+
83
+ const decision = simAws.account("123456789012").iam().authorize({
84
+ action: "s3:GetObject",
85
+ resource: "arn:aws:s3:::reports-bucket/summary.csv",
86
+ });
87
+
88
+ console.log(decision.value); // "ImplicitDeny"
89
+ console.log(decision.serviceControlPolicy.unallowedLevels); // [ "Workloads" ]
90
+ ```
91
+
92
+ `unallowedLevels` names the nodes that allowed nothing matching. That is the part of a real SCP
93
+ denial that takes longest to track down.
94
+
95
+ A `Deny` at any level ends the request whatever another level allows.
96
+
97
+ ## The management account
98
+
99
+ `setManagementAccount` names the account AWS exempts from every service control policy. That account
100
+ is decided by its identity and resource policies alone, whatever is attached above it.
101
+
102
+ ```typescript sim-organizations-management-account
103
+ /**
104
+ * Exempting the management account.
105
+ */
106
+
107
+ import { SimAws } from "@kensio/yulin";
108
+
109
+ const simAws = new SimAws({ defaultAccountId: "111111111111" });
110
+ const organizations = simAws.organizations();
111
+
112
+ organizations.attachServiceControlPolicy(organizations.root(), {
113
+ Version: "2012-10-17",
114
+ Statement: { Effect: "Deny", Action: "*", Resource: "*" },
115
+ });
116
+ organizations.setManagementAccount("111111111111");
117
+
118
+ const decision = simAws.account("111111111111").iam().authorize({
119
+ action: "s3:CreateBucket",
120
+ resource: "arn:aws:s3:::reports-bucket",
121
+ });
122
+
123
+ console.log(decision.isAllowed); // true
124
+ console.log(decision.serviceControlPolicy.isApplied); // false
125
+ ```
126
+
127
+ ## Attach a service control policy to an Account
128
+
129
+ A policy attached straight to an account applies to that account alone. An organization spans
130
+ accounts, so it belongs to the whole simulated environment and is reached as
131
+ `simAws.organizations()`, not from an account scope.
132
+
133
+ ```typescript sim-organizations-attach-scp
134
+ /**
135
+ * Denying an action with a simulated service control policy.
136
+ */
137
+
138
+ import { SimAws } from "@kensio/yulin";
139
+
140
+ const simAws = new SimAws({ defaultAccountId: "123456789012" });
141
+
142
+ simAws.organizations().attachServiceControlPolicy("123456789012", {
143
+ Version: "2012-10-17",
144
+ Statement: {
145
+ Sid: "DenyBucketCreation",
146
+ Effect: "Deny",
147
+ Action: "s3:CreateBucket",
148
+ Resource: "*",
149
+ },
150
+ });
151
+
152
+ const decision = simAws.account("123456789012").iam().authorize({
153
+ action: "s3:CreateBucket",
154
+ resource: "arn:aws:s3:::reports-bucket",
155
+ });
156
+
157
+ console.log(decision.value); // "ExplicitDeny"
158
+ console.log(decision.serviceControlPolicy.isDenied); // true
159
+ console.log(decision.serviceControlPolicy.denyStatements[0]?.Sid); // "DenyBucketCreation"
160
+ ```
161
+
162
+ The account also gets AWS's own `FullAWSAccess` policy, as it would in a real organization. One
163
+ `Deny` statement therefore denies that one action and leaves the rest of the account working.
164
+
165
+ An account with no policy attached to it stays outside the organization's reach, and its identity
166
+ and resource policies decide its requests as they did before.
167
+
168
+ ## Catch a deployment the policy denies
169
+
170
+ Sim CloudFormation creates each resource through the owning service's command handler, and that
171
+ handler authorizes. A deployment that names no principal is decided as the account root. An SCP
172
+ applies to a member account's root the same way AWS does.
173
+
174
+ ```typescript sim-organizations-scp-deployment
175
+ /**
176
+ * A CloudFormation Resource a service control policy denies.
177
+ */
178
+
179
+ import { SimAws } from "@kensio/yulin";
180
+
181
+ const simAws = new SimAws({ defaultAccountId: "123456789012" });
182
+
183
+ simAws.organizations().attachServiceControlPolicy("123456789012", {
184
+ Version: "2012-10-17",
185
+ Statement: { Effect: "Deny", Action: "s3:CreateBucket", Resource: "*" },
186
+ });
187
+
188
+ try {
189
+ const stack = await simAws.cloudFormation().deployTemplate({
190
+ stackName: "reports-stack",
191
+ template: {
192
+ Resources: {
193
+ ReportsBucket: {
194
+ Type: "AWS::S3::Bucket",
195
+ Properties: { BucketName: "reports-bucket" },
196
+ },
197
+ },
198
+ },
199
+ });
200
+
201
+ await stack.waitForDeployComplete();
202
+ } catch (error) {
203
+ // "... is not authorized to perform: s3:CreateBucket on resource:
204
+ // arn:aws:s3:::reports-bucket with an explicit deny in a service control policy"
205
+ console.log((error as Error).message);
206
+ }
207
+
208
+ const failed = simAws
209
+ .cloudFormation()
210
+ .getStackByName("reports-stack")
211
+ ?.getResource("ReportsBucket");
212
+
213
+ console.log(failed?.status); // "CREATE_FAILED"
214
+ ```
215
+
216
+ The resource is left `CREATE_FAILED` and the deployment rejects. A test asserting that a stack
217
+ deploys then fails on the policy, with the policy named in the message.
218
+
219
+ ## Name the principal a deployment runs as
220
+
221
+ An organization that denies its accounts' root principals is ordinary, and a deployment decided as
222
+ the root fails under one. `caller` says which principal the resources are created as, and a
223
+ statement conditioned on `aws:PrincipalArn` then has a deploy role to match against.
224
+
225
+ ```typescript sim-organizations-scp-deploy-role
226
+ /**
227
+ * A policy denying the account root, and a deployment that names a Role.
228
+ */
229
+
230
+ import { CreateRoleCommand, PutRolePolicyCommand } from "@aws-sdk/client-iam";
231
+ import { SimAws } from "@kensio/yulin";
232
+
233
+ const simAws = new SimAws({ defaultAccountId: "123456789012" });
234
+ const simIam = simAws.iam();
235
+
236
+ const roleCreation = await simIam.createRole(
237
+ new CreateRoleCommand({
238
+ RoleName: "cdk-deploy-role",
239
+ AssumeRolePolicyDocument: JSON.stringify({
240
+ Version: "2012-10-17",
241
+ Statement: {
242
+ Effect: "Allow",
243
+ Principal: { Service: "cloudformation.amazonaws.com" },
244
+ Action: "sts:AssumeRole",
245
+ },
246
+ }),
247
+ }),
248
+ );
249
+
250
+ await simIam.putRolePolicy(
251
+ new PutRolePolicyCommand({
252
+ RoleName: "cdk-deploy-role",
253
+ PolicyName: "Deploy",
254
+ PolicyDocument: JSON.stringify({
255
+ Version: "2012-10-17",
256
+ Statement: { Effect: "Allow", Action: "s3:*", Resource: "*" },
257
+ }),
258
+ }),
259
+ );
260
+
261
+ simAws.organizations().attachServiceControlPolicy("123456789012", {
262
+ Version: "2012-10-17",
263
+ Statement: {
264
+ Sid: "DenyRootPrincipal",
265
+ Effect: "Deny",
266
+ Action: "*",
267
+ Resource: "*",
268
+ Condition: { ArnLike: { "aws:PrincipalArn": "arn:aws:iam::*:root" } },
269
+ },
270
+ });
271
+
272
+ const stack = await simAws.cloudFormation().deployTemplate({
273
+ stackName: "reports-stack",
274
+ template: {
275
+ Resources: {
276
+ ReportsBucket: {
277
+ Type: "AWS::S3::Bucket",
278
+ Properties: { BucketName: "reports-bucket" },
279
+ },
280
+ },
281
+ },
282
+ caller: { kind: "arn", arn: roleCreation.Role.Arn },
283
+ });
284
+
285
+ console.log(stack.getResource("ReportsBucket")?.status); // "CREATE_COMPLETE"
286
+ ```
287
+
288
+ The Role is created before the policy is attached. Creating it afterwards is a call the policy
289
+ denies the root, and the account root is who a bare `createRole` runs as.
290
+
291
+ ## Name the caller the rest of a test reads as
292
+
293
+ A deployment names its own principal. Every other call in the test still names none, and each one is
294
+ the account root. Under a policy denying that root, a test reading back what a stack made is denied
295
+ on every read.
296
+
297
+ `defaultCaller` on `SimAws` says who those calls are. A test then reads the account as the person or
298
+ role that would really be looking at it, and an explicit `caller` still wins wherever one is given.
299
+
300
+ ```typescript sim-organizations-scp-default-caller
301
+ /**
302
+ * Reading an account whose organization denies its root principal.
303
+ */
304
+
305
+ import { CreateRoleCommand, PutRolePolicyCommand } from "@aws-sdk/client-iam";
306
+ import { SimAws } from "@kensio/yulin";
307
+
308
+ const administratorArn = "arn:aws:iam::123456789012:role/Administrator";
309
+
310
+ const simAws = new SimAws({
311
+ defaultAccountId: "123456789012",
312
+ defaultCaller: { kind: "arn", arn: administratorArn },
313
+ });
314
+
315
+ // The Role is created as the account root, because a simulation with a default
316
+ // caller attributes these two commands to a Role that has no policy yet.
317
+ const root = simAws.account().rootPrincipal;
318
+ const simIam = simAws.iam();
319
+
320
+ await simIam.createRole(
321
+ new CreateRoleCommand({
322
+ RoleName: "Administrator",
323
+ AssumeRolePolicyDocument: JSON.stringify({
324
+ Version: "2012-10-17",
325
+ Statement: {
326
+ Effect: "Allow",
327
+ Principal: { AWS: "arn:aws:iam::123456789012:root" },
328
+ Action: "sts:AssumeRole",
329
+ },
330
+ }),
331
+ }),
332
+ { caller: root },
333
+ );
334
+
335
+ await simIam.putRolePolicy(
336
+ new PutRolePolicyCommand({
337
+ RoleName: "Administrator",
338
+ PolicyName: "Administer",
339
+ PolicyDocument: JSON.stringify({
340
+ Version: "2012-10-17",
341
+ Statement: { Effect: "Allow", Action: "*", Resource: "*" },
342
+ }),
343
+ }),
344
+ { caller: root },
345
+ );
346
+
347
+ simAws.organizations().attachServiceControlPolicy("123456789012", {
348
+ Version: "2012-10-17",
349
+ Statement: {
350
+ Sid: "DenyRootPrincipal",
351
+ Effect: "Deny",
352
+ Action: "*",
353
+ Resource: "*",
354
+ Condition: { ArnLike: { "aws:PrincipalArn": "arn:aws:iam::*:root" } },
355
+ },
356
+ });
357
+
358
+ await simAws.ssm().putParameter({
359
+ input: { Name: "/reports/bucket", Type: "String", Value: "reports-bucket" },
360
+ });
361
+
362
+ const read = await simAws
363
+ .ssm()
364
+ .getParameter({ input: { Name: "/reports/bucket" } });
365
+
366
+ const identity = await simAws.sts().getCallerIdentity({});
367
+
368
+ console.log(read.Parameter?.Value); // "reports-bucket"
369
+ console.log(identity.Arn); // "arn:aws:iam::123456789012:role/Administrator"
370
+ ```
371
+
372
+ Setup runs before the policy is attached, for the same reason the deploy Role above does. The Role a
373
+ simulation reads as has to exist and hold a policy, and creating it is itself a call.
374
+
375
+ Naming a default caller says who an unattributed call comes from, and leaves the root's own identity
376
+ access where it was. A test about root behaviour names `simAws.account().rootPrincipal` and gets the
377
+ root. Under the policy above that call is denied, which is what the statement is written to do.
378
+
379
+ ## Write an allow list instead of a deny list
380
+
381
+ `detachFullAwsAccess` takes AWS's own policy off an account. What remains has to allow an action
382
+ for the account to be allowed it. That is an organization run as an allow list.
383
+
384
+ ```typescript sim-organizations-scp-allow-list
385
+ /**
386
+ * Allowing only what the attached policies name.
387
+ */
388
+
389
+ import { SimAws } from "@kensio/yulin";
390
+
391
+ const simAws = new SimAws({ defaultAccountId: "123456789012" });
392
+ const organizations = simAws.organizations();
393
+
394
+ organizations.detachFullAwsAccess("123456789012");
395
+ organizations.attachServiceControlPolicy("123456789012", {
396
+ Version: "2012-10-17",
397
+ Statement: { Effect: "Allow", Action: "dynamodb:*", Resource: "*" },
398
+ });
399
+
400
+ const decision = simAws.account("123456789012").iam().authorize({
401
+ action: "s3:GetObject",
402
+ resource: "arn:aws:s3:::reports-bucket/summary.csv",
403
+ });
404
+
405
+ console.log(decision.value); // "ImplicitDeny"
406
+ console.log(decision.denialReason);
407
+ // "because no service control policy allows the s3:GetObject action"
408
+ ```
409
+
410
+ An account root holds unrestricted access in sim IAM, and this denies it anyway. That is what an
411
+ SCP does in AWS, and it is why an allow list is worth writing in a test at all.
412
+
413
+ Detaching `FullAWSAccess` on its own leaves the account holding no policy, and every action is then
414
+ denied. AWS behaves the same way, and warns about it.
415
+
416
+ ## Deploy an organization from CloudFormation
417
+
418
+ A template's `AWS::Organizations::*` resources build the organization they describe, so a stack
419
+ already managing the org chart is the same one a test deploys.
420
+
421
+ ```typescript sim-organizations-cloudformation
422
+ /**
423
+ * Building an organization from a CloudFormation template.
424
+ */
425
+
426
+ import { SimAws } from "@kensio/yulin";
427
+
428
+ const simAws = new SimAws({ defaultAccountId: "123456789012" });
429
+
430
+ const stack = await simAws.cloudFormation().deployTemplate({
431
+ stackName: "org-stack",
432
+ template: {
433
+ Resources: {
434
+ Organization: { Type: "AWS::Organizations::Organization" },
435
+ Workloads: {
436
+ Type: "AWS::Organizations::OrganizationalUnit",
437
+ Properties: {
438
+ Name: "Workloads",
439
+ ParentId: { "Fn::GetAtt": ["Organization", "RootId"] },
440
+ },
441
+ },
442
+ DenyBucketCreation: {
443
+ Type: "AWS::Organizations::Policy",
444
+ Properties: {
445
+ Name: "DenyBucketCreation",
446
+ Type: "SERVICE_CONTROL_POLICY",
447
+ TargetIds: [{ Ref: "Workloads" }],
448
+ Content: {
449
+ Version: "2012-10-17",
450
+ Statement: [
451
+ { Effect: "Deny", Action: "s3:CreateBucket", Resource: "*" },
452
+ ],
453
+ },
454
+ },
455
+ },
456
+ },
457
+ Outputs: { WorkloadsId: { Value: { Ref: "Workloads" } } },
458
+ },
459
+ });
460
+
461
+ await stack.waitForDeployComplete();
462
+
463
+ simAws.organizations().moveAccount("123456789012", stack.output("WorkloadsId"));
464
+
465
+ const decision = simAws.account("123456789012").iam().authorize({
466
+ action: "s3:CreateBucket",
467
+ resource: "arn:aws:s3:::reports-bucket",
468
+ });
469
+
470
+ console.log(decision.value); // "ExplicitDeny"
471
+ ```
472
+
473
+ `Content` takes the policy document inline or as JSON text. `TargetIds` takes a list or a single
474
+ value, and each entry names the root, a unit, or an Account. A policy reaches every target it names
475
+ or none of them. A target this organization has never heard of fails the resource before anything is
476
+ attached.
477
+
478
+ A simulated environment has one organization from the start, so
479
+ `AWS::Organizations::Organization` records the one already there rather than making another. It is
480
+ worth declaring for `RootId`, which is what a unit hangs off.
481
+
482
+ `AWS::Organizations::Account` creates an Account with an id nobody chose, as AWS does. Read that id
483
+ back with `Ref` or `Fn::GetAtt AccountId`.
484
+
485
+ These are the properties read from each resource:
486
+
487
+ | Resource | Read | Recorded and skipped |
488
+ | ---------------------------------------- | -------------------------------------- | --------------------- |
489
+ | `AWS::Organizations::Organization` | `FeatureSet` | `FeatureSet` |
490
+ | `AWS::Organizations::OrganizationalUnit` | `Name`, `ParentId` | `Tags` |
491
+ | `AWS::Organizations::Account` | `AccountName`, `Email`, `ParentIds` | `Tags`, `RoleName` |
492
+ | `AWS::Organizations::Policy` | `Name`, `Type`, `Content`, `TargetIds` | `Tags`, `Description` |
493
+
494
+ Tearing the stack down takes its own policies off the nodes they were attached to, removes the
495
+ units, and takes any Account the stack created back out of the organization. A node holding
496
+ policies from more than one stack keeps the others. A unit that still holds something when it goes
497
+ hands what it holds to its parent, so every Account keeps a path to the root.
498
+
499
+ ## Reading a denial
500
+
501
+ An authorization decision reports the organization's verdict apart from the identity and resource
502
+ sides, through `decision.serviceControlPolicy`:
503
+
504
+ | Property | Meaning |
505
+ | ----------------- | ----------------------------------------------------------- |
506
+ | `isApplied` | Whether any service control policy applied to the request. |
507
+ | `isDenied` | Whether the attached policies denied it, either way. |
508
+ | `isExplicitDeny` | Whether a matching `Deny` statement denied it. |
509
+ | `isImplicitDeny` | Whether the attached policies produced no matching `Allow`. |
510
+ | `denyStatements` | The matching `Deny` statements. |
511
+ | `allowStatements` | The matching `Allow` statements. |
512
+
513
+ `decision.denialReason` carries the wording AWS puts on the `AccessDenied` message, and every
514
+ simulated service passes it through to the error it throws.
515
+
516
+ `simAws.organizations().serviceControlPoliciesFor(accountId)` returns the policies in force for an
517
+ account, in the order they were evaluated, including `FullAWSAccess` where it is still attached.
518
+
519
+ `serviceControlPolicySetFor(accountId).levels` keeps the policies grouped by the node they hang on,
520
+ root first. That grouping is what sim IAM evaluates.
521
+
522
+ The flattened list is empty in three cases that behave differently. An account that was never named
523
+ sits outside the organization and stays unrestricted. The management account is exempt and equally
524
+ unrestricted. An account left holding no policy is denied everything. `applies` separates the last
525
+ of those from the other two.
526
+ `serviceControlPolicySetFor(accountId).applies` tells the two apart, and so does
527
+ `decision.serviceControlPolicy.isApplied`.
528
+
529
+ ## Available functionality
530
+
531
+ Simulated Organizations supports:
532
+
533
+ - `createOrganizationalUnit`, creating a unit under the root or under another unit
534
+ - `moveAccount`, putting an Account under a unit or under the root
535
+ - `root`, the node above every Account in the organization
536
+ - `setManagementAccount`, exempting the Account AWS exempts
537
+ - `attachServiceControlPolicy`, attaching a policy document to the root, a unit, or an Account, and
538
+ answering with the id that takes it off again
539
+ - `detachServiceControlPolicy`, taking one policy off a node and leaving the rest
540
+ - `accountIds`, reading which Accounts the organization holds
541
+ - `detachFullAwsAccess`, turning a node's policies into an allow list
542
+ - `detachServiceControlPolicies`, taking every policy back off one node and leaving the rest alone
543
+ - `removeAccount`, taking an Account out of the organization
544
+ - `serviceControlPoliciesFor`, reading the policies in force for an Account
545
+ - `serviceControlPolicySetFor`, reading those policies along with whether any apply
546
+ - The AWS-managed `FullAWSAccess` policy, attached by default as it is in AWS
547
+ - Evaluation ahead of identity and resource policies, for every principal in the Account including
548
+ its root
549
+ - Inheritance down the root-to-Account path, with every level having to allow the action
550
+ - AWS-shaped `r-` and `ou-` node ids
551
+ - `Action`, `NotAction`, `Resource`, `NotResource` and `Condition` in an SCP statement
552
+ - The `ArnEquals`, `ArnLike`, `NumericLessThanEquals`, `StringEquals` and `StringLike` condition
553
+ operators, and their `ForAnyValue:` and `ForAllValues:` set forms
554
+ - The negated `ArnNotEquals`, `ArnNotLike`, `StringNotEquals` and `StringNotLike` operators and
555
+ their set forms, which a `Deny` statement exempting named roles hangs on `aws:PrincipalArn`
556
+ - `AccessDenied` messages naming the service control policy, as AWS words them
557
+ - Denial reporting through `decision.serviceControlPolicy`, naming the levels that allowed nothing
558
+ - The `AWS::Organizations::Organization`, `::OrganizationalUnit`, `::Account` and `::Policy`
559
+ CloudFormation resources, with `Ref` and `Fn::GetAtt`, and teardown
560
+
561
+ ## Limitations
562
+
563
+ | Limitation | Detail |
564
+ | --------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
565
+ | Management account | Named with `setManagementAccount`. An organization with none named exempts no Account. |
566
+ | Moving an Account | `moveAccount` places an Account and can move it again. Nothing records where it was before. |
567
+ | Service-linked roles | Evaluated like any other principal. AWS exempts a service-linked role from SCPs. |
568
+ | Other policy types | Resource control policies, declarative policies, tag policies, backup policies and AI services opt-out policies are not simulated. |
569
+ | The Organizations SDK | `CreatePolicy`, `AttachPolicy`, `ListAccounts` and the rest of the API are not handled. Policies are attached through the accessor. |
570
+ | CloudFormation | `AWS::Organizations::Organization`, `::OrganizationalUnit`, `::Account` and `::Policy` are not created from a template. |
571
+ | Organization condition keys | `aws:PrincipalOrgID` and `aws:PrincipalOrgPaths` are not populated. A condition naming either fails to match. |
572
+ | Service principals | A request whose caller is a service principal or anonymous belongs to no Account and is subject to no policy. |
573
+ | Condition operator coverage | The operators above are evaluated. Anything else fails closed and the statement holding it matches nothing. |
574
+ | HTTP API | Organizations is not served as an HTTP API by `serveSimAws`. |