@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,882 @@
1
+ # Simulated CloudWatch Logs
2
+
3
+ Yulin includes a simulated Amazon CloudWatch Logs for tests and local development. It holds log
4
+ groups, the streams inside them and the events written to those streams. A test can put log events
5
+ and read them back with `GetLogEvents`, or search them with `FilterLogEvents`, without an AWS
6
+ account.
7
+
8
+ The point of it is to make log data addressable. Code that writes to CloudWatch Logs is code teams
9
+ already have, and the alternative for a test is capturing process output.
10
+
11
+ CloudWatch Logs specific types are imported from the `@kensio/yulin/logs` subpath.
12
+
13
+ ## Writing and searching log events
14
+
15
+ A log group holds streams, a stream holds events, and `FilterLogEvents` searches across every
16
+ stream in a group. A test can therefore name the group and leave the stream out, without knowing
17
+ which execution environment wrote the line.
18
+
19
+ ```typescript sim-logs-write-and-search
20
+ /**
21
+ * Writing log events to a simulated log group and searching for one.
22
+ */
23
+
24
+ import {
25
+ CreateLogGroupCommand,
26
+ CreateLogStreamCommand,
27
+ FilterLogEventsCommand,
28
+ PutLogEventsCommand,
29
+ } from "@aws-sdk/client-cloudwatch-logs";
30
+
31
+ import { SimAws } from "@kensio/yulin";
32
+
33
+ const simAws = new SimAws();
34
+ const logs = simAws.logs();
35
+
36
+ const logGroupName = "/aws/lambda/orders";
37
+ const logStreamName = "2026/08/16/[$LATEST]0f7c1a";
38
+
39
+ await logs.createLogGroup(new CreateLogGroupCommand({ logGroupName }));
40
+ await logs.createLogStream(
41
+ new CreateLogStreamCommand({ logGroupName, logStreamName }),
42
+ );
43
+
44
+ await logs.putLogEvents(
45
+ new PutLogEventsCommand({
46
+ logGroupName,
47
+ logStreamName,
48
+ logEvents: [
49
+ {
50
+ timestamp: Date.parse("2026-08-16T09:00:00Z"),
51
+ message: "INFO handling order-1",
52
+ },
53
+ {
54
+ timestamp: Date.parse("2026-08-16T09:00:01Z"),
55
+ message: "ERROR order has no items",
56
+ },
57
+ ],
58
+ }),
59
+ );
60
+
61
+ const found = await logs.filterLogEvents(
62
+ new FilterLogEventsCommand({ logGroupName, filterPattern: "ERROR" }),
63
+ );
64
+
65
+ // One event, from the stream that wrote it.
66
+ console.log(found.events?.length, found.events?.[0]?.logStreamName);
67
+ ```
68
+
69
+ A write needs both the group and the stream to exist already. Real CloudWatch Logs refuses a write
70
+ to either one that is absent. A missing `logs:CreateLogStream` permission therefore shows up as a failure, where
71
+ otherwise the logs would quietly never appear.
72
+
73
+ ## Filter patterns
74
+
75
+ The plain text filter pattern syntax is supported. Terms are matched as case sensitive substrings,
76
+ every unprefixed term must appear, a `-` prefix excludes a term, a `?` prefix makes a term one of a
77
+ set of alternatives, and a quoted phrase matches with its spaces intact.
78
+
79
+ | Pattern | Matches |
80
+ | ---------------------- | ------------------------------------------------ |
81
+ | `ERROR` | messages containing `ERROR` |
82
+ | `ERROR orders` | messages containing both terms |
83
+ | `?ERROR ?WARN` | messages containing either term |
84
+ | `ERROR -Throttling` | messages containing `ERROR` but not `Throttling` |
85
+ | `"order has no items"` | messages containing that exact phrase |
86
+
87
+ An omitted or empty pattern matches everything.
88
+
89
+ The structured pattern syntaxes are refused. A JSON property pattern (`{ $.level = "ERROR" }`), a
90
+ space delimited field pattern (`[level=ERROR, message]`) and a regular expression term
91
+ (`%ERROR|WARN%`) each raise `SimLogsUnsupportedOperationException`. Approximating one would be
92
+ worse. A pattern quietly treated as matching everything would turn an assertion about one log line
93
+ into an assertion about any log line at all, and the test would keep passing while testing nothing.
94
+
95
+ ## Reading one stream
96
+
97
+ `GetLogEvents` reads a single stream and pages in both directions. With no token it answers with
98
+ the newest events, as real CloudWatch Logs does. `startFromHead` starts at the oldest. Following
99
+ `nextForwardToken` walks towards newer events, and reaching the end gives the same token back. A
100
+ caller polling a stream keeps it and asks again.
101
+
102
+ Both readers narrow to a half open time window. An event whose timestamp equals `startTime` is
103
+ included, and one whose timestamp equals `endTime` is left out.
104
+
105
+ A token is an offset into the events the request selected, so keep `startTime` and `endTime` the
106
+ same across a walk. Changing the window part-way through counts the offset against a different set
107
+ of events, and the page comes back as a different page.
108
+
109
+ ```typescript sim-logs-read-a-stream
110
+ /**
111
+ * Paging through one simulated log stream from the oldest event.
112
+ */
113
+
114
+ import {
115
+ CreateLogGroupCommand,
116
+ CreateLogStreamCommand,
117
+ GetLogEventsCommand,
118
+ PutLogEventsCommand,
119
+ } from "@aws-sdk/client-cloudwatch-logs";
120
+
121
+ import { SimAws } from "@kensio/yulin";
122
+
123
+ const simAws = new SimAws();
124
+ const logs = simAws.logs();
125
+
126
+ const logGroupName = "/aws/lambda/orders";
127
+ const logStreamName = "2026/08/16/[$LATEST]0f7c1a";
128
+
129
+ await logs.createLogGroup(new CreateLogGroupCommand({ logGroupName }));
130
+ await logs.createLogStream(
131
+ new CreateLogStreamCommand({ logGroupName, logStreamName }),
132
+ );
133
+ await logs.putLogEvents(
134
+ new PutLogEventsCommand({
135
+ logGroupName,
136
+ logStreamName,
137
+ logEvents: [1, 2, 3, 4, 5].map((second) => ({
138
+ timestamp: Date.parse("2026-08-16T09:00:00Z") + second * 1000,
139
+ message: `line ${second}`,
140
+ })),
141
+ }),
142
+ );
143
+
144
+ let nextToken: string | undefined;
145
+ const read: string[] = [];
146
+
147
+ for (;;) {
148
+ const page = await logs.getLogEvents(
149
+ new GetLogEventsCommand({
150
+ logGroupName,
151
+ logStreamName,
152
+ startFromHead: true,
153
+ limit: 2,
154
+ nextToken,
155
+ }),
156
+ );
157
+
158
+ if (page.events === undefined || page.events.length === 0) break;
159
+
160
+ read.push(...page.events.map((event) => event.message));
161
+ nextToken = page.nextForwardToken;
162
+ }
163
+
164
+ console.log(read);
165
+ ```
166
+
167
+ ## Retention
168
+
169
+ Retention is held as a property to assert on. Events stay where they are, and seeing one go would
170
+ mean moving the clock by months. What teams get wrong about retention is the value they deployed,
171
+ ahead of the deletion that eventually follows from it. A log group with no retention keeps its
172
+ events forever, the AWS default.
173
+
174
+ The accepted values are a fixed set. A reasonable-looking `retentionInDays: 10` is refused here
175
+ exactly as it is by an account.
176
+
177
+ ```typescript sim-logs-retention
178
+ /**
179
+ * Asserting on the retention a simulated log group was given.
180
+ */
181
+
182
+ import {
183
+ CreateLogGroupCommand,
184
+ DescribeLogGroupsCommand,
185
+ PutRetentionPolicyCommand,
186
+ } from "@aws-sdk/client-cloudwatch-logs";
187
+
188
+ import { SimAws } from "@kensio/yulin";
189
+
190
+ const simAws = new SimAws();
191
+ const logs = simAws.logs();
192
+
193
+ const logGroupName = "/aws/lambda/orders";
194
+
195
+ await logs.createLogGroup(new CreateLogGroupCommand({ logGroupName }));
196
+ await logs.putRetentionPolicy(
197
+ new PutRetentionPolicyCommand({ logGroupName, retentionInDays: 14 }),
198
+ );
199
+
200
+ const described = await logs.describeLogGroups(
201
+ new DescribeLogGroupsCommand({ logGroupNamePrefix: "/aws/lambda/" }),
202
+ );
203
+
204
+ // 14, and the ARN form a policy is written against.
205
+ console.log(
206
+ described.logGroups?.[0]?.retentionInDays,
207
+ described.logGroups?.[0]?.arn,
208
+ );
209
+ ```
210
+
211
+ ## Lambda handler output
212
+
213
+ A Lambda function's output is recorded into `/aws/lambda/<function name>` as it runs, whether its
214
+ code is a zip archive or a real in-process handler. A test can then assert on what a handler logged
215
+ by searching its log group.
216
+
217
+ ```typescript sim-logs-lambda-output
218
+ /**
219
+ * Asserting on what a simulated Lambda handler logged.
220
+ */
221
+
222
+ import { FilterLogEventsCommand } from "@aws-sdk/client-cloudwatch-logs";
223
+ import { CreateFunctionCommand, InvokeCommand } from "@aws-sdk/client-lambda";
224
+
225
+ import { SimAws } from "@kensio/yulin";
226
+ import { makeLambdaCodeZip } from "@kensio/yulin/lambda";
227
+
228
+ const simAws = new SimAws();
229
+
230
+ await simAws.lambda().createFunction(
231
+ new CreateFunctionCommand({
232
+ FunctionName: "orders",
233
+ Role: `arn:aws:iam::${simAws.defaultAccountId}:role/OrdersRole`,
234
+ Handler: "index.handler",
235
+ Code: {
236
+ ZipFile: makeLambdaCodeZip({
237
+ "index.js":
238
+ "exports.handler = async () => {\n" +
239
+ ' console.error("ERROR order has no items");\n' +
240
+ "};\n",
241
+ }),
242
+ },
243
+ }),
244
+ );
245
+
246
+ await simAws.backgroundTasksComplete();
247
+ await simAws.lambda().invoke(new InvokeCommand({ FunctionName: "orders" }));
248
+
249
+ const found = await simAws.logs().filterLogEvents(
250
+ new FilterLogEventsCommand({
251
+ logGroupName: "/aws/lambda/orders",
252
+ filterPattern: "ERROR",
253
+ }),
254
+ );
255
+
256
+ console.log(found.events?.[0]?.message);
257
+ ```
258
+
259
+ The output still reaches the terminal as well. Real Lambda sends it to CloudWatch Logs and nowhere
260
+ else, but a test tool that swallowed it would make a failing test harder to debug. Recording is a
261
+ tee.
262
+
263
+ An invocation that ends in an error nothing caught leaves an `ERROR Invoke Error` line in the group
264
+ after whatever it printed, carrying the error's type, its message and its stack. The
265
+ [simulated Lambda docs](https://yulinsim.dev/services/lambda/ "Simulated Lambda usage docs") show
266
+ one.
267
+
268
+ Each invocation's `context.logGroupName` and `context.logStreamName` name the group and stream that
269
+ were actually written to. Stream names use the real `YYYY/MM/DD/[$LATEST]<hash>` format. The hash
270
+ identifies the execution environment, and one environment serves more than one request. Match the
271
+ shape in a test, and leave the value alone.
272
+
273
+ Writing on this path is unconditional. A real function needs `logs:CreateLogGroup` and
274
+ `logs:PutLogEvents` on its execution Role, and one without them produces no logs at all, in silence.
275
+ Simulating that would leave nearly every function in a test logging nothing, with no failure to
276
+ explain why.
277
+
278
+ ## Declaring a log group in a template
279
+
280
+ `AWS::Logs::LogGroup` is deployed by simulated CloudFormation. A test can then assert on the
281
+ retention a stack gave a group.
282
+
283
+ ```yaml
284
+ OrdersLogs:
285
+ Type: AWS::Logs::LogGroup
286
+ Properties:
287
+ LogGroupName: /aws/lambda/orders
288
+ RetentionInDays: 14
289
+ ```
290
+
291
+ `Ref` resolves to the log group name, and `Fn::GetAtt Arn` to the ARN with its trailing `:*`. That is
292
+ the form a policy has to name. A template granting a function permission on its own log group gets a
293
+ resource that reaches the streams inside it.
294
+
295
+ `LogGroupName` and `RetentionInDays` are the two properties acted on. A `RetentionInDays` outside the
296
+ set AWS accepts fails the deploy, where otherwise it would only be found on a real one. Everything
297
+ else is recorded as an ignored property. A reader can see what a deployed group leaves out, and the
298
+ stack still deploys.
299
+
300
+ Two divergences to know about:
301
+
302
+ - **A group that already exists is taken over.** Real CloudFormation fails a deploy that declares a
303
+ log group already in the account. That is a genuine misconfiguration there and pure noise here,
304
+ where a Lambda function that logged during test setup has already created `/aws/lambda/orders`.
305
+ - **An update replaces the group.** Simulated CloudFormation has no in-place update at all. Any
306
+ resource whose template entry changed is deleted and created again. The retention ends up correct,
307
+ but the events the group held are gone, where a real update to `RetentionInDays` keeps them.
308
+
309
+ ## Delivering logs from another service
310
+
311
+ CloudWatch Logs delivery carries the logs of another service somewhere. CloudFront standard logging
312
+ v2 is the clearest case. A distribution has no logging property of its own, and turning logging on
313
+ means three CloudWatch Logs resources.
314
+
315
+ A delivery source names what is being logged and which of its logs. A delivery destination names
316
+ where they land and in what form. A delivery joins one to the other.
317
+
318
+ ```typescript sim-logs-delivery
319
+ /**
320
+ * Setting up CloudFront standard logging v2 delivery into a bucket.
321
+ */
322
+
323
+ import { CreateDistributionCommand } from "@aws-sdk/client-cloudfront";
324
+ import {
325
+ CreateDeliveryCommand,
326
+ DescribeDeliveriesCommand,
327
+ PutDeliveryDestinationCommand,
328
+ PutDeliverySourceCommand,
329
+ } from "@aws-sdk/client-cloudwatch-logs";
330
+
331
+ import { SimAws } from "@kensio/yulin";
332
+
333
+ const simAws = new SimAws();
334
+ const logs = simAws.logs();
335
+
336
+ const distribution = await simAws.cloudFront().createDistribution(
337
+ new CreateDistributionCommand({
338
+ DistributionConfig: {
339
+ CallerReference: "site",
340
+ Comment: "Static site distribution",
341
+ Enabled: true,
342
+ Origins: {
343
+ Quantity: 1,
344
+ Items: [
345
+ {
346
+ Id: "site-origin",
347
+ DomainName: "origin.example.com",
348
+ CustomOriginConfig: {
349
+ HTTPPort: 80,
350
+ HTTPSPort: 443,
351
+ OriginProtocolPolicy: "https-only",
352
+ },
353
+ },
354
+ ],
355
+ },
356
+ DefaultCacheBehavior: {
357
+ TargetOriginId: "site-origin",
358
+ ViewerProtocolPolicy: "redirect-to-https",
359
+ },
360
+ },
361
+ }),
362
+ );
363
+
364
+ await logs.putDeliverySource(
365
+ new PutDeliverySourceCommand({
366
+ name: "site-access-logs",
367
+ resourceArn: `arn:aws:cloudfront::${simAws.defaultAccountId}:distribution/${distribution.Distribution?.Id}`,
368
+ logType: "ACCESS_LOGS",
369
+ }),
370
+ );
371
+
372
+ const destination = await logs.putDeliveryDestination(
373
+ new PutDeliveryDestinationCommand({
374
+ name: "site-access-logs",
375
+ outputFormat: "json",
376
+ deliveryDestinationConfiguration: {
377
+ destinationResourceArn: "arn:aws:s3:::example-access-logs",
378
+ },
379
+ }),
380
+ );
381
+
382
+ await logs.createDelivery(
383
+ new CreateDeliveryCommand({
384
+ deliverySourceName: "site-access-logs",
385
+ deliveryDestinationArn: destination.deliveryDestination?.arn,
386
+ s3DeliveryConfiguration: {
387
+ suffixPath: "{DistributionId}/{yyyy}/{MM}/{dd}/{HH}",
388
+ enableHiveCompatiblePath: true,
389
+ },
390
+ }),
391
+ );
392
+
393
+ const deliveries = await logs.describeDeliveries(
394
+ new DescribeDeliveriesCommand({}),
395
+ );
396
+
397
+ // S3, and the layout the bucket will be partitioned by.
398
+ console.log(
399
+ deliveries.deliveries?.[0]?.deliveryDestinationType,
400
+ deliveries.deliveries?.[0]?.s3DeliveryConfiguration?.suffixPath,
401
+ );
402
+ ```
403
+
404
+ The delivery destination has an ARN of its own, and `CreateDelivery` names that one. The bucket
405
+ behind it keeps its own ARN, and the two are easy to mix up.
406
+
407
+ The service a delivery source is for is read off the resource ARN. A caller never states it. These
408
+ rules from real AWS are modelled here, each of them a deploy that looks fine until it runs:
409
+
410
+ - **The distribution has to be there.** A CloudFront delivery source over a distribution the
411
+ simulated account never created fails with `ResourceNotFoundException`, and so does one whose ARN
412
+ names another account. Pin a real distribution id in a template and the deploy fails here the way
413
+ it would in an account. A `SimLogs` built on its own has no CloudFront to look in and keeps taking
414
+ any ARN, so a test about delivery alone needs no distribution.
415
+ - **One delivery source per resource.** A second source over a distribution that already has one
416
+ fails with `ConflictException`, carrying the message an account gives, "This ResourceId has
417
+ already been used in another Delivery Source in this account".
418
+ - **A delivery holds both its ends.** Deleting the source or the destination while a delivery joins
419
+ them fails with `ConflictException`. The delivery goes first, and CloudFormation orders that
420
+ itself when a stack is deleted.
421
+ - **CloudFront delivers `ACCESS_LOGS` and nothing else.** Any other `logType` over a distribution is
422
+ refused.
423
+ - **CloudFront delivery is set up from `us-east-1`**, whatever region the destination bucket is in.
424
+ A CloudFront delivery source put from anywhere else is refused.
425
+ - **Hive compatible paths write the `key=` half themselves.** A suffix path naming the partition
426
+ keys as well is refused. Delivery turns `{yyyy}` into `year=2026`, and `year={yyyy}` arrives
427
+ doubled, which an account answers with "Provided suffixPath is invalid".
428
+ - **Output format is fixed once the destination exists.** A `PutDeliveryDestination` that would
429
+ change it is refused. Changing a format means deleting the destination and making it again.
430
+ - **Parquet is written to S3 only.** A log group or Firehose destination asking for it is refused.
431
+
432
+ The suffix path decides the key each log file lands under. `{DistributionId}`, `{distributionid}`,
433
+ `{yyyy}`, `{MM}`, `{dd}`, `{HH}` and `{accountid}` are substituted, and a variable outside that set
434
+ is refused. Delivery would write the text out literally, and the bucket would look partitioned when
435
+ it was not. A path over the 256 characters CloudWatch Logs takes is refused too.
436
+
437
+ Under `enableHiveCompatiblePath`, delivery writes each segment as `key=value` and supplies the key
438
+ itself. `{yyyy}` lands as `year=2026` and `{distributionid}` as `distributionid=E1EXAMPLE1234`. A
439
+ suffix path naming those keys is refused, because the key would arrive twice. Leave the segments as
440
+ bare variables and let delivery name them.
441
+
442
+ ### Declaring delivery in a template
443
+
444
+ The same three resources in a template, which is the whole of what a CDK construct for CloudFront
445
+ logging synthesises, alongside the distribution they are for. The source's `ResourceArn` is built
446
+ around a `Ref` to that distribution, the way CDK builds it. A pinned distribution id fails the
447
+ deploy (see [the rules above](#delivering-logs-from-another-service)).
448
+
449
+ ```yaml
450
+ SiteDistribution:
451
+ Type: AWS::CloudFront::Distribution
452
+ Properties:
453
+ DistributionConfig:
454
+ Enabled: true
455
+ Origins:
456
+ Items:
457
+ - Id: site-origin
458
+ DomainName: origin.example.com
459
+ CustomOriginConfig:
460
+ OriginProtocolPolicy: https-only
461
+ DefaultCacheBehavior:
462
+ TargetOriginId: site-origin
463
+ ViewerProtocolPolicy: redirect-to-https
464
+
465
+ AccessLogsSource:
466
+ Type: AWS::Logs::DeliverySource
467
+ Properties:
468
+ Name: site-access-logs
469
+ ResourceArn:
470
+ !Join [
471
+ "",
472
+ [
473
+ "arn:aws:cloudfront::",
474
+ !Ref "AWS::AccountId",
475
+ ":distribution/",
476
+ !Ref SiteDistribution,
477
+ ],
478
+ ]
479
+ LogType: ACCESS_LOGS
480
+
481
+ AccessLogsDestination:
482
+ Type: AWS::Logs::DeliveryDestination
483
+ Properties:
484
+ Name: site-access-logs
485
+ DestinationResourceArn: arn:aws:s3:::example-access-logs
486
+ OutputFormat: json
487
+
488
+ AccessLogsDelivery:
489
+ Type: AWS::Logs::Delivery
490
+ Properties:
491
+ DeliverySourceName: !Ref AccessLogsSource
492
+ DeliveryDestinationArn: !GetAtt AccessLogsDestination.Arn
493
+ S3SuffixPath: "{DistributionId}/{yyyy}/{MM}/{dd}/{HH}"
494
+ S3EnableHiveCompatiblePath: true
495
+ ```
496
+
497
+ The template carries the S3 layout as two flat properties, and the API takes them nested under
498
+ `s3DeliveryConfiguration`.
499
+
500
+ `Ref` resolves to the name on the source and the destination, and to the delivery ID on the
501
+ delivery. CloudWatch Logs issues that ID. A template cannot predict it.
502
+
503
+ `Fn::GetAtt` gives `Arn` on all three. The source also publishes `Service` and `ResourceArns`, and
504
+ the delivery publishes `DeliveryId` and `DeliveryDestinationType`. The destination publishes nothing
505
+ else, and `DeliveryDestinationType` is a property of it rather than an attribute, so read that one
506
+ off the delivery. Anything outside this set is refused here, as CloudFormation refuses it.
507
+
508
+ `Tags` and `DeliveryDestinationPolicy` are recorded as ignored properties, and the stack still
509
+ deploys.
510
+
511
+ ## Subscription filters
512
+
513
+ A subscription filter delivers the events matching its pattern to a Lambda function. Code written to
514
+ forward log lines to an error tracker or a metrics sink can be tested against the handler it
515
+ forwards from.
516
+
517
+ ```typescript sim-logs-subscription-filter
518
+ /**
519
+ * Delivering matched log events to a simulated Lambda function.
520
+ */
521
+
522
+ import { gunzipSync } from "node:zlib";
523
+
524
+ import {
525
+ CreateLogGroupCommand,
526
+ CreateLogStreamCommand,
527
+ PutLogEventsCommand,
528
+ PutSubscriptionFilterCommand,
529
+ } from "@aws-sdk/client-cloudwatch-logs";
530
+ import {
531
+ AddPermissionCommand,
532
+ CreateFunctionCommand,
533
+ } from "@aws-sdk/client-lambda";
534
+
535
+ import { SimAws } from "@kensio/yulin";
536
+ import { makeLambdaZipFileInput } from "@kensio/yulin/lambda";
537
+
538
+ const simAws = new SimAws();
539
+ const logGroupName = "/aws/lambda/orders";
540
+ const logStreamName = "2026/08/16/[$LATEST]0f7c1a";
541
+ const received: string[] = [];
542
+
543
+ await simAws.lambda().createFunction(
544
+ new CreateFunctionCommand({
545
+ FunctionName: "error-tracker",
546
+ Role: `arn:aws:iam::${simAws.defaultAccountId}:role/TrackerRole`,
547
+ Code: {
548
+ ZipFile: makeLambdaZipFileInput(
549
+ (event: { awslogs: { data: string } }) => {
550
+ const decoded = JSON.parse(
551
+ gunzipSync(Buffer.from(event.awslogs.data, "base64")).toString(),
552
+ ) as { logEvents: { message: string }[] };
553
+
554
+ received.push(...decoded.logEvents.map((line) => line.message));
555
+
556
+ return "recorded";
557
+ },
558
+ ),
559
+ },
560
+ }),
561
+ );
562
+
563
+ // CloudWatch Logs invokes as a regional service principal, so this is the
564
+ // grant a subscription filter needs on the function's side.
565
+ await simAws.lambda().addPermission(
566
+ new AddPermissionCommand({
567
+ FunctionName: "error-tracker",
568
+ StatementId: "logs",
569
+ Action: "lambda:InvokeFunction",
570
+ Principal: `logs.${simAws.defaultRegionName}.amazonaws.com`,
571
+ }),
572
+ );
573
+ await simAws.backgroundTasksComplete();
574
+
575
+ await simAws.logs().createLogGroup(new CreateLogGroupCommand({ logGroupName }));
576
+ await simAws
577
+ .logs()
578
+ .createLogStream(new CreateLogStreamCommand({ logGroupName, logStreamName }));
579
+
580
+ await simAws.logs().putSubscriptionFilter(
581
+ new PutSubscriptionFilterCommand({
582
+ logGroupName,
583
+ filterName: "errors-to-tracker",
584
+ filterPattern: "ERROR",
585
+ destinationArn: `arn:aws:lambda:${simAws.defaultRegionName}:${simAws.defaultAccountId}:function:error-tracker`,
586
+ }),
587
+ );
588
+
589
+ await simAws.logs().putLogEvents(
590
+ new PutLogEventsCommand({
591
+ logGroupName,
592
+ logStreamName,
593
+ logEvents: [
594
+ {
595
+ timestamp: Date.parse("2026-08-16T09:00:00Z"),
596
+ message: "INFO starting",
597
+ },
598
+ {
599
+ timestamp: Date.parse("2026-08-16T09:00:01Z"),
600
+ message: "ERROR order has no items",
601
+ },
602
+ ],
603
+ }),
604
+ );
605
+
606
+ // Delivery happens after the write is answered, as it does in an account.
607
+ await simAws.backgroundTasksComplete();
608
+
609
+ console.log(received);
610
+ ```
611
+
612
+ The payload is the real one. An `awslogs.data` field holds the base64 of a gzipped JSON document
613
+ with `messageType`, `owner`, `logGroup`, `logStream`, `subscriptionFilters` and `logEvents`. A
614
+ handler written against a real subscription decodes it unchanged.
615
+
616
+ The behaviour in detail:
617
+
618
+ - **Delivery is asynchronous.** `PutLogEvents` is answered before anything is delivered. A test
619
+ waits with `await simAws.backgroundTasksComplete()`. A destination that throws leaves the write
620
+ that triggered it alone.
621
+ - **A failed delivery is kept.** Real CloudWatch Logs tells nobody when a delivery fails, and it
622
+ becomes a metric nobody is watching. `simAws.logs().subscriptionFailures` holds them. A test can
623
+ find out that the subscription it set up never reached anything.
624
+ - **The destination is checked when the filter is put.** A function that has yet to grant
625
+ `logs.<region>.amazonaws.com` permission to invoke it fails `PutSubscriptionFilter`, as it does in
626
+ an account. The alternative would be a filter that silently drops every event. The resource policy
627
+ is consulted again on every delivery, and a permission removed later stops delivery too.
628
+ - **What a Lambda function logged is delivered as well.** A subscription on `/aws/lambda/orders`
629
+ picks up what that function wrote. A forwarder can be tested against a real handler's output.
630
+ - **Lambda is the only destination.** Kinesis, Firehose and cross-account destinations are refused
631
+ outright.
632
+ - **A destination can name a version or an alias.** See
633
+ [Subscribing a Lambda alias](#subscribing-a-lambda-alias).
634
+ - **Two filters per log group**, the current AWS account default.
635
+
636
+ ### Subscribing a Lambda alias
637
+
638
+ A `destinationArn` can carry a version number or an alias name on the end, and matched events go to
639
+ the version that qualifier names. The grant is made on the same qualifier:
640
+
641
+ ```typescript sim-logs-subscription-alias
642
+ /**
643
+ * Delivering matched log events to a simulated Lambda alias.
644
+ */
645
+
646
+ import {
647
+ CreateLogGroupCommand,
648
+ CreateLogStreamCommand,
649
+ PutLogEventsCommand,
650
+ PutSubscriptionFilterCommand,
651
+ } from "@aws-sdk/client-cloudwatch-logs";
652
+ import {
653
+ AddPermissionCommand,
654
+ CreateAliasCommand,
655
+ CreateFunctionCommand,
656
+ PublishVersionCommand,
657
+ } from "@aws-sdk/client-lambda";
658
+
659
+ import { SimAws } from "@kensio/yulin";
660
+ import { makeLambdaZipFileInput } from "@kensio/yulin/lambda";
661
+
662
+ const simAws = new SimAws();
663
+ const lambda = simAws.lambda();
664
+ const logGroupName = "/aws/lambda/orders";
665
+ const logStreamName = "2026/08/19/[$LATEST]0f7c1a";
666
+ const trackerArn = `arn:aws:lambda:${simAws.defaultRegionName}:${simAws.defaultAccountId}:function:error-tracker`;
667
+
668
+ await lambda.createFunction(
669
+ new CreateFunctionCommand({
670
+ FunctionName: "error-tracker",
671
+ Role: `arn:aws:iam::${simAws.defaultAccountId}:role/TrackerRole`,
672
+ Code: {
673
+ ZipFile: makeLambdaZipFileInput((_event, context) => {
674
+ console.log(context.functionVersion); // "1", the version behind `live`
675
+
676
+ return "recorded";
677
+ }),
678
+ },
679
+ }),
680
+ );
681
+ await simAws.backgroundTasksComplete();
682
+
683
+ const published = await lambda.publishVersion(
684
+ new PublishVersionCommand({ FunctionName: "error-tracker" }),
685
+ );
686
+
687
+ await lambda.createAlias(
688
+ new CreateAliasCommand({
689
+ FunctionName: "error-tracker",
690
+ Name: "live",
691
+ FunctionVersion: published.Version,
692
+ }),
693
+ );
694
+
695
+ await lambda.addPermission(
696
+ new AddPermissionCommand({
697
+ FunctionName: "error-tracker",
698
+ Qualifier: "live",
699
+ StatementId: "logs",
700
+ Action: "lambda:InvokeFunction",
701
+ Principal: `logs.${simAws.defaultRegionName}.amazonaws.com`,
702
+ }),
703
+ );
704
+
705
+ await simAws.logs().createLogGroup(new CreateLogGroupCommand({ logGroupName }));
706
+ await simAws
707
+ .logs()
708
+ .createLogStream(new CreateLogStreamCommand({ logGroupName, logStreamName }));
709
+
710
+ await simAws.logs().putSubscriptionFilter(
711
+ new PutSubscriptionFilterCommand({
712
+ logGroupName,
713
+ filterName: "errors-to-tracker",
714
+ filterPattern: "ERROR",
715
+ destinationArn: `${trackerArn}:live`,
716
+ }),
717
+ );
718
+
719
+ await simAws.logs().putLogEvents(
720
+ new PutLogEventsCommand({
721
+ logGroupName,
722
+ logStreamName,
723
+ logEvents: [{ timestamp: 1000, message: "ERROR order has no items" }],
724
+ }),
725
+ );
726
+
727
+ await simAws.backgroundTasksComplete();
728
+ ```
729
+
730
+ A qualifier naming no version and no alias is refused where the filter is put, the way a missing
731
+ function is. `UpdateAlias` moves what the filter reaches, and the filter stays as it is.
732
+
733
+ ## Permissions
734
+
735
+ Every operation goes through simulated IAM. An operation on a named log group authorizes against
736
+ that group's ARN with the trailing `:*`. That is the form CloudWatch Logs policies are written in.
737
+ Granting `logs:PutLogEvents` on a group grants it on the streams inside, and the wildcard is what
738
+ covers them. A policy naming `log-group:/aws/lambda/orders` without it reaches no stream here,
739
+ exactly as on real AWS.
740
+
741
+ `DescribeLogGroups` names no particular group. It authorizes against every log group in the account
742
+ and region, and a policy scoped to one group cannot describe them all.
743
+
744
+ A Stack deploying the three delivery Resource types authorizes the actions CloudFormation names.
745
+ Each handler reads its own resource back before it writes. `AWS::Logs::DeliverySource` therefore
746
+ needs `logs:GetDeliverySource` alongside `logs:PutDeliverySource`, and the destination and the
747
+ delivery need `logs:GetDeliveryDestination` and `logs:GetDelivery` the same way. The `Describe` actions cover
748
+ the three listing operations an SDK caller reaches, and a deployment goes near none of them. A
749
+ CloudFormation execution Role therefore carries the same policy here that a real deploy of the
750
+ template needs.
751
+
752
+ ```typescript sim-logs-permissions
753
+ /**
754
+ * A simulated IAM policy allowing a Role to write one function's logs.
755
+ */
756
+
757
+ import {
758
+ CreateLogGroupCommand,
759
+ CreateLogStreamCommand,
760
+ } from "@aws-sdk/client-cloudwatch-logs";
761
+ import { CreateRoleCommand, PutRolePolicyCommand } from "@aws-sdk/client-iam";
762
+
763
+ import { SimAws } from "@kensio/yulin";
764
+
765
+ const simAws = new SimAws();
766
+ const accountId = simAws.defaultAccountId;
767
+ const regionName = simAws.defaultRegionName;
768
+ const logGroupName = "/aws/lambda/orders";
769
+
770
+ const role = await simAws.iam().createRole(
771
+ new CreateRoleCommand({
772
+ RoleName: "OrdersFunctionRole",
773
+ AssumeRolePolicyDocument: JSON.stringify({
774
+ Version: "2012-10-17",
775
+ Statement: {
776
+ Effect: "Allow",
777
+ Principal: { Service: "lambda.amazonaws.com" },
778
+ Action: "sts:AssumeRole",
779
+ },
780
+ }),
781
+ }),
782
+ );
783
+
784
+ await simAws.iam().putRolePolicy(
785
+ new PutRolePolicyCommand({
786
+ RoleName: "OrdersFunctionRole",
787
+ PolicyName: "WriteOwnLogs",
788
+ PolicyDocument: JSON.stringify({
789
+ Version: "2012-10-17",
790
+ Statement: {
791
+ Effect: "Allow",
792
+ Action: [
793
+ "logs:CreateLogGroup",
794
+ "logs:CreateLogStream",
795
+ "logs:PutLogEvents",
796
+ ],
797
+ // The trailing wildcard covers the streams inside the group.
798
+ Resource: `arn:aws:logs:${regionName}:${accountId}:log-group:${logGroupName}:*`,
799
+ },
800
+ }),
801
+ }),
802
+ );
803
+
804
+ const asRole = { caller: { kind: "arn", arn: role.Role.Arn } } as const;
805
+
806
+ await simAws
807
+ .logs()
808
+ .createLogGroup(new CreateLogGroupCommand({ logGroupName }), asRole);
809
+ await simAws.logs().createLogStream(
810
+ new CreateLogStreamCommand({
811
+ logGroupName,
812
+ logStreamName: "2026/08/16/[$LATEST]0f7c1a",
813
+ }),
814
+ asRole,
815
+ );
816
+
817
+ console.log(simAws.logs().findLogGroup(logGroupName)?.logGroupArn);
818
+ ```
819
+
820
+ ## Through an intercepted SDK client
821
+
822
+ Application code that constructs its own `CloudWatchLogsClient` reaches the simulator through SDK
823
+ interception, with the code under test unchanged.
824
+
825
+ ```typescript sim-logs-sdk-interception
826
+ /**
827
+ * Reaching simulated CloudWatch Logs through an intercepted SDK client.
828
+ */
829
+
830
+ import {
831
+ CloudWatchLogsClient,
832
+ CreateLogGroupCommand,
833
+ DescribeLogGroupsCommand,
834
+ } from "@aws-sdk/client-cloudwatch-logs";
835
+
836
+ import { SimSdk } from "@kensio/yulin/sdk";
837
+
838
+ using simSdk = new SimSdk();
839
+ simSdk.intercept(CloudWatchLogsClient);
840
+
841
+ const client = new CloudWatchLogsClient({ region: "eu-west-2" });
842
+
843
+ await client.send(
844
+ new CreateLogGroupCommand({ logGroupName: "/aws/lambda/orders" }),
845
+ );
846
+
847
+ const described = await client.send(new DescribeLogGroupsCommand({}));
848
+
849
+ // The ARN names the Region the client was configured for.
850
+ console.log(described.logGroups?.[0]?.logGroupArn);
851
+ ```
852
+
853
+ ## Limitations
854
+
855
+ - **Events never expire.** Retention is stored and reported, never acted on.
856
+ - **Metric filters.** Absent, so `metricFilterCount` is always zero.
857
+ - **Subscription filter destinations other than Lambda**, and `Distribution`. `Distribution` is
858
+ accepted and reported, and with no shards to spread across it has no effect.
859
+ - **`AWS::Logs::SubscriptionFilter` and `AWS::Logs::MetricFilter`.** Both are recorded as gaps. The
860
+ log group and the three delivery resource types are what simulated CloudFormation deploys here.
861
+ - **Nothing is actually delivered.** A delivery records that a source was joined to a destination
862
+ and how the records would be written. No access log file ever reaches the bucket.
863
+ - **`GetDeliverySource`, `GetDeliveryDestination` and `GetDelivery`.** Absent as SDK operations. The
864
+ three `Describe` operations report the same resources. The three action names are authorized where
865
+ CloudFormation reads a delivery Resource back.
866
+ - **Delivery resource tags and cross-account delivery.** `PutDeliverySource`,
867
+ `PutDeliveryDestination` and `CreateDelivery` refuse tags outright. `DeliveryDestinationPolicy` in
868
+ a template is recorded and acted on by nothing.
869
+ - **An `=` in a suffix path with Hive compatible paths off.** Taken. Whether real CloudWatch Logs
870
+ takes one is unverified. A path hand-rolling its own partition keys without the option is left
871
+ alone here, and refused with the option on.
872
+ - **Log types for services other than CloudFront.** Any `logType` is taken over a resource that is
873
+ not a distribution, because the valid set varies by service and this simulation does not carry it.
874
+ - **Logs Insights, export tasks, tags, encryption and data protection policies.** Absent. Tags and
875
+ `kmsKeyId` on `CreateLogGroup` are refused outright. A property cannot look set here and behave
876
+ differently in an account.
877
+ - **Per-stream `storedBytes`.** Always zero, matching real CloudWatch Logs, which stopped reporting
878
+ the figure per stream in 2019. `DescribeLogGroups` reports the bytes a group holds.
879
+ - **Log capture from a handler function reference.** Recorded through the process console and the
880
+ process standard streams, both of which a test runner is free to replace. `console.trace` and
881
+ `console.dir` reach the log group only where the host console passes them on to `process.stdout`.
882
+ See the Lambda docs for the detail.