@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,814 @@
1
+ # Simulated EventBridge Scheduler
2
+
3
+ Yulin includes a simulated Amazon EventBridge Scheduler for tests and local development. Schedules
4
+ are held in memory and every operation is authorized by simulated IAM. Scheduler-specific types are
5
+ imported from the `@kensio/yulin/scheduler` subpath.
6
+
7
+ Scheduler is a separate service from [EventBridge](https://yulinsim.dev/services/eventbridge/), not a corner of it. It has its
8
+ own SDK client, its own ARN shape, and its own way of reaching a target. A schedule assumes an IAM
9
+ execution role, where an EventBridge rule relies on a resource policy admitting a service principal.
10
+ A project using Scheduler cannot be tested against simulated EventBridge rules. That is why this
11
+ exists separately.
12
+
13
+ ## Creating a schedule
14
+
15
+ ```typescript sim-scheduler-create-schedule
16
+ /**
17
+ * Creating a schedule that invokes a function every night.
18
+ */
19
+
20
+ import {
21
+ CreateScheduleCommand,
22
+ GetScheduleCommand,
23
+ } from "@aws-sdk/client-scheduler";
24
+
25
+ import { SimAws } from "@kensio/yulin";
26
+
27
+ const simAws = new SimAws();
28
+ const scheduler = simAws.scheduler();
29
+
30
+ const created = await scheduler.createSchedule(
31
+ new CreateScheduleCommand({
32
+ Name: "nightly-report",
33
+ ScheduleExpression: "cron(0 2 * * ? *)",
34
+ FlexibleTimeWindow: { Mode: "OFF" },
35
+ Target: {
36
+ Arn: "arn:aws:lambda:us-east-1:888888888888:function:report",
37
+ RoleArn: "arn:aws:iam::888888888888:role/SchedulerRole",
38
+ },
39
+ }),
40
+ );
41
+
42
+ console.log(created.ScheduleArn);
43
+ // "arn:aws:scheduler:us-east-1:888888888888:schedule/default/nightly-report"
44
+
45
+ const described = await scheduler.getSchedule(
46
+ new GetScheduleCommand({ Name: "nightly-report" }),
47
+ );
48
+
49
+ console.log(described.ScheduleExpression); // "cron(0 2 * * ? *)"
50
+ ```
51
+
52
+ `FlexibleTimeWindow` and `Target` are both required, as AWS requires them, and a target carries both
53
+ an `Arn` and the `RoleArn` it is invoked as. A schedule ARN always names its group, even the
54
+ `default` one. An EventBridge rule ARN differs, showing the bus only when it is not the default. An
55
+ IAM policy naming a schedule needs the group in it, or it matches no schedule.
56
+
57
+ ## Writing the schedule expression
58
+
59
+ Three forms, and the same parser as an [EventBridge scheduled
60
+ rule](https://yulinsim.dev/services/eventbridge/#rules-that-fire-on-a-schedule) with two differences:
61
+
62
+ - `at(yyyy-mm-ddThh:mm:ss)` runs once, at that instant. The timezone is a separate setting on the
63
+ schedule, outside the expression, and a trailing `Z` is refused.
64
+ - `rate(<value> <unit>)` runs from when the schedule was created. The unit is `minute`, `hour` or
65
+ `day`, and Scheduler lets it disagree with its value. `rate(1 hours)` is an hour here and a
66
+ refusal on an EventBridge rule.
67
+ - `cron(<six fields>)` names absolute instants in UTC. Minutes, hours, day-of-month, month,
68
+ day-of-week and year, so every day at two in the morning is `cron(0 2 * * ? *)`. The day-of-month
69
+ and day-of-week fields cannot both say something. Whichever is not deciding the day is written
70
+ `?`.
71
+
72
+ ## Firing a schedule
73
+
74
+ A schedule fires on the simulation's clock. Advancing simulated time past a due
75
+ instant invokes the target. Leave time alone and the target is never invoked. A nightly job takes no
76
+ time at all to test.
77
+
78
+ ```typescript sim-scheduler-firing
79
+ /**
80
+ * A schedule invoking a function three times in three simulated hours.
81
+ */
82
+
83
+ import { CreateRoleCommand, PutRolePolicyCommand } from "@aws-sdk/client-iam";
84
+ import { CreateScheduleCommand } from "@aws-sdk/client-scheduler";
85
+
86
+ import { SimAws, SimFixedClock } from "@kensio/yulin";
87
+ import { makeLambdaZipFileInput } from "@kensio/yulin/lambda";
88
+
89
+ const simAws = new SimAws({
90
+ clock: new SimFixedClock(new Date("2026-07-26T09:00:00.000Z")),
91
+ });
92
+
93
+ const functionArn = "arn:aws:lambda:us-east-1:888888888888:function:report";
94
+ const runs: string[] = [];
95
+
96
+ await simAws.lambda().createFunction({
97
+ input: {
98
+ FunctionName: "report",
99
+ Role: "arn:aws:iam::888888888888:role/ReportRole",
100
+ Code: {
101
+ ZipFile: makeLambdaZipFileInput(() => {
102
+ runs.push("ran");
103
+ return { ok: true };
104
+ }),
105
+ },
106
+ },
107
+ });
108
+
109
+ // The execution role has to trust Scheduler, and be allowed to invoke.
110
+ await simAws.iam().createRole(
111
+ new CreateRoleCommand({
112
+ RoleName: "SchedulerRole",
113
+ AssumeRolePolicyDocument: JSON.stringify({
114
+ Version: "2012-10-17",
115
+ Statement: {
116
+ Effect: "Allow",
117
+ Principal: { Service: "scheduler.amazonaws.com" },
118
+ Action: "sts:AssumeRole",
119
+ },
120
+ }),
121
+ }),
122
+ );
123
+
124
+ await simAws.iam().putRolePolicy(
125
+ new PutRolePolicyCommand({
126
+ RoleName: "SchedulerRole",
127
+ PolicyName: "InvokeReport",
128
+ PolicyDocument: JSON.stringify({
129
+ Version: "2012-10-17",
130
+ Statement: {
131
+ Effect: "Allow",
132
+ Action: "lambda:InvokeFunction",
133
+ Resource: functionArn,
134
+ },
135
+ }),
136
+ }),
137
+ );
138
+
139
+ await simAws.scheduler().createSchedule(
140
+ new CreateScheduleCommand({
141
+ Name: "hourly-report",
142
+ ScheduleExpression: "rate(1 hour)",
143
+ FlexibleTimeWindow: { Mode: "OFF" },
144
+ Target: {
145
+ Arn: functionArn,
146
+ RoleArn: "arn:aws:iam::888888888888:role/SchedulerRole",
147
+ },
148
+ }),
149
+ );
150
+
151
+ await simAws.clock().advanceBy({ hours: 3 });
152
+
153
+ console.log(runs.length); // 3
154
+ ```
155
+
156
+ Firing is per due instant. Advancing an hour with a `rate(1 minute)` schedule
157
+ invokes the target sixty times, at sixty distinct simulated instants. `advanceBy(...)` returns once
158
+ every one of those invocations has settled, leaving the next line free to assert.
159
+
160
+ A target with an `Input` receives that text. One without receives an empty JSON object, which AWS
161
+ documents for a function with no payload. There is no envelope, since a schedule has no event of its
162
+ own to describe.
163
+
164
+ ### The execution role
165
+
166
+ This is the part that differs most from an [EventBridge rule](https://yulinsim.dev/services/eventbridge/), and the part that
167
+ most often goes wrong in a real account. A rule reaches its target as the `events.amazonaws.com`
168
+ service principal, and the target's own resource policy decides. A schedule assumes the `RoleArn` on
169
+ its target, and that role's policies decide. No resource policy on the target is involved at all.
170
+
171
+ Two things therefore have to be right, and they are fixed in different places:
172
+
173
+ - The role's **trust policy** has to let `scheduler.amazonaws.com` assume it. A role copied from an
174
+ EventBridge rule trusts `events.amazonaws.com` and fails here.
175
+ - A policy **on the role** has to allow the action on the target, being `lambda:InvokeFunction`,
176
+ `sqs:SendMessage`, `sns:Publish` or `ecs:RunTask`.
177
+
178
+ A trust policy may also carry the condition AWS recommends against the confused deputy problem. The
179
+ schedule's group ARN is supplied as `aws:SourceArn`, and the Account the schedule is in as
180
+ `aws:SourceAccount`. A role scoped to one schedule group is assumable by schedules in that group and
181
+ by nothing else. CDK writes that condition into the execution roles it generates for a schedule
182
+ target, so a role taken from a synthesized template works here unchanged.
183
+
184
+ When either is missing the target goes uninvoked and no error is thrown, exactly as on AWS, where the
185
+ failure goes to CloudWatch and nowhere the caller can see. `advanceBy(...)` still returns normally. A
186
+ test asserting on a failed invocation reads `deliveryFailures`:
187
+
188
+ ```typescript sim-scheduler-delivery-failures
189
+ /**
190
+ * Finding out why a schedule's target was never invoked.
191
+ */
192
+
193
+ import { CreateRoleCommand } from "@aws-sdk/client-iam";
194
+ import { CreateScheduleCommand } from "@aws-sdk/client-scheduler";
195
+
196
+ import { SimAws, SimFixedClock } from "@kensio/yulin";
197
+
198
+ const simAws = new SimAws({
199
+ clock: new SimFixedClock(new Date("2026-07-26T09:00:00.000Z")),
200
+ });
201
+
202
+ // A role that trusts EventBridge rules rather than Scheduler.
203
+ await simAws.iam().createRole(
204
+ new CreateRoleCommand({
205
+ RoleName: "SchedulerRole",
206
+ AssumeRolePolicyDocument: JSON.stringify({
207
+ Version: "2012-10-17",
208
+ Statement: {
209
+ Effect: "Allow",
210
+ Principal: { Service: "events.amazonaws.com" },
211
+ Action: "sts:AssumeRole",
212
+ },
213
+ }),
214
+ }),
215
+ );
216
+
217
+ await simAws.scheduler().createSchedule(
218
+ new CreateScheduleCommand({
219
+ Name: "hourly-report",
220
+ ScheduleExpression: "rate(1 hour)",
221
+ FlexibleTimeWindow: { Mode: "OFF" },
222
+ Target: {
223
+ Arn: "arn:aws:lambda:us-east-1:888888888888:function:report",
224
+ RoleArn: "arn:aws:iam::888888888888:role/SchedulerRole",
225
+ },
226
+ }),
227
+ );
228
+
229
+ await simAws.clock().advanceBy({ hours: 1 });
230
+
231
+ const [failure] = simAws.scheduler().deliveryFailures;
232
+
233
+ console.log(failure?.message);
234
+ // "The trust policy of arn:aws:iam::888888888888:role/SchedulerRole does not
235
+ // allow scheduler.amazonaws.com to assume it, ..."
236
+ ```
237
+
238
+ `JSON.stringify` on a failure carries the message alongside the schedule, the target, the role and
239
+ the instant it names.
240
+
241
+ ### One-time schedules and what happens after
242
+
243
+ An `at(...)` schedule fires once and then stops. By default it stays in the Account afterwards, which
244
+ surprises people who expected it to clean up. It keeps counting against the schedule quota and keeps
245
+ turning up in listings. `ActionAfterCompletion: "DELETE"` is what removes it, and after that
246
+ `GetSchedule` reports it gone.
247
+
248
+ A schedule that is disabled when its only instant passes has not completed, since nothing was
249
+ invoked. It is still there afterwards whatever `ActionAfterCompletion` says.
250
+
251
+ `State: "DISABLED"` stops a recurring schedule firing while it is off, and an `UpdateSchedule`
252
+ enabling it picks up from the next due instant. What it missed is never replayed. An update that
253
+ changes the expression reschedules from the new one.
254
+
255
+ ## Running an ECS task on a schedule
256
+
257
+ A target whose ARN names an ECS cluster runs a [simulated ECS](https://yulinsim.dev/services/ecs/) task, in place of being
258
+ invoked with a payload. That is the shape a nightly batch job usually has. A container runs, does
259
+ its work and stops.
260
+
261
+ ```typescript sim-scheduler-ecs-target
262
+ /**
263
+ * A schedule running an ECS task every night.
264
+ */
265
+
266
+ import {
267
+ CreateClusterCommand,
268
+ ListTasksCommand,
269
+ RegisterTaskDefinitionCommand,
270
+ } from "@aws-sdk/client-ecs";
271
+ import { CreateRoleCommand, PutRolePolicyCommand } from "@aws-sdk/client-iam";
272
+ import { CreateScheduleCommand } from "@aws-sdk/client-scheduler";
273
+
274
+ import { SimAws, SimFixedClock } from "@kensio/yulin";
275
+
276
+ const simAws = new SimAws({
277
+ clock: new SimFixedClock(new Date("2026-07-26T09:00:00.000Z")),
278
+ });
279
+ const ecs = simAws.ecs();
280
+ const imported: string[] = [];
281
+
282
+ await ecs.createCluster(new CreateClusterCommand({ clusterName: "orders" }));
283
+
284
+ ecs.bindContainer({
285
+ family: "nightly-import",
286
+ containerName: "app",
287
+ run: () => {
288
+ imported.push(process.env["IMPORT_MODE"] ?? "");
289
+ },
290
+ });
291
+
292
+ await ecs.registerTaskDefinition(
293
+ new RegisterTaskDefinitionCommand({
294
+ family: "nightly-import",
295
+ containerDefinitions: [{ name: "app", image: "nightly-import:1" }],
296
+ }),
297
+ );
298
+
299
+ // The schedule runs the task as this role, so the role trusts Scheduler and is
300
+ // allowed to run it.
301
+ await simAws.iam().createRole(
302
+ new CreateRoleCommand({
303
+ RoleName: "SchedulerRole",
304
+ AssumeRolePolicyDocument: JSON.stringify({
305
+ Version: "2012-10-17",
306
+ Statement: {
307
+ Effect: "Allow",
308
+ Principal: { Service: "scheduler.amazonaws.com" },
309
+ Action: "sts:AssumeRole",
310
+ },
311
+ }),
312
+ }),
313
+ );
314
+
315
+ await simAws.iam().putRolePolicy(
316
+ new PutRolePolicyCommand({
317
+ RoleName: "SchedulerRole",
318
+ PolicyName: "RunImport",
319
+ PolicyDocument: JSON.stringify({
320
+ Version: "2012-10-17",
321
+ Statement: { Effect: "Allow", Action: "ecs:RunTask", Resource: "*" },
322
+ }),
323
+ }),
324
+ );
325
+
326
+ await simAws.scheduler().createSchedule(
327
+ new CreateScheduleCommand({
328
+ Name: "nightly-import",
329
+ ScheduleExpression: "cron(0 2 * * ? *)",
330
+ FlexibleTimeWindow: { Mode: "OFF" },
331
+ Target: {
332
+ Arn: "arn:aws:ecs:us-east-1:888888888888:cluster/orders",
333
+ RoleArn: "arn:aws:iam::888888888888:role/SchedulerRole",
334
+ EcsParameters: {
335
+ TaskDefinitionArn: "nightly-import",
336
+ TaskCount: 1,
337
+ },
338
+ // An ECS target's Input is the task's overrides, since a task has
339
+ // nowhere to receive a payload.
340
+ Input: JSON.stringify({
341
+ containerOverrides: [
342
+ {
343
+ name: "app",
344
+ environment: [{ name: "IMPORT_MODE", value: "full" }],
345
+ },
346
+ ],
347
+ }),
348
+ },
349
+ }),
350
+ );
351
+
352
+ // Advancing past 02:00 fires the schedule and runs the task.
353
+ await simAws.clock().advanceBy({ hours: 24 });
354
+
355
+ console.log(imported); // ["full"]
356
+
357
+ const tasks = await ecs.listTasks(
358
+ new ListTasksCommand({ cluster: "orders", desiredStatus: "STOPPED" }),
359
+ );
360
+
361
+ console.log(tasks.taskArns?.length); // 1
362
+ ```
363
+
364
+ The target ARN names the cluster. An ARN naming anything else in ECS is refused when the schedule
365
+ is created. `EcsParameters` names the task definition, as a family, a `family:revision` or a full
366
+ ARN, and the same one `RunTask` would take.
367
+
368
+ An ECS target's `Input` is the task's overrides, since a task has nowhere to receive a payload. A
369
+ target with no `Input` runs the task with no overrides.
370
+ `EcsParameters` on a target whose ARN names anything else is refused, since it would do nothing.
371
+
372
+ [Simulated ECS](https://yulinsim.dev/services/ecs/) decides which containers actually run. A container
373
+ with a binding runs its handler, and a container without one is recorded as not simulated.
374
+ A target naming a task definition with nothing bound therefore records a task that never started,
375
+ and the schedule counts as invoked.
376
+
377
+ ## Updating and deleting
378
+
379
+ ```typescript sim-scheduler-update-schedule
380
+ /**
381
+ * An update replaces the whole schedule rather than merging into it.
382
+ */
383
+
384
+ import {
385
+ CreateScheduleCommand,
386
+ GetScheduleCommand,
387
+ UpdateScheduleCommand,
388
+ } from "@aws-sdk/client-scheduler";
389
+
390
+ import { SimAws } from "@kensio/yulin";
391
+
392
+ const simAws = new SimAws();
393
+ const scheduler = simAws.scheduler();
394
+ const target = {
395
+ Arn: "arn:aws:lambda:us-east-1:888888888888:function:report",
396
+ RoleArn: "arn:aws:iam::888888888888:role/SchedulerRole",
397
+ };
398
+
399
+ await scheduler.createSchedule(
400
+ new CreateScheduleCommand({
401
+ Name: "nightly-report",
402
+ Description: "The nightly reconciliation",
403
+ ScheduleExpression: "cron(0 2 * * ? *)",
404
+ FlexibleTimeWindow: { Mode: "OFF" },
405
+ Target: target,
406
+ }),
407
+ );
408
+
409
+ // Meaning only to change the expression, and leaving the description out.
410
+ await scheduler.updateSchedule(
411
+ new UpdateScheduleCommand({
412
+ Name: "nightly-report",
413
+ ScheduleExpression: "rate(30 minutes)",
414
+ FlexibleTimeWindow: { Mode: "OFF" },
415
+ Target: target,
416
+ }),
417
+ );
418
+
419
+ const described = await scheduler.getSchedule(
420
+ new GetScheduleCommand({ Name: "nightly-report" }),
421
+ );
422
+
423
+ console.log(described.ScheduleExpression); // "rate(30 minutes)"
424
+ console.log(described.Description); // undefined, and not by accident
425
+ ```
426
+
427
+ `UpdateSchedule` carries the whole of a schedule, and anything an earlier request set and this one
428
+ leaves out is gone. That is real behaviour and a common surprise. The schedule has to exist.
429
+ Updating one that is absent raises `ResourceNotFoundException`. EventBridge's `PutRule` creates it.
430
+
431
+ `CreateSchedule` for a name that already exists raises `ConflictException`. A deployment running it
432
+ twice fails the second time here as it does on AWS. `DeleteSchedule` for a schedule that is absent
433
+ raises `ResourceNotFoundException`, where EventBridge's `DeleteRule` succeeds.
434
+
435
+ ## Listing schedules
436
+
437
+ `ListSchedules` reports the schedules of a group in creation order, narrowed by `NamePrefix` and
438
+ `State` and paged by `MaxResults` and `NextToken`.
439
+
440
+ A listing carries less than a describe, as it does on AWS. It has the target's ARN and no more of the target,
441
+ and no expression at all. Code reading `ScheduleExpression` off a listing gets
442
+ `undefined` from AWS, and gets `undefined` here too.
443
+
444
+ ## Schedule groups
445
+
446
+ Every account and region starts with a `default` group. A schedule naming no group goes in it.
447
+
448
+ A schedule's name is unique within its group, and the group is in the schedule's ARN. Two
449
+ deployments of one construct into the same account and region collide on schedule names unless each
450
+ one brings its own group.
451
+
452
+ ```typescript sim-scheduler-schedule-group
453
+ /**
454
+ * A schedule group scoping the names of one deployment's schedules.
455
+ */
456
+
457
+ import {
458
+ CreateScheduleCommand,
459
+ CreateScheduleGroupCommand,
460
+ ListSchedulesCommand,
461
+ } from "@aws-sdk/client-scheduler";
462
+
463
+ import { SimAws } from "@kensio/yulin";
464
+
465
+ const simAws = new SimAws();
466
+ const scheduler = simAws.scheduler();
467
+
468
+ const group = await scheduler.createScheduleGroup(
469
+ new CreateScheduleGroupCommand({ Name: "reporting-pr-412" }),
470
+ );
471
+
472
+ console.log(group.ScheduleGroupArn);
473
+ // "arn:aws:scheduler:us-east-1:888888888888:schedule-group/reporting-pr-412"
474
+
475
+ const created = await scheduler.createSchedule(
476
+ new CreateScheduleCommand({
477
+ Name: "pageviews-hourly",
478
+ GroupName: "reporting-pr-412",
479
+ ScheduleExpression: "rate(1 hour)",
480
+ FlexibleTimeWindow: { Mode: "OFF" },
481
+ Target: {
482
+ Arn: "arn:aws:lambda:us-east-1:888888888888:function:report",
483
+ RoleArn: "arn:aws:iam::888888888888:role/SchedulerRole",
484
+ },
485
+ }),
486
+ );
487
+
488
+ // The group is in the schedule's ARN. The same schedule name is free in every
489
+ // other group, including default.
490
+ console.log(created.ScheduleArn);
491
+ // ".../schedule/reporting-pr-412/pageviews-hourly"
492
+
493
+ const listed = await scheduler.listSchedules(
494
+ new ListSchedulesCommand({ GroupName: "reporting-pr-412" }),
495
+ );
496
+
497
+ console.log(listed.Schedules?.length); // 1
498
+ ```
499
+
500
+ A `GroupName` for a group that has yet to be created raises `ResourceNotFoundException`, and so
501
+ does a listing for one. Real Scheduler answers the same way. A schedule quietly moved into `default`
502
+ would carry an ARN naming a group it had never been put in.
503
+
504
+ `GetScheduleGroup` reports a group's ARN, state and timestamps. `ListScheduleGroups` reports them
505
+ all in creation order, narrowed by `NamePrefix` and paged by `MaxResults` and `NextToken`.
506
+
507
+ `DeleteScheduleGroup` deletes the schedules in the group along with it, as AWS does. It refuses the
508
+ `default` group, which comes with the account. Losing that group would leave every request naming
509
+ no group with nowhere to go.
510
+
511
+ ## Permissions
512
+
513
+ Every operation is authorized against the schedule ARN, which carries the group. A Create or an
514
+ Update also hands Scheduler the `Target.RoleArn` the schedule fires as, and authorizes `iam:PassRole`
515
+ against that Role. See [passing a Role to a service](https://yulinsim.dev/services/iam/#passing-a-role-to-a-service)
516
+ in the IAM docs.
517
+
518
+ The schedule ARN is what an operation authorizes against:
519
+
520
+ ```typescript sim-scheduler-iam-policy
521
+ /**
522
+ * A Role allowed to manage one schedule and no other.
523
+ */
524
+
525
+ import { CreateRoleCommand, PutRolePolicyCommand } from "@aws-sdk/client-iam";
526
+ import { CreateScheduleCommand } from "@aws-sdk/client-scheduler";
527
+
528
+ import { SimAws } from "@kensio/yulin";
529
+
530
+ const simAws = new SimAws();
531
+
532
+ const role = await simAws.iam().createRole(
533
+ new CreateRoleCommand({
534
+ RoleName: "ScheduleAdministrator",
535
+ AssumeRolePolicyDocument: JSON.stringify({
536
+ Version: "2012-10-17",
537
+ Statement: {
538
+ Effect: "Allow",
539
+ Principal: { AWS: "arn:aws:iam::888888888888:root" },
540
+ Action: "sts:AssumeRole",
541
+ },
542
+ }),
543
+ }),
544
+ );
545
+
546
+ await simAws.iam().putRolePolicy(
547
+ new PutRolePolicyCommand({
548
+ RoleName: "ScheduleAdministrator",
549
+ PolicyName: "ManageNightlyReport",
550
+ PolicyDocument: JSON.stringify({
551
+ Version: "2012-10-17",
552
+ Statement: {
553
+ Effect: "Allow",
554
+ Action: "scheduler:CreateSchedule",
555
+ // The group is part of the ARN, so a policy without it matches nothing.
556
+ Resource:
557
+ "arn:aws:scheduler:us-east-1:888888888888:schedule/default/nightly-report",
558
+ },
559
+ }),
560
+ }),
561
+ );
562
+
563
+ const created = await simAws.scheduler().createSchedule(
564
+ new CreateScheduleCommand({
565
+ Name: "nightly-report",
566
+ ScheduleExpression: "rate(1 hour)",
567
+ FlexibleTimeWindow: { Mode: "OFF" },
568
+ Target: {
569
+ Arn: "arn:aws:lambda:us-east-1:888888888888:function:report",
570
+ RoleArn: "arn:aws:iam::888888888888:role/SchedulerRole",
571
+ },
572
+ }),
573
+ { caller: { kind: "arn", arn: role.Role.Arn } },
574
+ );
575
+
576
+ console.log(created.ScheduleArn !== undefined); // true
577
+ ```
578
+
579
+ `ListSchedules` names no schedule. IAM evaluates it against `*`, and only a policy whose `Resource`
580
+ is `*` allows it. A policy naming a schedule ARN allows no listing, here as on AWS.
581
+
582
+ That is the caller's own permission to manage schedules, and it is a separate question from whether a
583
+ schedule's execution role may invoke its target. The second is asked when the schedule fires,
584
+ against the `RoleArn` on the target.
585
+
586
+ ## Deploying from a CloudFormation template
587
+
588
+ `AWS::Scheduler::Schedule` deploys through [simulated CloudFormation](https://yulinsim.dev/services/cloudformation/). A stack
589
+ that declares its schedules can be exercised end to end, with no SDK calls of its own. Everything the
590
+ Resource carries lines up with `CreateSchedule`, and a target ARN or execution role resolved by
591
+ `Fn::GetAtt` from the same template works as it would in a real deployment.
592
+
593
+ ```typescript sim-scheduler-cloudformation
594
+ /**
595
+ * A schedule deployed from a template, firing as simulated time advances.
596
+ */
597
+
598
+ import { CreateRoleCommand, PutRolePolicyCommand } from "@aws-sdk/client-iam";
599
+ import { ReceiveMessageCommand } from "@aws-sdk/client-sqs";
600
+
601
+ import { SimAws, SimFixedClock } from "@kensio/yulin";
602
+
603
+ const simAws = new SimAws({
604
+ clock: new SimFixedClock(new Date("2026-07-26T09:00:00.000Z")),
605
+ });
606
+
607
+ const queueArn = "arn:aws:sqs:us-east-1:888888888888:reports";
608
+ const roleArn = "arn:aws:iam::888888888888:role/SchedulerRole";
609
+
610
+ // The execution role has to trust Scheduler, and be allowed to send.
611
+ await simAws.iam().createRole(
612
+ new CreateRoleCommand({
613
+ RoleName: "SchedulerRole",
614
+ AssumeRolePolicyDocument: JSON.stringify({
615
+ Version: "2012-10-17",
616
+ Statement: {
617
+ Effect: "Allow",
618
+ Principal: { Service: "scheduler.amazonaws.com" },
619
+ Action: "sts:AssumeRole",
620
+ },
621
+ }),
622
+ }),
623
+ );
624
+
625
+ await simAws.iam().putRolePolicy(
626
+ new PutRolePolicyCommand({
627
+ RoleName: "SchedulerRole",
628
+ PolicyName: "SendReports",
629
+ PolicyDocument: JSON.stringify({
630
+ Version: "2012-10-17",
631
+ Statement: {
632
+ Effect: "Allow",
633
+ Action: "sqs:SendMessage",
634
+ Resource: queueArn,
635
+ },
636
+ }),
637
+ }),
638
+ );
639
+
640
+ const stack = await simAws.cloudFormation().deployTemplate({
641
+ stackName: "reporting-stack",
642
+ template: {
643
+ Resources: {
644
+ ReportQueue: {
645
+ Type: "AWS::SQS::Queue",
646
+ Properties: { QueueName: "reports" },
647
+ },
648
+ HourlyReport: {
649
+ Type: "AWS::Scheduler::Schedule",
650
+ Properties: {
651
+ Name: "hourly-report",
652
+ ScheduleExpression: "rate(1 hour)",
653
+ FlexibleTimeWindow: { Mode: "OFF" },
654
+ Target: {
655
+ Arn: { "Fn::GetAtt": ["ReportQueue", "Arn"] },
656
+ RoleArn: roleArn,
657
+ Input: JSON.stringify({ report: "hourly" }),
658
+ },
659
+ },
660
+ },
661
+ },
662
+ },
663
+ });
664
+
665
+ await stack.waitForDeployComplete();
666
+
667
+ // Three simulated hours on, the schedule has invoked its target three times.
668
+ await simAws.clock().advanceBy({ hours: 3 });
669
+
670
+ const received = await simAws.sqs().receiveMessage(
671
+ new ReceiveMessageCommand({
672
+ QueueUrl: "https://sqs.us-east-1.amazonaws.com/888888888888/reports",
673
+ MaxNumberOfMessages: 10,
674
+ }),
675
+ );
676
+
677
+ console.log(received.Messages?.length); // 3
678
+
679
+ // Nothing went wrong on the way, which is worth checking: a schedule that
680
+ // could not reach its target says so here rather than by throwing.
681
+ console.log(simAws.scheduler().deliveryFailures.length); // 0
682
+ ```
683
+
684
+ `Ref` returns the schedule's **name** and `Fn::GetAtt ... Arn` its ARN, which carries the schedule
685
+ group as it always does. A schedule the template leaves unnamed gets one generated from the stack
686
+ name, the logical ID and a tail derived from both, as
687
+ [the CloudFormation docs](https://yulinsim.dev/services/cloudformation/#names-cloudformation-generates "Names CloudFormation generates")
688
+ describe.
689
+
690
+ A property this simulation leaves out is refused at deploy time, naming the Resource. Deploying a
691
+ schedule that behaves differently from the one declared would be worse. Tearing the stack down
692
+ removes the schedules it created, and no schedule fires afterwards.
693
+
694
+ ### Deploying a schedule group
695
+
696
+ `AWS::Scheduler::ScheduleGroup` deploys too, so a stack can bring the group its schedules go in.
697
+
698
+ ```typescript sim-scheduler-cfn-schedule-group
699
+ /**
700
+ * A stack deploying its own schedule group, with a schedule in it.
701
+ */
702
+
703
+ import { SimAws } from "@kensio/yulin";
704
+
705
+ const simAws = new SimAws();
706
+
707
+ const stack = await simAws.cloudFormation().deployTemplate({
708
+ stackName: "reporting-stack",
709
+ template: {
710
+ Resources: {
711
+ ReportGroup: {
712
+ Type: "AWS::Scheduler::ScheduleGroup",
713
+ Properties: { Name: "reporting-pr-412" },
714
+ },
715
+ HourlyReport: {
716
+ Type: "AWS::Scheduler::Schedule",
717
+ Properties: {
718
+ Name: "pageviews-hourly",
719
+ GroupName: { Ref: "ReportGroup" },
720
+ ScheduleExpression: "rate(1 hour)",
721
+ FlexibleTimeWindow: { Mode: "OFF" },
722
+ Target: {
723
+ Arn: "arn:aws:sqs:us-east-1:888888888888:reports",
724
+ RoleArn: "arn:aws:iam::888888888888:role/SchedulerRole",
725
+ },
726
+ },
727
+ },
728
+ },
729
+ Outputs: {
730
+ GroupArn: { Value: { "Fn::GetAtt": ["ReportGroup", "Arn"] } },
731
+ },
732
+ },
733
+ });
734
+
735
+ await stack.waitForDeployComplete();
736
+
737
+ // An identity policy granting `scheduler:` actions on the group names this
738
+ // ARN. So does the `aws:SourceArn` condition AWS recommends in a schedule
739
+ // execution role's trust policy, which the simulation does not supply.
740
+ console.log(stack.output("GroupArn"));
741
+ // "arn:aws:scheduler:us-east-1:888888888888:schedule-group/reporting-pr-412"
742
+ ```
743
+
744
+ `Ref` returns the group's **name** and `Fn::GetAtt` answers `Arn`, `State`, `CreationDate` and
745
+ `LastModificationDate`. A group the template leaves unnamed gets one generated from the stack name,
746
+ the logical ID and a tail derived from both, as a schedule does.
747
+
748
+ `Tags` on a group are recorded as an ignored property and the group deploys without them. The CDK
749
+ puts a stack's tags on every taggable Resource in it, so a template gains them without asking.
750
+ Failing the whole stack over a tag would refuse a deployment for a property the simulation ignores
751
+ anyway. Read the record back from `stack.getResource("<logicalId>")?.ignoredProperties`.
752
+
753
+ Tearing the stack down removes the group. Its schedules go with it, whether or not they are
754
+ Resources of the same stack.
755
+
756
+ ## Available functionality
757
+
758
+ - `CreateSchedule`, `GetSchedule`, `UpdateSchedule`, `DeleteSchedule` and `ListSchedules`.
759
+ - `at(...)`, `rate(...)` and six-field `cron(...)` expressions, fired by advancing the simulation's
760
+ clock.
761
+ - Lambda, SQS and SNS targets, with a target `Input`, invoked as the target's execution role and
762
+ authorized against that role's own policies.
763
+ - ECS targets, running a simulated task as the execution role, with the task definition and
764
+ `TaskCount` from `EcsParameters` and container overrides from the target's `Input`.
765
+ - `ActionAfterCompletion`, and `deliveryFailures` for invocations that did not happen.
766
+ - `CreateScheduleGroup`, `GetScheduleGroup`, `DeleteScheduleGroup` and `ListScheduleGroups`, over
767
+ the `default` group every account and region starts with and any group created beside it.
768
+ - `AWS::Scheduler::Schedule` and `AWS::Scheduler::ScheduleGroup` deployed from a CloudFormation
769
+ template.
770
+ - Creation and modification timestamps from the simulation's clock, and prefix-narrowed,
771
+ state-narrowed, paged listings.
772
+ - IAM authorization against the schedule ARN.
773
+ - `iam:PassRole` authorization of the `Target.RoleArn` a Create or an Update hands over.
774
+ - SDK interception of `SchedulerClient`.
775
+
776
+ ## Limitations
777
+
778
+ - A schedule only fires while a test advances the simulation's clock. The host's clock drives none
779
+ of it, and a simulation left alone in real time never fires however long it is left.
780
+ - Firing is exact and exactly once. Real Scheduler invokes within a minute of the due time, and its
781
+ promise is at-least-once.
782
+ - An invocation is attempted once. There is no retry and no dead letter queue. A target that throws
783
+ is recorded as a failure, and never redelivered. A failed invocation never rejects
784
+ `advanceBy(...)`, and is read from `deliveryFailures`.
785
+ - A schedule group carries no tags. `CreateScheduleGroup` refuses `Tags`, since the simulation
786
+ stores them nowhere. A template's `Tags` are recorded as an ignored property and the group still
787
+ deploys.
788
+ - A schedule group is `ACTIVE` or gone. Deleting one removes its schedules in the same call, where
789
+ real Scheduler holds the group in `DELETING` until they have gone.
790
+ - The `default` schedule group cannot be deleted. AWS leaves the answer to that request
791
+ undocumented.
792
+ - `FlexibleTimeWindow` with `Mode: "FLEXIBLE"` is refused. Real Scheduler invokes the target at an
793
+ unpredictable moment inside the window, and firing at the exact due time instead would let a test
794
+ rely on timing AWS leaves unpromised.
795
+ - `ScheduleExpressionTimezone` other than `UTC` is refused outright, since running a schedule in the
796
+ wrong zone fires it at the wrong hour.
797
+ - `StartDate` and `EndDate` are refused outright.
798
+ - Targets are Lambda, SQS, SNS and ECS. The universal target
799
+ (`arn:aws:scheduler:::aws-sdk:<service>:<action>`) and every other target service are refused when
800
+ the schedule is created, ahead of the first due instant.
801
+ - A target `DeadLetterConfig`, `RetryPolicy`, `EventBridgeParameters`, `KinesisParameters`,
802
+ `SageMakerPipelineParameters` and `SqsParameters` are refused outright, as is `EcsParameters` on a
803
+ target whose ARN names something other than an ECS cluster.
804
+ - An ECS target's `EcsParameters` takes `TaskDefinitionArn` and `TaskCount`, and takes and ignores
805
+ `LaunchType`, `PlatformVersion`, `NetworkConfiguration` and `CapacityProviderStrategy`, since
806
+ there is no placement and no network here for them to apply to. Anything else it can carry, such
807
+ as `Group`, `Tags` or `PropagateTags`, is refused outright.
808
+ - An ECS target's `Input` is read as the task's overrides. A `containerOverrides` list is how a
809
+ schedule sets a container's environment. An `Input` that is anything but a JSON object is refused
810
+ on an ECS target, where every other target type takes any text.
811
+ - A `TaskCount` above one runs that many simulated tasks, and a bound container handler runs once
812
+ for each of them, in this process and one after another.
813
+ - `KmsKeyArn` is refused, and `ClientToken` is accepted and ignored. Nothing here retries, so it has
814
+ no request to make idempotent.