@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,670 @@
1
+ # Simulated Secrets Manager
2
+
3
+ Yulin includes a simulated AWS Secrets Manager for tests and local development. Secrets are stored
4
+ in memory, versioned by staging label, and every operation is authorized by simulated IAM.
5
+
6
+ Secrets Manager-specific types are imported from the `@kensio/yulin/secretsmanager` subpath.
7
+
8
+ ## Creating and reading a secret
9
+
10
+ ```typescript sim-secrets-manager-create-and-read
11
+ /**
12
+ * Creating a simulated secret and reading it back.
13
+ */
14
+
15
+ import {
16
+ CreateSecretCommand,
17
+ GetSecretValueCommand,
18
+ } from "@aws-sdk/client-secrets-manager";
19
+
20
+ import { SimAws } from "@kensio/yulin";
21
+
22
+ const simAws = new SimAws();
23
+ const secretsManager = simAws.secretsManager();
24
+
25
+ await secretsManager.createSecret(
26
+ new CreateSecretCommand({
27
+ Name: "db-creds",
28
+ SecretString: JSON.stringify({ username: "app", password: "hunter2" }),
29
+ }),
30
+ );
31
+
32
+ const read = await secretsManager.getSecretValue(
33
+ new GetSecretValueCommand({ SecretId: "db-creds" }),
34
+ );
35
+
36
+ const credentials = JSON.parse(read.SecretString ?? "{}") as {
37
+ password?: string;
38
+ };
39
+
40
+ console.log(credentials.password); // "hunter2"
41
+ ```
42
+
43
+ `SecretString` and `SecretBinary` are mutually exclusive on write, and exactly one of them comes back
44
+ on read.
45
+
46
+ ## Encryption and KMS permissions
47
+
48
+ Every version is encrypted through simulated KMS when it is written and decrypted when
49
+ `GetSecretValue` reads it. There is no flag for reading a secret without decrypting it. The read
50
+ either returns the plaintext or fails.
51
+
52
+ A secret naming no `KmsKeyId` uses the `aws/secretsmanager` AWS managed key, which asks the caller
53
+ for no KMS permission at all. Secrets Manager supplies `kms:ViaService`, and that key's policy allows
54
+ the account's principals to use it through Secrets Manager. A Lambda role granted only
55
+ `secretsmanager:GetSecretValue` therefore reads the secret, as it does on real AWS.
56
+
57
+ Pass `KmsKeyId` to encrypt under a customer managed key instead, and the caller's own permissions on
58
+ that key start to matter. Secrets Manager uses envelope encryption, asking KMS for a data key per
59
+ version. A write needs `kms:GenerateDataKey` and a read needs `kms:Decrypt`. A role granted the
60
+ secret but not the key fails here, ahead of a deployment.
61
+
62
+ ```typescript sim-secrets-manager-customer-key
63
+ /**
64
+ * A Role allowed to read a simulated secret but not to decrypt it.
65
+ */
66
+
67
+ import { CreateRoleCommand, PutRolePolicyCommand } from "@aws-sdk/client-iam";
68
+ import { CreateKeyCommand } from "@aws-sdk/client-kms";
69
+ import {
70
+ CreateSecretCommand,
71
+ GetSecretValueCommand,
72
+ } from "@aws-sdk/client-secrets-manager";
73
+
74
+ import { SimAws } from "@kensio/yulin";
75
+
76
+ const simAws = new SimAws();
77
+ const accountId = simAws.defaultAccountId;
78
+
79
+ const key = await simAws
80
+ .kms()
81
+ .createKey(new CreateKeyCommand({ Description: "Secret key" }));
82
+
83
+ await simAws.secretsManager().createSecret(
84
+ new CreateSecretCommand({
85
+ Name: "db-credentials",
86
+ SecretString: "hunter2",
87
+ KmsKeyId: key.KeyMetadata?.Arn,
88
+ }),
89
+ );
90
+
91
+ const role = await simAws.iam().createRole(
92
+ new CreateRoleCommand({
93
+ RoleName: "SecretReader",
94
+ AssumeRolePolicyDocument: JSON.stringify({
95
+ Version: "2012-10-17",
96
+ Statement: {
97
+ Effect: "Allow",
98
+ Principal: { AWS: `arn:aws:iam::${accountId}:root` },
99
+ Action: "sts:AssumeRole",
100
+ },
101
+ }),
102
+ }),
103
+ );
104
+
105
+ // The secret is allowed, the key is not.
106
+ await simAws.iam().putRolePolicy(
107
+ new PutRolePolicyCommand({
108
+ RoleName: "SecretReader",
109
+ PolicyName: "ReadDbCredentials",
110
+ PolicyDocument: JSON.stringify({
111
+ Version: "2012-10-17",
112
+ Statement: {
113
+ Effect: "Allow",
114
+ Action: "secretsmanager:GetSecretValue",
115
+ Resource: "*",
116
+ },
117
+ }),
118
+ }),
119
+ );
120
+
121
+ const caller = { kind: "arn", arn: role.Role.Arn } as const;
122
+
123
+ try {
124
+ await simAws
125
+ .secretsManager()
126
+ .getSecretValue(new GetSecretValueCommand({ SecretId: "db-credentials" }), {
127
+ caller,
128
+ });
129
+ } catch (error) {
130
+ console.log((error as Error).name); // "AccessDenied"
131
+ }
132
+ ```
133
+
134
+ Each version is bound to its own secret ARN and version id as the KMS encryption context, as real
135
+ Secrets Manager binds them. A `KmsKeyId` naming a key that is absent, disabled, or pending deletion
136
+ fails with `EncryptionFailure` when a value is written under it, and a version whose key has since
137
+ become unusable fails with `DecryptionFailure` when it is read.
138
+
139
+ Changing `KmsKeyId` applies to versions written afterwards. The versions already written keep the key
140
+ they were made with and stay readable, as they do on real AWS.
141
+
142
+ ## Secret ARNs and IAM policies
143
+
144
+ Real Secrets Manager appends a hyphen and six random characters to the secret name in its ARN. A
145
+ secret named `db-creds` gets an ARN ending `:secret:db-creds-AbCdEf`, and sim Secrets Manager does
146
+ the same. A policy naming the bare ARN therefore matches nothing, and a policy has to end in
147
+ `-??????` or a wildcard.
148
+
149
+ ```typescript sim-secrets-manager-iam-policy
150
+ /**
151
+ * A simulated IAM policy allowing for the random suffix on a secret ARN.
152
+ */
153
+
154
+ import { CreateRoleCommand, PutRolePolicyCommand } from "@aws-sdk/client-iam";
155
+ import {
156
+ CreateSecretCommand,
157
+ GetSecretValueCommand,
158
+ } from "@aws-sdk/client-secrets-manager";
159
+
160
+ import { SimAws } from "@kensio/yulin";
161
+
162
+ const simAws = new SimAws();
163
+ const accountId = simAws.defaultAccountId;
164
+ const regionName = simAws.defaultRegionName;
165
+
166
+ const role = await simAws.iam().createRole(
167
+ new CreateRoleCommand({
168
+ RoleName: "SecretReader",
169
+ AssumeRolePolicyDocument: JSON.stringify({
170
+ Version: "2012-10-17",
171
+ Statement: {
172
+ Effect: "Allow",
173
+ Principal: { AWS: `arn:aws:iam::${accountId}:root` },
174
+ Action: "sts:AssumeRole",
175
+ },
176
+ }),
177
+ }),
178
+ );
179
+
180
+ await simAws.iam().putRolePolicy(
181
+ new PutRolePolicyCommand({
182
+ RoleName: "SecretReader",
183
+ PolicyName: "ReadDbCreds",
184
+ PolicyDocument: JSON.stringify({
185
+ Version: "2012-10-17",
186
+ Statement: {
187
+ Effect: "Allow",
188
+ Action: "secretsmanager:GetSecretValue",
189
+ // Without the six wildcard characters this policy would match nothing.
190
+ Resource: `arn:aws:secretsmanager:${regionName}:${accountId}:secret:db-creds-??????`,
191
+ },
192
+ }),
193
+ }),
194
+ );
195
+
196
+ await simAws
197
+ .secretsManager()
198
+ .createSecret(
199
+ new CreateSecretCommand({ Name: "db-creds", SecretString: "hunter2" }),
200
+ );
201
+
202
+ const read = await simAws
203
+ .secretsManager()
204
+ .getSecretValue(new GetSecretValueCommand({ SecretId: "db-creds" }), {
205
+ caller: { kind: "arn", arn: role.Role.Arn },
206
+ });
207
+
208
+ console.log(read.SecretString); // "hunter2"
209
+ ```
210
+
211
+ `ListSecrets` is the exception. Real Secrets Manager gives it no resource-level permissions, and a
212
+ policy allowing it has to use a resource of `*`. A policy naming individual secret ARNs grants
213
+ nothing, here as there.
214
+
215
+ ## Naming a secret
216
+
217
+ Every operation takes its target as a `SecretId`, in any of the three forms real Secrets Manager
218
+ accepts. Those are the friendly name, the full ARN including the suffix, and the partial ARN without
219
+ it.
220
+
221
+ An ARN naming another account or region resolves to no secret at all. Its name is never read out and
222
+ looked up locally, and a foreign ARN cannot reach a secret that happens to share a name.
223
+
224
+ ## Versions and staging labels
225
+
226
+ Every write creates a version, leaving the earlier ones in place. `AWSCURRENT` names the version a
227
+ plain read returns, and writing a new current version demotes the previous one to `AWSPREVIOUS`.
228
+
229
+ ```typescript sim-secrets-manager-staging-labels
230
+ /**
231
+ * Staging labels moving as a simulated secret is rotated by hand.
232
+ */
233
+
234
+ import {
235
+ CreateSecretCommand,
236
+ GetSecretValueCommand,
237
+ PutSecretValueCommand,
238
+ } from "@aws-sdk/client-secrets-manager";
239
+
240
+ import { SimAws } from "@kensio/yulin";
241
+
242
+ const simAws = new SimAws();
243
+ const secretsManager = simAws.secretsManager();
244
+
245
+ await secretsManager.createSecret(
246
+ new CreateSecretCommand({ Name: "api-key", SecretString: "old-key" }),
247
+ );
248
+
249
+ await secretsManager.putSecretValue(
250
+ new PutSecretValueCommand({ SecretId: "api-key", SecretString: "new-key" }),
251
+ );
252
+
253
+ const current = await secretsManager.getSecretValue(
254
+ new GetSecretValueCommand({ SecretId: "api-key" }),
255
+ );
256
+ const previous = await secretsManager.getSecretValue(
257
+ new GetSecretValueCommand({
258
+ SecretId: "api-key",
259
+ VersionStage: "AWSPREVIOUS",
260
+ }),
261
+ );
262
+
263
+ console.log(current.SecretString); // "new-key"
264
+ console.log(previous.SecretString); // "old-key"
265
+ ```
266
+
267
+ A `ClientRequestToken` becomes the version id, as it does on real AWS. Repeating a write with the
268
+ same token and the same value is ignored, so a retry is safe. The same token with a different
269
+ value is refused, because a version's value never changes once written.
270
+
271
+ `DescribeSecret` reports `VersionIdsToStages`. That lists only the versions still carrying a staging
272
+ label. A version that has lost every label is on its way out of existence, and is left out.
273
+
274
+ ## Deletion and the recovery window
275
+
276
+ `DeleteSecret` schedules deletion for later. The recovery window is 7 to 30 days, defaulting to 30.
277
+ During that window the secret is still there. It can be described and restored, it refuses to be
278
+ read or written, and it still holds its name.
279
+
280
+ Holding the name is what a redeployed stack hits. Advancing the simulated clock past the window frees
281
+ it.
282
+
283
+ ```typescript sim-secrets-manager-deletion
284
+ /**
285
+ * A simulated secret holding its name until the recovery window elapses.
286
+ */
287
+
288
+ import {
289
+ CreateSecretCommand,
290
+ DeleteSecretCommand,
291
+ } from "@aws-sdk/client-secrets-manager";
292
+
293
+ import { SimAws } from "@kensio/yulin";
294
+ import { SimSecretsManagerInvalidRequestException } from "@kensio/yulin/secretsmanager";
295
+
296
+ const simAws = new SimAws();
297
+ const secretsManager = simAws.secretsManager();
298
+
299
+ await secretsManager.createSecret(
300
+ new CreateSecretCommand({ Name: "db-creds", SecretString: "hunter2" }),
301
+ );
302
+
303
+ await secretsManager.deleteSecret(
304
+ new DeleteSecretCommand({ SecretId: "db-creds", RecoveryWindowInDays: 7 }),
305
+ );
306
+
307
+ try {
308
+ await secretsManager.createSecret(
309
+ new CreateSecretCommand({ Name: "db-creds", SecretString: "hunter2" }),
310
+ );
311
+ } catch (error) {
312
+ // The name is still taken by the secret waiting out its window.
313
+ console.log(error instanceof SimSecretsManagerInvalidRequestException); // true
314
+ }
315
+
316
+ await simAws.clock().advanceBy({ days: 8 });
317
+
318
+ // Now the secret is gone and the name is free again.
319
+ const recreated = await secretsManager.createSecret(
320
+ new CreateSecretCommand({ Name: "db-creds", SecretString: "hunter2" }),
321
+ );
322
+
323
+ console.log(recreated.Name); // "db-creds"
324
+ ```
325
+
326
+ `ForceDeleteWithoutRecovery` deletes at once and frees the name straight away. Asking for it
327
+ alongside `RecoveryWindowInDays` is a contradiction, and is refused.
328
+
329
+ See [simulated time](https://yulinsim.dev/time/ "Simulated time docs") for what else the clock can do.
330
+
331
+ ## Scoping
332
+
333
+ Secrets belong to an account and a region, as they do on real AWS. A secret name is unique within one
334
+ account and region and nowhere wider. The same name can be used in two regions for two different
335
+ secrets.
336
+
337
+ ```typescript sim-secrets-manager-scoping
338
+ /**
339
+ * Simulated secrets are scoped to an account and region.
340
+ */
341
+
342
+ import {
343
+ CreateSecretCommand,
344
+ GetSecretValueCommand,
345
+ } from "@aws-sdk/client-secrets-manager";
346
+
347
+ import { SimAws } from "@kensio/yulin";
348
+ import { SimSecretsManagerResourceNotFoundException } from "@kensio/yulin/secretsmanager";
349
+
350
+ const simAws = new SimAws();
351
+
352
+ await simAws
353
+ .account("222222222222")
354
+ .region("eu-west-2")
355
+ .secretsManager()
356
+ .createSecret(
357
+ new CreateSecretCommand({ Name: "db-creds", SecretString: "hunter2" }),
358
+ );
359
+
360
+ try {
361
+ await simAws
362
+ .account("222222222222")
363
+ .region("us-east-1")
364
+ .secretsManager()
365
+ .getSecretValue(new GetSecretValueCommand({ SecretId: "db-creds" }));
366
+ } catch (error) {
367
+ console.log(error instanceof SimSecretsManagerResourceNotFoundException); // true
368
+ }
369
+ ```
370
+
371
+ ## Deploying a secret from CloudFormation
372
+
373
+ Simulated CloudFormation creates a secret from an `AWS::SecretsManager::Secret` resource, in the
374
+ stack's account and region. A template either supplies the value with `SecretString` or asks Secrets
375
+ Manager to generate one with `GenerateSecretString`, as on real AWS. Declaring both is refused, as
376
+ CloudFormation refuses it.
377
+
378
+ `Ref` on the resource gives the full secret ARN, random suffix and all, and `Fn::GetAtt … Id` gives
379
+ the same. A `Ref` is therefore usable directly as a `SecretId`, whether it goes into a Lambda's
380
+ environment or into an IAM policy resource.
381
+
382
+ ```typescript sim-secrets-manager-cloudformation-secret
383
+ /**
384
+ * Deploying a secret from a CloudFormation template and reading back the
385
+ * password the deployment generated.
386
+ */
387
+
388
+ import { GetSecretValueCommand } from "@aws-sdk/client-secrets-manager";
389
+
390
+ import { SimAws } from "@kensio/yulin";
391
+
392
+ const simAws = new SimAws();
393
+
394
+ const stack = await simAws.cloudFormation().deployTemplate({
395
+ stackName: "database-stack",
396
+ template: {
397
+ Resources: {
398
+ DbSecret: {
399
+ Type: "AWS::SecretsManager::Secret",
400
+ Properties: {
401
+ Name: "db-credentials",
402
+ Description: "Credentials for the application database",
403
+ GenerateSecretString: {
404
+ SecretStringTemplate: JSON.stringify({ username: "app" }),
405
+ GenerateStringKey: "password",
406
+ PasswordLength: 24,
407
+ ExcludePunctuation: true,
408
+ },
409
+ },
410
+ },
411
+ },
412
+ Outputs: {
413
+ DbSecretArn: {
414
+ Value: { Ref: "DbSecret" },
415
+ },
416
+ },
417
+ },
418
+ });
419
+
420
+ await stack.waitForDeployComplete();
421
+
422
+ // Ref resolves to the ARN including its suffix, so it works as a SecretId.
423
+ const secretArn = stack.output("DbSecretArn");
424
+
425
+ const read = await simAws
426
+ .secretsManager()
427
+ .getSecretValue(new GetSecretValueCommand({ SecretId: secretArn }));
428
+
429
+ const credentials = JSON.parse(read.SecretString ?? "{}") as {
430
+ username?: string;
431
+ password?: string;
432
+ };
433
+
434
+ console.log(credentials.username); // "app"
435
+ console.log(credentials.password?.length); // 24
436
+ ```
437
+
438
+ Generated passwords are random. A test reads the value back out of the simulation the way a deployed
439
+ application does.
440
+
441
+ ## Reading a secret with a dynamic reference
442
+
443
+ A template reads a secret that already exists through a `{{resolve:secretsmanager:...}}` dynamic
444
+ reference. The reference is replaced with the secret's value as the resource holding it is created.
445
+ CDK emits one from `SecretValue.secretsManager`.
446
+
447
+ The whole form is
448
+ `{{resolve:secretsmanager:secret-id:secret-string:json-key:version-stage:version-id}}`. Only the
449
+ secret id is required, and it takes a friendly name, a full ARN or a partial ARN. Every segment
450
+ after it can be left empty, so `{{resolve:secretsmanager:db-credentials::::}}` reads what
451
+ `{{resolve:secretsmanager:db-credentials}}` reads.
452
+
453
+ - `secret-string` accepts `SecretString` and refuses anything else. (AWS documents the segment as
454
+ the field to read, and `SecretString` is the only field a dynamic reference has ever read.)
455
+ - `json-key` names one key of a secret holding a JSON object. Omitting it reads the whole secret
456
+ string.
457
+ - `version-stage` and `version-id` select a version, defaulting to `AWSCURRENT`. A reference carries
458
+ one or the other, and giving both is refused.
459
+
460
+ ```typescript sim-secrets-manager-dynamic-reference
461
+ /**
462
+ * A CloudFormation template reading a secret into a Lambda function's
463
+ * environment.
464
+ */
465
+
466
+ import { InvokeCommand } from "@aws-sdk/client-lambda";
467
+ import { CreateSecretCommand } from "@aws-sdk/client-secrets-manager";
468
+
469
+ import { SimAws } from "@kensio/yulin";
470
+
471
+ const simAws = new SimAws();
472
+
473
+ await simAws.secretsManager().createSecret(
474
+ new CreateSecretCommand({
475
+ Name: "db-credentials",
476
+ SecretString: JSON.stringify({ username: "app", password: "hunter2" }),
477
+ }),
478
+ );
479
+
480
+ const stack = await simAws.cloudFormation().deployTemplate({
481
+ stackName: "api-stack",
482
+ template: {
483
+ Resources: {
484
+ ApiRole: {
485
+ Type: "AWS::IAM::Role",
486
+ Properties: {
487
+ RoleName: "ApiRole",
488
+ AssumeRolePolicyDocument: {
489
+ Version: "2012-10-17",
490
+ Statement: [
491
+ {
492
+ Effect: "Allow",
493
+ Principal: { Service: "lambda.amazonaws.com" },
494
+ Action: "sts:AssumeRole",
495
+ },
496
+ ],
497
+ },
498
+ },
499
+ },
500
+ ApiFunction: {
501
+ Type: "AWS::Lambda::Function",
502
+ Properties: {
503
+ FunctionName: "api",
504
+ Role: { "Fn::GetAtt": ["ApiRole", "Arn"] },
505
+ Handler: "index.handler",
506
+ Runtime: "nodejs20.x",
507
+ Environment: {
508
+ Variables: {
509
+ DB_USERNAME:
510
+ "{{resolve:secretsmanager:db-credentials:SecretString:username}}",
511
+ DB_PASSWORD:
512
+ "{{resolve:secretsmanager:db-credentials:SecretString:password}}",
513
+ },
514
+ },
515
+ Code: {
516
+ ZipFile: "exports.handler = async () => process.env.DB_USERNAME;",
517
+ },
518
+ },
519
+ },
520
+ },
521
+ },
522
+ });
523
+
524
+ await stack.waitForDeployComplete();
525
+
526
+ // The function was created holding the values the references resolved to.
527
+ const output = await simAws
528
+ .lambda()
529
+ .invoke(new InvokeCommand({ FunctionName: "api" }));
530
+
531
+ const username = JSON.parse(
532
+ Buffer.from(output.Payload ?? []).toString(),
533
+ ) as string;
534
+
535
+ console.log(username); // "app"
536
+
537
+ await simAws.backgroundTasksComplete();
538
+ ```
539
+
540
+ A reference can sit inside a longer string, where only the reference itself is replaced. One written
541
+ inside `Fn::Sub` is read after the variables around it are substituted.
542
+
543
+ A full ARN naming another account is read from that account's simulated Secrets Manager, as real
544
+ CloudFormation reads it. A friendly name and a partial ARN both name a secret in the stack's own
545
+ account and region.
546
+
547
+ The value is decrypted through simulated KMS on the way out, the same as `GetSecretValue` decrypts
548
+ it. A secret under a customer managed key that the simulation cannot decrypt resolves to a stand-in
549
+ value.
550
+
551
+ Real CloudFormation makes no dependency out of a dynamic reference, and neither does this. A secret
552
+ another resource of the same stack creates is only there in time when the template says `DependsOn`.
553
+
554
+ Resource properties are reported as they resolved, including this one. Real CloudFormation keeps a
555
+ resolved secret out of its own logs and events, and sim CloudFormation has no such protection.
556
+
557
+ ### A reference the simulation cannot answer
558
+
559
+ Simulated CloudFormation deploys what it can. A reference naming a secret that was never created
560
+ resolves to `dummy-value-for-<secret-id>`, and the stack carries on deploying. A template reading a
561
+ secret a test does not care about is still worth deploying for everything else in it.
562
+
563
+ The substitution is recorded on
564
+ [`stack.ignoredProperties`](https://yulinsim.dev/services/cloudformation/#properties-a-resource-was-created-without),
565
+ naming the property that held the reference and why the value is a stand-in. A `json-key` the secret
566
+ has no value for, a version stage no version carries, a `secret-string` segment other than
567
+ `SecretString`, and a reference naming both a version stage and a version id are all recorded the
568
+ same way.
569
+
570
+ `SecretStringTemplate` and `GenerateStringKey` go together. The generated password is added to the
571
+ template's JSON object under that key. Without them, the whole secret value is the generated
572
+ password. That is what an empty `GenerateSecretString: {}` produces, and it is the property CDK
573
+ synthesises for a `secretsmanager.Secret` with no options.
574
+
575
+ The other generation options behave as they do on real AWS, being `PasswordLength` (32 by default),
576
+ `ExcludeCharacters`, `ExcludeUppercase`, `ExcludeLowercase`, `ExcludeNumbers`, `ExcludePunctuation`,
577
+ `IncludeSpace`, and `RequireEachIncludedType`. The last is on unless turned off, and a generated
578
+ password carries one of every character type it was not told to exclude.
579
+
580
+ A secret with no `Name` is named from the stack name, the logical ID and a tail derived from both.
581
+ An `ApiSecret` in `db-stack` becomes `db-stack-ApiSecret-` and twelve more characters, where real
582
+ CloudFormation ends the name in twelve random ones. Simulated Secrets Manager then appends its own
583
+ six characters to the ARN, as it does for a secret named by hand. The name is trimmed to the 512
584
+ characters a secret name allows, and [the CloudFormation docs](https://yulinsim.dev/services/cloudformation/#names-cloudformation-generates "Names CloudFormation generates")
585
+ cover how the stack name and the logical ID share what is left.
586
+
587
+ ## Inside a simulated Lambda handler
588
+
589
+ Function code requiring `@aws-sdk/client-secrets-manager` is routed into the same simulated AWS
590
+ environment, with the function's execution role as the caller. A handler fetching a secret therefore
591
+ has to be allowed to, by that role's policy, the same as on real AWS. See
592
+ [simulated Lambda](https://yulinsim.dev/services/lambda/ "Simulated Lambda docs") for how function code and execution roles
593
+ work.
594
+
595
+ The same applies to `SimSdk` interception. Intercepting `SecretsManagerClient` routes ordinary SDK
596
+ code into the simulation, served in process. See
597
+ [AWS SDK interception](https://yulinsim.dev/sdk/ "Simulated AWS SDK docs").
598
+
599
+ ## Available functionality
600
+
601
+ Sim Secrets Manager currently supports:
602
+
603
+ - `CreateSecretCommand`, holding either a string or binary
604
+ - `GetSecretValueCommand`, by staging label or by version id
605
+ - `PutSecretValueCommand` and `UpdateSecretCommand`, each writing a new version
606
+ - `DescribeSecretCommand` and `ListSecretsCommand`
607
+ - `DeleteSecretCommand`, with a recovery window, and `RestoreSecretCommand`
608
+ - `AWSCURRENT` and `AWSPREVIOUS` staging labels, and custom labels
609
+ - Secret ARNs carrying the six random characters real Secrets Manager appends
610
+ - Friendly names, full ARNs and partial ARNs as interchangeable ways to name a secret
611
+ - Authorization of every operation by simulated IAM, against the real IAM action
612
+ - Encryption of every version through simulated KMS, under `KmsKeyId` or the `aws/secretsmanager`
613
+ managed key
614
+ - Calls made from inside a simulated Lambda handler, authorized as the function's execution role
615
+ - The `AWS::SecretsManager::Secret` CloudFormation resource, including `GenerateSecretString`
616
+ - `{{resolve:secretsmanager:...}}` dynamic references in CloudFormation resource properties, by
617
+ JSON key, by staging label and by version id
618
+ - A dynamic reference carrying a full ARN reading the account that ARN names
619
+
620
+ ## Limitations
621
+
622
+ Current documented limitations:
623
+
624
+ - A `KmsKeyId` is checked when a version is written under it, not when it is set on its own. An
625
+ `UpdateSecret` changing only the key accepts a key that is absent, and the next write of a value
626
+ fails.
627
+ - A secret name ending in a hyphen and six alphanumeric characters is refused. That is stricter than
628
+ AWS, which only advises against such names, because they cannot be told apart from an ARN's
629
+ resource part when a partial ARN is resolved. This rules out ordinary-looking names such as
630
+ `app-secret` and `prod-config`, since `secret` and `config` are six characters. Name them
631
+ `app-credentials` or `prod-settings` instead.
632
+ - `RotateSecret`, `CancelRotateSecret` and the rotation Lambda protocol are left out.
633
+ `DescribeSecret` always reports `RotationEnabled` as `false`.
634
+ - `AWS::SecretsManager::Secret` supports `Name`, `Description`, `KmsKeyId`, `SecretString`,
635
+ `GenerateSecretString` and `Tags`. `ReplicaRegions` is ignored. The other resource types
636
+ (`SecretTargetAttachment`, `RotationSchedule` and `ResourcePolicy`) are reported as unsupported
637
+ and skipped.
638
+ - A template declaring neither `SecretString` nor `GenerateSecretString` is refused, which is
639
+ stricter than real CloudFormation. Real CloudFormation creates an empty secret in that case, and a
640
+ secret with no version is outside this simulation.
641
+ - `ExcludeCharacters` that removes every character of an included type is refused. Generating a
642
+ password missing a type it was told to include would be worse.
643
+ - A `{{resolve:secretsmanager:...}}` dynamic reference resolves to a marker while the rest of the
644
+ resource's properties resolve around it, and the value replaces the marker once Secrets Manager
645
+ has answered. An intrinsic function reading the string in between, such as an `Fn::Split` over a
646
+ reference, sees the marker.
647
+ - Resource policies (`PutResourcePolicy`, `GetResourcePolicy`, `DeleteResourcePolicy`,
648
+ `ValidateResourcePolicy`) are left out, and cross-account access to a secret cannot be granted.
649
+ - Replica regions are left out. `AddReplicaRegions`, `ReplicateSecretToRegions` and
650
+ `RemoveRegionsFromReplication` do nothing, and `ReplicationStatus` goes unreported.
651
+ - `BatchGetSecretValue` is absent, as is the Parameters and Secrets Lambda Extension HTTP endpoint.
652
+ - `ListSecrets` refuses `Filters`, `SortOrder` and `SortBy` outright, since quietly returning an
653
+ unfiltered or differently ordered list would be worse. Secrets are listed in creation order, with
654
+ `MaxResults` and `NextToken` paging over them. A `NextToken` this simulation did not issue,
655
+ including one whose offset is past the end of the list, is refused rather than answered with an
656
+ empty page.
657
+ - Tags are stored and reported by `DescribeSecret` and `ListSecrets`, but `TagResource` and
658
+ `UntagResource` are absent, and the `secretsmanager:ResourceTag` and `aws:ResourceTag` condition
659
+ keys are left underived.
660
+ - Other Secrets Manager condition keys, such as `secretsmanager:SecretId` and
661
+ `secretsmanager:VersionStage`, are left underived too, and a policy relying on them fails to match.
662
+ Ordinary condition operators on values sim IAM does supply work as usual.
663
+ - A version that loses every staging label is kept indefinitely and stays readable by version id,
664
+ where real Secrets Manager removes it after about a day. It is left out of `VersionIdsToStages`
665
+ either way.
666
+ - `LastAccessedDate`, `LastRotatedDate`, `NextRotationDate`, `OwningService` and `PrimaryRegion` go
667
+ unreported.
668
+ - Secret values live in process memory for the lifetime of the `SimAws` instance. Anything sharing
669
+ the process can reach them.
670
+ - Secrets Manager is not served as an HTTP API by `serveSimAws`.