@fjall/components-infrastructure 0.88.1 → 0.88.3

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 (33) hide show
  1. package/dist/lib/app.d.ts +1 -1
  2. package/dist/lib/app.js +5 -4
  3. package/dist/lib/config/aws/identityCenter.d.ts +4 -4
  4. package/dist/lib/config/aws/identityCenter.js +17 -62
  5. package/dist/lib/config/aws/identityCenterGroupMembership.js +27 -37
  6. package/dist/lib/config/aws/index.d.ts +0 -7
  7. package/dist/lib/config/aws/index.js +1 -8
  8. package/dist/lib/layers/layers/secrets-resolver/bin/resolve-secrets +30 -0
  9. package/dist/lib/layers/layers/secrets-resolver/bin/resolve-secrets.mjs +212 -0
  10. package/dist/lib/layers/secrets-resolver/bin/resolve-secrets +30 -0
  11. package/dist/lib/layers/secrets-resolver/bin/resolve-secrets.mjs +212 -0
  12. package/dist/lib/patterns/aws/account.js +24 -10
  13. package/dist/lib/patterns/aws/database.d.ts +2 -2
  14. package/dist/lib/patterns/aws/database.js +3 -3
  15. package/dist/lib/patterns/aws/organisation.d.ts +4 -17
  16. package/dist/lib/patterns/aws/organisation.js +7 -65
  17. package/dist/lib/patterns/aws/payload.js +5 -5
  18. package/dist/lib/resources/aws/compute/lambda.d.ts +12 -1
  19. package/dist/lib/resources/aws/compute/lambda.js +37 -10
  20. package/dist/lib/resources/aws/database/rdsAurora.js +2 -2
  21. package/dist/lib/resources/aws/iam/identityCenter/assignment.d.ts +0 -2
  22. package/dist/lib/resources/aws/iam/identityCenter/assignment.js +9 -45
  23. package/dist/lib/resources/aws/iam/identityCenter/group.d.ts +1 -3
  24. package/dist/lib/resources/aws/iam/identityCenter/group.js +7 -82
  25. package/dist/lib/resources/aws/iam/identityCenter/permissionSet.d.ts +1 -3
  26. package/dist/lib/resources/aws/iam/identityCenter/permissionSet.js +9 -93
  27. package/dist/lib/resources/aws/networking/ipamPool.js +56 -3
  28. package/dist/lib/resources/aws/secrets/parameter.js +5 -3
  29. package/dist/lib/resources/aws/storage/ecr.js +2 -4
  30. package/dist/lib/utils/getConfig.d.ts +4 -1
  31. package/dist/lib/utils/getConfig.js +1 -1
  32. package/dist/lib/utils/resourceNaming.js +4 -7
  33. package/package.json +5 -5
@@ -4,6 +4,8 @@ exports.IdentityCenterGroupMembership = void 0;
4
4
  const aws_cdk_lib_1 = require("aws-cdk-lib");
5
5
  const customResources = require("aws-cdk-lib/custom-resources");
6
6
  const awsCustomResource_1 = require("../../resources/aws/utilities/awsCustomResource");
7
+ const IDENTITY_STORE_SERVICE = "identityStore";
8
+ const IDENTITY_CENTER_USERS_RESOURCE_TYPE = "Custom::IdentityCenterUsers";
7
9
  // TODO: This requires a deletion and recreation to update
8
10
  class IdentityCenterGroupMembership extends aws_cdk_lib_1.NestedStack {
9
11
  constructor(scope, id, props) {
@@ -18,40 +20,28 @@ class IdentityCenterGroupMembership extends aws_cdk_lib_1.NestedStack {
18
20
  .join("") +
19
21
  props.groupName.charAt(0).toUpperCase() +
20
22
  props.groupName.slice(1);
21
- const listUser = new awsCustomResource_1.AwsCustomResource(this, `ListUsersResource${memberGroup}`, {
22
- onCreate: {
23
- service: "identityStore",
24
- action: "listUsers",
25
- parameters: {
26
- IdentityStoreId: identityStoreId,
27
- Filters: [
28
- {
29
- AttributePath: "UserName",
30
- AttributeValue: member
31
- }
32
- ]
33
- },
34
- physicalResourceId: customResources.PhysicalResourceId.of(`listUsers${memberGroup}`)
23
+ const listUsersCall = {
24
+ service: IDENTITY_STORE_SERVICE,
25
+ action: "listUsers",
26
+ parameters: {
27
+ IdentityStoreId: identityStoreId,
28
+ Filters: [
29
+ {
30
+ AttributePath: "UserName",
31
+ AttributeValue: member
32
+ }
33
+ ]
35
34
  },
36
- onUpdate: {
37
- service: "identityStore",
38
- action: "listusers",
39
- parameters: {
40
- IdentityStoreId: identityStoreId,
41
- Filters: [
42
- {
43
- AttributePath: "UserName",
44
- AttributeValue: member
45
- }
46
- ]
47
- },
48
- physicalResourceId: customResources.PhysicalResourceId.of(`listUsers${memberGroup}`)
49
- }
35
+ physicalResourceId: customResources.PhysicalResourceId.of(`listUsers${memberGroup}`)
36
+ };
37
+ const listUser = new awsCustomResource_1.AwsCustomResource(this, `ListUsersResource${memberGroup}`, {
38
+ onCreate: listUsersCall,
39
+ onUpdate: listUsersCall
50
40
  });
51
41
  const userId = listUser.getResponseField("Users.0.UserId");
52
42
  const groupMembershipId = new awsCustomResource_1.AwsCustomResource(this, `CreateGroupMembershipResource${memberGroup}`, {
53
43
  onCreate: {
54
- service: "identityStore",
44
+ service: IDENTITY_STORE_SERVICE,
55
45
  action: "createGroupMembership",
56
46
  parameters: {
57
47
  GroupId: groupId,
@@ -62,11 +52,11 @@ class IdentityCenterGroupMembership extends aws_cdk_lib_1.NestedStack {
62
52
  },
63
53
  physicalResourceId: customResources.PhysicalResourceId.of(`createGroupMembership${memberGroup}`)
64
54
  },
65
- resourceType: "Custom::IdentityCenterUsers"
55
+ resourceType: IDENTITY_CENTER_USERS_RESOURCE_TYPE
66
56
  });
67
57
  const refreshMembership = new awsCustomResource_1.AwsCustomResource(this, `RefreshMembershipResource${memberGroup}`, {
68
58
  onUpdate: {
69
- service: "identityStore",
59
+ service: IDENTITY_STORE_SERVICE,
70
60
  action: "deleteGroupMembership",
71
61
  parameters: {
72
62
  IdentityStoreId: identityStoreId,
@@ -74,11 +64,11 @@ class IdentityCenterGroupMembership extends aws_cdk_lib_1.NestedStack {
74
64
  },
75
65
  physicalResourceId: customResources.PhysicalResourceId.of(`refreshGroupMembership${memberGroup}`)
76
66
  },
77
- resourceType: "Custom::IdentityCenterUsers"
67
+ resourceType: IDENTITY_CENTER_USERS_RESOURCE_TYPE
78
68
  });
79
69
  const recreateMembership = new awsCustomResource_1.AwsCustomResource(this, `RecreateGroupMembershipResource${memberGroup}`, {
80
70
  onUpdate: {
81
- service: "identityStore",
71
+ service: IDENTITY_STORE_SERVICE,
82
72
  action: "createGroupMembership",
83
73
  parameters: {
84
74
  GroupId: groupId,
@@ -89,22 +79,22 @@ class IdentityCenterGroupMembership extends aws_cdk_lib_1.NestedStack {
89
79
  },
90
80
  physicalResourceId: customResources.PhysicalResourceId.of(`recreateGroupMembership${memberGroup}`)
91
81
  },
92
- resourceType: "Custom::IdentityCenterUsers"
82
+ resourceType: IDENTITY_CENTER_USERS_RESOURCE_TYPE
93
83
  });
94
84
  refreshMembership.node.addDependency(recreateMembership);
95
85
  new awsCustomResource_1.AwsCustomResource(this, `DeleteGroupMembershipResource${memberGroup}`, {
96
86
  onDelete: {
97
- service: "identityStore",
87
+ service: IDENTITY_STORE_SERVICE,
98
88
  action: "deleteGroupMembership",
99
89
  parameters: {
100
90
  IdentityStoreId: identityStoreId,
101
91
  MembershipId: groupMembershipId.getResponseField("MembershipId")
102
92
  }
103
93
  },
104
- resourceType: "Custom::IdentityCenterUsers"
94
+ resourceType: IDENTITY_CENTER_USERS_RESOURCE_TYPE
105
95
  });
106
96
  }
107
97
  }
108
98
  }
109
99
  exports.IdentityCenterGroupMembership = IdentityCenterGroupMembership;
110
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpdHlDZW50ZXJHcm91cE1lbWJlcnNoaXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvY29uZmlnL2F3cy9pZGVudGl0eUNlbnRlckdyb3VwTWVtYmVyc2hpcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBK0Q7QUFDL0QsZ0VBQWdFO0FBQ2hFLHVGQUFvRjtBQVFwRiwwREFBMEQ7QUFDMUQsTUFBYSw2QkFBOEIsU0FBUSx5QkFBVztJQUM1RCxZQUNFLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixLQUF5QztRQUV6QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLE1BQU0sZUFBZSxHQUFHLGdCQUFFLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDMUQsTUFBTSxPQUFPLEdBQUcsZ0JBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxTQUFTLENBQUMsQ0FBQztRQUU1RCxLQUFLLE1BQU0sTUFBTSxJQUFJLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN4QyxNQUFNLFdBQVcsR0FDZixNQUFNO2lCQUNILEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ2IsS0FBSyxDQUFDLGNBQWMsQ0FBQztpQkFDckIsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzNELElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ1gsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFO2dCQUN2QyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUUzQixNQUFNLFFBQVEsR0FBRyxJ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QUksRUFDSixnQ0FBZ0MsV0FBVyxFQUFFLEVBQzdDO2dCQUNFLFFBQVEsRUFBRTtvQkFDUixPQUFPLEVBQUUsZUFBZTtvQkFDeEIsTUFBTSxFQUFFLHVCQUF1QjtvQkFDL0IsVUFBVSxFQUFFO3dCQUNWLGVBQWUsRUFBRSxlQUFlO3dCQUNoQyxZQUFZLEVBQUUsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDO3FCQUNqRTtpQkFDRjtnQkFDRCxZQUFZLEVBQUUsNkJBQTZCO2FBQzVDLENBQ0YsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFoSkQsc0VBZ0pDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRm4sIE5lc3RlZFN0YWNrLCB0eXBlIFN0YWNrUHJvcHMgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCAqIGFzIGN1c3RvbVJlc291cmNlcyBmcm9tIFwiYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlc1wiO1xuaW1wb3J0IHsgQXdzQ3VzdG9tUmVzb3VyY2UgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy91dGlsaXRpZXMvYXdzQ3VzdG9tUmVzb3VyY2VcIjtcbmltcG9ydCB7IHR5cGUgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuaW50ZXJmYWNlIElkZW50aXR5Q2VudGVyR3JvdXBNZW1iZXJzaGlwUHJvcHMgZXh0ZW5kcyBTdGFja1Byb3BzIHtcbiAgZ3JvdXBOYW1lOiBzdHJpbmc7XG4gIGdyb3VwTWVtYmVyczogc3RyaW5nW107XG59XG5cbi8vIFRPRE86IFRoaXMgcmVxdWlyZXMgYSBkZWxldGlvbiBhbmQgcmVjcmVhdGlvbiB0byB1cGRhdGVcbmV4cG9ydCBjbGFzcyBJZGVudGl0eUNlbnRlckdyb3VwTWVtYmVyc2hpcCBleHRlbmRzIE5lc3RlZFN0YWNrIHtcbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBJZGVudGl0eUNlbnRlckdyb3VwTWVtYmVyc2hpcFByb3BzXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCBpZGVudGl0eVN0b3JlSWQgPSBGbi5pbXBvcnRWYWx1ZShcImlkZW50aXR5U3RvcmVJZFwiKTtcbiAgICBjb25zdCBncm91cElkID0gRm4uaW1wb3J0VmFsdWUoYCR7cHJvcHMuZ3JvdXBOYW1lfUdyb3VwSWRgKTtcblxuICAgIGZvciAoY29uc3QgbWVtYmVyIG9mIHByb3BzLmdyb3VwTWVtYmVycykge1xuICAgICAgY29uc3QgbWVtYmVyR3JvdXAgPVxuICAgICAgICBtZW1iZXJcbiAgICAgICAgICAuc3BsaXQoXCJAXCIpWzBdXG4gICAgICAgICAgLnNwbGl0KC9bXmEtekEtWjAtOV0vKVxuICAgICAgICAgIC5tYXAoKHBhcnQpID0+IHBhcnQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwYXJ0LnNsaWNlKDEpKVxuICAgICAgICAgIC5qb2luKFwiXCIpICtcbiAgICAgICAgcHJvcHMuZ3JvdXBOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICtcbiAgICAgICAgcHJvcHMuZ3JvdXBOYW1lLnNsaWNlKDEpO1xuXG4gICAgICBjb25zdCBsaXN0VXNlciA9IG5ldyBBd3NDdXN0b21SZXNvdXJjZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYExpc3RVc2Vyc1Jlc291cmNlJHttZW1iZXJHcm91cH1gLFxuICAgICAgICB7XG4gICAgICAgICAgb25DcmVhdGU6IHtcbiAgICAgICAgICAgIHNlcnZpY2U6IFwiaWRlbnRpdHlTdG9yZVwiLFxuICAgICAgICAgICAgYWN0aW9uOiBcImxpc3RVc2Vyc1wiLFxuICAgICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICBJZGVudGl0eVN0b3JlSWQ6IGlkZW50aXR5U3RvcmVJZCxcbiAgICAgICAgICAgICAgRmlsdGVyczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZVBhdGg6IFwiVXNlck5hbWVcIixcbiAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZVZhbHVlOiBtZW1iZXJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6IGN1c3RvbVJlc291cmNlcy5QaHlzaWNhbFJlc291cmNlSWQub2YoXG4gICAgICAgICAgICAgIGBsaXN0VXNlcnMke21lbWJlckdyb3VwfWBcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uVXBkYXRlOiB7XG4gICAgICAgICAgICBzZXJ2aWNlOiBcImlkZW50aXR5U3RvcmVcIixcbiAgICAgICAgICAgIGFjdGlvbjogXCJsaXN0dXNlcnNcIixcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgSWRlbnRpdHlTdG9yZUlkOiBpZGVudGl0eVN0b3JlSWQsXG4gICAgICAgICAgICAgIEZpbHRlcnM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVQYXRoOiBcIlVzZXJOYW1lXCIsXG4gICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVWYWx1ZTogbWVtYmVyXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOiBjdXN0b21SZXNvdXJjZXMuUGh5c2ljYWxSZXNvdXJjZUlkLm9mKFxuICAgICAgICAgICAgICBgbGlzdFVzZXJzJHttZW1iZXJHcm91cH1gXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBjb25zdCB1c2VySWQgPSBsaXN0VXNlci5nZXRSZXNwb25zZUZpZWxkKFwiVXNlcnMuMC5Vc2VySWRcIik7XG5cbiAgICAgIGNvbnN0IGdyb3VwTWVtYmVyc2hpcElkID0gbmV3IEF3c0N1c3RvbVJlc291cmNlKFxuICAgICAgICB0aGlzLFxuICAgICAgICBgQ3JlYXRlR3JvdXBNZW1iZXJzaGlwUmVzb3VyY2Uke21lbWJlckdyb3VwfWAsXG4gICAgICAgIHtcbiAgICAgICAgICBvbkNyZWF0ZToge1xuICAgICAgICAgICAgc2VydmljZTogXCJpZGVudGl0eVN0b3JlXCIsXG4gICAgICAgICAgICBhY3Rpb246IFwiY3JlYXRlR3JvdXBNZW1iZXJzaGlwXCIsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgIEdyb3VwSWQ6IGdyb3VwSWQsXG4gICAgICAgICAgICAgIElkZW50aXR5U3RvcmVJZDogaWRlbnRpdHlTdG9yZUlkLFxuICAgICAgICAgICAgICBNZW1iZXJJZDoge1xuICAgICAgICAgICAgICAgIFVzZXJJZDogdXNlcklkXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6IGN1c3RvbVJlc291cmNlcy5QaHlzaWNhbFJlc291cmNlSWQub2YoXG4gICAgICAgICAgICAgIGBjcmVhdGVHcm91cE1lbWJlcnNoaXAke21lbWJlckdyb3VwfWBcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc291cmNlVHlwZTogXCJDdXN0b206OklkZW50aXR5Q2VudGVyVXNlcnNcIlxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBjb25zdCByZWZyZXNoTWVtYmVyc2hpcCA9IG5ldyBBd3NDdXN0b21SZXNvdXJjZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYFJlZnJlc2hNZW1iZXJzaGlwUmVzb3VyY2Uke21lbWJlckdyb3VwfWAsXG4gICAgICAgIHtcbiAgICAgICAgICBvblVwZGF0ZToge1xuICAgICAgICAgICAgc2VydmljZTogXCJpZGVudGl0eVN0b3JlXCIsXG4gICAgICAgICAgICBhY3Rpb246IFwiZGVsZXRlR3JvdXBNZW1iZXJzaGlwXCIsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgIElkZW50aXR5U3RvcmVJZDogaWRlbnRpdHlTdG9yZUlkLFxuICAgICAgICAgICAgICBNZW1iZXJzaGlwSWQ6IGdyb3VwTWVtYmVyc2hpcElkLmdldFJlc3BvbnNlRmllbGQoXCJNZW1iZXJzaGlwSWRcIilcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6IGN1c3RvbVJlc291cmNlcy5QaHlzaWNhbFJlc291cmNlSWQub2YoXG4gICAgICAgICAgICAgIGByZWZyZXNoR3JvdXBNZW1iZXJzaGlwJHttZW1iZXJHcm91cH1gXG4gICAgICAgICAgICApXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNvdXJjZVR5cGU6IFwiQ3VzdG9tOjpJZGVudGl0eUNlbnRlclVzZXJzXCJcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgY29uc3QgcmVjcmVhdGVNZW1iZXJzaGlwID0gbmV3IEF3c0N1c3RvbVJlc291cmNlKFxuICAgICAgICB0aGlzLFxuICAgICAgICBgUmVjcmVhdGVHcm91cE1lbWJlcnNoaXBSZXNvdXJjZSR7bWVtYmVyR3JvdXB9YCxcbiAgICAgICAge1xuICAgICAgICAgIG9uVXBkYXRlOiB7XG4gICAgICAgICAgICBzZXJ2aWNlOiBcImlkZW50aXR5U3RvcmVcIixcbiAgICAgICAgICAgIGFjdGlvbjogXCJjcmVhdGVHcm91cE1lbWJlcnNoaXBcIixcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgR3JvdXBJZDogZ3JvdXBJZCxcbiAgICAgICAgICAgICAgSWRlbnRpdHlTdG9yZUlkOiBpZGVudGl0eVN0b3JlSWQsXG4gICAgICAgICAgICAgIE1lbWJlcklkOiB7XG4gICAgICAgICAgICAgICAgVXNlcklkOiB1c2VySWRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogY3VzdG9tUmVzb3VyY2VzLlBoeXNpY2FsUmVzb3VyY2VJZC5vZihcbiAgICAgICAgICAgICAgYHJlY3JlYXRlR3JvdXBNZW1iZXJzaGlwJHttZW1iZXJHcm91cH1gXG4gICAgICAgICAgICApXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNvdXJjZVR5cGU6IFwiQ3VzdG9tOjpJZGVudGl0eUNlbnRlclVzZXJzXCJcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgcmVmcmVzaE1lbWJlcnNoaXAubm9kZS5hZGREZXBlbmRlbmN5KHJlY3JlYXRlTWVtYmVyc2hpcCk7XG5cbiAgICAgIG5ldyBBd3NDdXN0b21SZXNvdXJjZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYERlbGV0ZUdyb3VwTWVtYmVyc2hpcFJlc291cmNlJHttZW1iZXJHcm91cH1gLFxuICAgICAgICB7XG4gICAgICAgICAgb25EZWxldGU6IHtcbiAgICAgICAgICAgIHNlcnZpY2U6IFwiaWRlbnRpdHlTdG9yZVwiLFxuICAgICAgICAgICAgYWN0aW9uOiBcImRlbGV0ZUdyb3VwTWVtYmVyc2hpcFwiLFxuICAgICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICBJZGVudGl0eVN0b3JlSWQ6IGlkZW50aXR5U3RvcmVJZCxcbiAgICAgICAgICAgICAgTWVtYmVyc2hpcElkOiBncm91cE1lbWJlcnNoaXBJZC5nZXRSZXNwb25zZUZpZWxkKFwiTWVtYmVyc2hpcElkXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNvdXJjZVR5cGU6IFwiQ3VzdG9tOjpJZGVudGl0eUNlbnRlclVzZXJzXCJcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
100
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpdHlDZW50ZXJHcm91cE1lbWJlcnNoaXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvY29uZmlnL2F3cy9pZGVudGl0eUNlbnRlckdyb3VwTWVtYmVyc2hpcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBK0Q7QUFDL0QsZ0VBQWdFO0FBQ2hFLHVGQUFvRjtBQVFwRixNQUFNLHNCQUFzQixHQUFHLGVBQWUsQ0FBQztBQUMvQyxNQUFNLG1DQUFtQyxHQUFHLDZCQUE2QixDQUFDO0FBRTFFLDBEQUEwRDtBQUMxRCxNQUFhLDZCQUE4QixTQUFRLHlCQUFXO0lBQzVELFlBQ0UsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLEtBQXlDO1FBRXpDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsTUFBTSxlQUFlLEdBQUcsZ0JBQUUsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMxRCxNQUFNLE9BQU8sR0FBRyxnQkFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxTQUFTLFNBQVMsQ0FBQyxDQUFDO1FBRTVELEtBQUssTUFBTSxNQUFNLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hDLE1BQU0sV0FBVyxHQUNmLE1BQU07aUJBQ0gsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDYixLQUFLLENBQUMsY0FBYyxDQUFDO2lCQUNyQixHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDM0QsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDWCxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUU7Z0JBQ3ZD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O3dCQUNoQyxZQUFZLEVBQUUsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDO3FCQUNqRTtpQkFDRjtnQkFDRCxZQUFZLEVBQUUsbUNBQW1DO2FBQ2xELENBQ0YsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFuSUQsc0VBbUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRm4sIE5lc3RlZFN0YWNrLCB0eXBlIFN0YWNrUHJvcHMgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCAqIGFzIGN1c3RvbVJlc291cmNlcyBmcm9tIFwiYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlc1wiO1xuaW1wb3J0IHsgQXdzQ3VzdG9tUmVzb3VyY2UgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy91dGlsaXRpZXMvYXdzQ3VzdG9tUmVzb3VyY2VcIjtcbmltcG9ydCB7IHR5cGUgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuaW50ZXJmYWNlIElkZW50aXR5Q2VudGVyR3JvdXBNZW1iZXJzaGlwUHJvcHMgZXh0ZW5kcyBTdGFja1Byb3BzIHtcbiAgZ3JvdXBOYW1lOiBzdHJpbmc7XG4gIGdyb3VwTWVtYmVyczogc3RyaW5nW107XG59XG5cbmNvbnN0IElERU5USVRZX1NUT1JFX1NFUlZJQ0UgPSBcImlkZW50aXR5U3RvcmVcIjtcbmNvbnN0IElERU5USVRZX0NFTlRFUl9VU0VSU19SRVNPVVJDRV9UWVBFID0gXCJDdXN0b206OklkZW50aXR5Q2VudGVyVXNlcnNcIjtcblxuLy8gVE9ETzogVGhpcyByZXF1aXJlcyBhIGRlbGV0aW9uIGFuZCByZWNyZWF0aW9uIHRvIHVwZGF0ZVxuZXhwb3J0IGNsYXNzIElkZW50aXR5Q2VudGVyR3JvdXBNZW1iZXJzaGlwIGV4dGVuZHMgTmVzdGVkU3RhY2sge1xuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IElkZW50aXR5Q2VudGVyR3JvdXBNZW1iZXJzaGlwUHJvcHNcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IGlkZW50aXR5U3RvcmVJZCA9IEZuLmltcG9ydFZhbHVlKFwiaWRlbnRpdHlTdG9yZUlkXCIpO1xuICAgIGNvbnN0IGdyb3VwSWQgPSBGbi5pbXBvcnRWYWx1ZShgJHtwcm9wcy5ncm91cE5hbWV9R3JvdXBJZGApO1xuXG4gICAgZm9yIChjb25zdCBtZW1iZXIgb2YgcHJvcHMuZ3JvdXBNZW1iZXJzKSB7XG4gICAgICBjb25zdCBtZW1iZXJHcm91cCA9XG4gICAgICAgIG1lbWJlclxuICAgICAgICAgIC5zcGxpdChcIkBcIilbMF1cbiAgICAgICAgICAuc3BsaXQoL1teYS16QS1aMC05XS8pXG4gICAgICAgICAgLm1hcCgocGFydCkgPT4gcGFydC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHBhcnQuc2xpY2UoMSkpXG4gICAgICAgICAgLmpvaW4oXCJcIikgK1xuICAgICAgICBwcm9wcy5ncm91cE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgK1xuICAgICAgICBwcm9wcy5ncm91cE5hbWUuc2xpY2UoMSk7XG5cbiAgICAgIGNvbnN0IGxpc3RVc2Vyc0NhbGwgPSB7XG4gICAgICAgIHNlcnZpY2U6IElERU5USVRZX1NUT1JFX1NFUlZJQ0UsXG4gICAgICAgIGFjdGlvbjogXCJsaXN0VXNlcnNcIixcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIElkZW50aXR5U3RvcmVJZDogaWRlbnRpdHlTdG9yZUlkLFxuICAgICAgICAgIEZpbHRlcnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgQXR0cmlidXRlUGF0aDogXCJVc2VyTmFtZVwiLFxuICAgICAgICAgICAgICBBdHRyaWJ1dGVWYWx1ZTogbWVtYmVyXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6IGN1c3RvbVJlc291cmNlcy5QaHlzaWNhbFJlc291cmNlSWQub2YoXG4gICAgICAgICAgYGxpc3RVc2VycyR7bWVtYmVyR3JvdXB9YFxuICAgICAgICApXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBsaXN0VXNlciA9IG5ldyBBd3NDdXN0b21SZXNvdXJjZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYExpc3RVc2Vyc1Jlc291cmNlJHttZW1iZXJHcm91cH1gLFxuICAgICAgICB7XG4gICAgICAgICAgb25DcmVhdGU6IGxpc3RVc2Vyc0NhbGwsXG4gICAgICAgICAgb25VcGRhdGU6IGxpc3RVc2Vyc0NhbGxcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgY29uc3QgdXNlcklkID0gbGlzdFVzZXIuZ2V0UmVzcG9uc2VGaWVsZChcIlVzZXJzLjAuVXNlcklkXCIpO1xuXG4gICAgICBjb25zdCBncm91cE1lbWJlcnNoaXBJZCA9IG5ldyBBd3NDdXN0b21SZXNvdXJjZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYENyZWF0ZUdyb3VwTWVtYmVyc2hpcFJlc291cmNlJHttZW1iZXJHcm91cH1gLFxuICAgICAgICB7XG4gICAgICAgICAgb25DcmVhdGU6IHtcbiAgICAgICAgICAgIHNlcnZpY2U6IElERU5USVRZX1NUT1JFX1NFUlZJQ0UsXG4gICAgICAgICAgICBhY3Rpb246IFwiY3JlYXRlR3JvdXBNZW1iZXJzaGlwXCIsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgIEdyb3VwSWQ6IGdyb3VwSWQsXG4gICAgICAgICAgICAgIElkZW50aXR5U3RvcmVJZDogaWRlbnRpdHlTdG9yZUlkLFxuICAgICAgICAgICAgICBNZW1iZXJJZDoge1xuICAgICAgICAgICAgICAgIFVzZXJJZDogdXNlcklkXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6IGN1c3RvbVJlc291cmNlcy5QaHlzaWNhbFJlc291cmNlSWQub2YoXG4gICAgICAgICAgICAgIGBjcmVhdGVHcm91cE1lbWJlcnNoaXAke21lbWJlckdyb3VwfWBcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc291cmNlVHlwZTogSURFTlRJVFlfQ0VOVEVSX1VTRVJTX1JFU09VUkNFX1RZUEVcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgY29uc3QgcmVmcmVzaE1lbWJlcnNoaXAgPSBuZXcgQXdzQ3VzdG9tUmVzb3VyY2UoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGBSZWZyZXNoTWVtYmVyc2hpcFJlc291cmNlJHttZW1iZXJHcm91cH1gLFxuICAgICAgICB7XG4gICAgICAgICAgb25VcGRhdGU6IHtcbiAgICAgICAgICAgIHNlcnZpY2U6IElERU5USVRZX1NUT1JFX1NFUlZJQ0UsXG4gICAgICAgICAgICBhY3Rpb246IFwiZGVsZXRlR3JvdXBNZW1iZXJzaGlwXCIsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgIElkZW50aXR5U3RvcmVJZDogaWRlbnRpdHlTdG9yZUlkLFxuICAgICAgICAgICAgICBNZW1iZXJzaGlwSWQ6IGdyb3VwTWVtYmVyc2hpcElkLmdldFJlc3BvbnNlRmllbGQoXCJNZW1iZXJzaGlwSWRcIilcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6IGN1c3RvbVJlc291cmNlcy5QaHlzaWNhbFJlc291cmNlSWQub2YoXG4gICAgICAgICAgICAgIGByZWZyZXNoR3JvdXBNZW1iZXJzaGlwJHttZW1iZXJHcm91cH1gXG4gICAgICAgICAgICApXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNvdXJjZVR5cGU6IElERU5USVRZX0NFTlRFUl9VU0VSU19SRVNPVVJDRV9UWVBFXG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHJlY3JlYXRlTWVtYmVyc2hpcCA9IG5ldyBBd3NDdXN0b21SZXNvdXJjZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYFJlY3JlYXRlR3JvdXBNZW1iZXJzaGlwUmVzb3VyY2Uke21lbWJlckdyb3VwfWAsXG4gICAgICAgIHtcbiAgICAgICAgICBvblVwZGF0ZToge1xuICAgICAgICAgICAgc2VydmljZTogSURFTlRJVFlfU1RPUkVfU0VSVklDRSxcbiAgICAgICAgICAgIGFjdGlvbjogXCJjcmVhdGVHcm91cE1lbWJlcnNoaXBcIixcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgR3JvdXBJZDogZ3JvdXBJZCxcbiAgICAgICAgICAgICAgSWRlbnRpdHlTdG9yZUlkOiBpZGVudGl0eVN0b3JlSWQsXG4gICAgICAgICAgICAgIE1lbWJlcklkOiB7XG4gICAgICAgICAgICAgICAgVXNlcklkOiB1c2VySWRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogY3VzdG9tUmVzb3VyY2VzLlBoeXNpY2FsUmVzb3VyY2VJZC5vZihcbiAgICAgICAgICAgICAgYHJlY3JlYXRlR3JvdXBNZW1iZXJzaGlwJHttZW1iZXJHcm91cH1gXG4gICAgICAgICAgICApXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNvdXJjZVR5cGU6IElERU5USVRZX0NFTlRFUl9VU0VSU19SRVNPVVJDRV9UWVBFXG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIHJlZnJlc2hNZW1iZXJzaGlwLm5vZGUuYWRkRGVwZW5kZW5jeShyZWNyZWF0ZU1lbWJlcnNoaXApO1xuXG4gICAgICBuZXcgQXdzQ3VzdG9tUmVzb3VyY2UoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGBEZWxldGVHcm91cE1lbWJlcnNoaXBSZXNvdXJjZSR7bWVtYmVyR3JvdXB9YCxcbiAgICAgICAge1xuICAgICAgICAgIG9uRGVsZXRlOiB7XG4gICAgICAgICAgICBzZXJ2aWNlOiBJREVOVElUWV9TVE9SRV9TRVJWSUNFLFxuICAgICAgICAgICAgYWN0aW9uOiBcImRlbGV0ZUdyb3VwTWVtYmVyc2hpcFwiLFxuICAgICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICBJZGVudGl0eVN0b3JlSWQ6IGlkZW50aXR5U3RvcmVJZCxcbiAgICAgICAgICAgICAgTWVtYmVyc2hpcElkOiBncm91cE1lbWJlcnNoaXBJZC5nZXRSZXNwb25zZUZpZWxkKFwiTWVtYmVyc2hpcElkXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNvdXJjZVR5cGU6IElERU5USVRZX0NFTlRFUl9VU0VSU19SRVNPVVJDRV9UWVBFXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -1,11 +1,4 @@
1
- export * from "./backupGlobalSettings";
2
- export * from "./costAllocationTags";
3
1
  export * from "./identityCenter";
4
2
  export * from "./ipam";
5
- export * from "./ipamDelegateAdmin";
6
- export * from "./ipamPoolId";
7
- export * from "./ramSharing";
8
- export * from "./accountId";
9
3
  export * from "./ecrDefaultImage";
10
4
  export * from "./eventBus";
11
- export * from "./organisationId";
@@ -14,15 +14,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./backupGlobalSettings"), exports);
18
- __exportStar(require("./costAllocationTags"), exports);
19
17
  __exportStar(require("./identityCenter"), exports);
20
18
  __exportStar(require("./ipam"), exports);
21
- __exportStar(require("./ipamDelegateAdmin"), exports);
22
- __exportStar(require("./ipamPoolId"), exports);
23
- __exportStar(require("./ramSharing"), exports);
24
- __exportStar(require("./accountId"), exports);
25
19
  __exportStar(require("./ecrDefaultImage"), exports);
26
20
  __exportStar(require("./eventBus"), exports);
27
- __exportStar(require("./organisationId"), exports);
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvY29uZmlnL2F3cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEseURBQXVDO0FBQ3ZDLHVEQUFxQztBQUNyQyxtREFBaUM7QUFDakMseUNBQXVCO0FBQ3ZCLHNEQUFvQztBQUNwQywrQ0FBNkI7QUFDN0IsK0NBQTZCO0FBQzdCLDhDQUE0QjtBQUM1QixvREFBa0M7QUFDbEMsNkNBQTJCO0FBQzNCLG1EQUFpQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2JhY2t1cEdsb2JhbFNldHRpbmdzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb3N0QWxsb2NhdGlvblRhZ3NcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2lkZW50aXR5Q2VudGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9pcGFtXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9pcGFtRGVsZWdhdGVBZG1pblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vaXBhbVBvb2xJZFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmFtU2hhcmluZ1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vYWNjb3VudElkXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9lY3JEZWZhdWx0SW1hZ2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2V2ZW50QnVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9vcmdhbmlzYXRpb25JZFwiO1xuIl19
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvY29uZmlnL2F3cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbURBQWlDO0FBQ2pDLHlDQUF1QjtBQUN2QixvREFBa0M7QUFDbEMsNkNBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vaWRlbnRpdHlDZW50ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2lwYW1cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2VjckRlZmF1bHRJbWFnZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXZlbnRCdXNcIjtcbiJdfQ==
@@ -0,0 +1,30 @@
1
+ #!/bin/bash
2
+ # Fjall Secrets Resolver Wrapper
3
+ #
4
+ # Invoked by AWS_LAMBDA_EXEC_WRAPPER before the Lambda runtime starts.
5
+ # Calls the Node.js resolver to fetch secrets from the AWS Parameters and
6
+ # Secrets Extension, then execs into the original runtime bootstrap.
7
+ #
8
+ # The resolver outputs `export KEY='value'` lines which we eval to inject
9
+ # secrets as environment variables visible to the handler.
10
+
11
+ set -euo pipefail
12
+
13
+ # Only run resolver if secrets are configured
14
+ if [ -n "${SSM_SECRET_NAMES:-}" ] || env | grep -q '_SECRET_ARN='; then
15
+ RESOLVER_OUTPUT=$(/var/lang/bin/node /opt/bin/resolve-secrets.mjs)
16
+ if [ -n "$RESOLVER_OUTPUT" ]; then
17
+ # Validate each line matches `export NAME='...'` before eval to prevent
18
+ # accidental code execution if the resolver ever emits unexpected output
19
+ while IFS= read -r line; do
20
+ if [[ "$line" =~ ^export\ [a-zA-Z_][a-zA-Z0-9_]*= ]]; then
21
+ eval "$line"
22
+ else
23
+ echo "[fjall-resolver] Unexpected output from resolver: ${line:0:80}" >&2
24
+ exit 1
25
+ fi
26
+ done <<< "$RESOLVER_OUTPUT"
27
+ fi
28
+ fi
29
+
30
+ exec "$@"
@@ -0,0 +1,212 @@
1
+ /**
2
+ * Fjall Secrets Resolver — runs before Lambda handler via AWS_LAMBDA_EXEC_WRAPPER.
3
+ *
4
+ * Resolves secrets from two sources using the AWS Parameters and Secrets Extension
5
+ * HTTP cache at localhost:2773:
6
+ *
7
+ * 1. SSM Parameter Store (user-managed secrets via `fjall secrets set`)
8
+ * Reads SSM_SECRETS_PATH + SSM_SECRET_NAMES, fetches each parameter,
9
+ * exports as environment variables.
10
+ *
11
+ * 2. Secrets Manager (CDK-managed secrets, e.g. database credentials)
12
+ * Scans for *_SECRET_ARN env vars, fetches each secret,
13
+ * optionally extracts a JSON field via the matching *_SECRET_FIELD var,
14
+ * exports as the prefix (e.g. DATABASE_PASSWORD_SECRET_ARN → DATABASE_PASSWORD).
15
+ *
16
+ * Outputs `export KEY='value'` lines to stdout. The bash wrapper evals this output
17
+ * and then execs into the Lambda runtime.
18
+ *
19
+ * The Extension may not be ready immediately during INIT phase, so all HTTP
20
+ * calls use a retry loop with exponential backoff.
21
+ */
22
+
23
+ const EXTENSION_PORT = process.env.PARAMETERS_SECRETS_EXTENSION_HTTP_PORT || "2773";
24
+ const EXTENSION_URL = `http://localhost:${EXTENSION_PORT}`;
25
+ const MAX_RETRIES = 5;
26
+ const INITIAL_DELAY_MS = 100;
27
+ /** Per-request timeout — generous for localhost; total budget bounded by Lambda INIT timeout */
28
+ const REQUEST_TIMEOUT_MS = 2000;
29
+
30
+ /**
31
+ * Fetch from the Extension HTTP API with retry and exponential backoff.
32
+ * The Extension starts during INIT phase 1 (Extension init) and the wrapper
33
+ * runs during INIT phase 2 (Runtime init), so it is usually ready — but
34
+ * a retry loop handles the timing edge case.
35
+ */
36
+ async function fetchWithRetry(path) {
37
+ let delay = INITIAL_DELAY_MS;
38
+ let lastError;
39
+
40
+ for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
41
+ try {
42
+ const response = await fetch(`${EXTENSION_URL}${path}`, {
43
+ headers: {
44
+ "X-Aws-Parameters-Secrets-Token": process.env.AWS_SESSION_TOKEN,
45
+ },
46
+ signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
47
+ });
48
+ if (response.ok) {
49
+ return await response.json();
50
+ }
51
+ // 4xx errors (e.g. secret not found) — don't retry
52
+ if (response.status >= 400 && response.status < 500) {
53
+ const body = await response.text().catch(() => "");
54
+ const err = new Error(`Extension returned ${response.status}: ${body}`);
55
+ err.nonRetriable = true;
56
+ throw err;
57
+ }
58
+ // 5xx — retriable
59
+ const body = await response.text().catch(() => "");
60
+ lastError = new Error(`Extension returned ${response.status}: ${body}`);
61
+ } catch (err) {
62
+ if (err.nonRetriable) {
63
+ throw err;
64
+ }
65
+ lastError = err;
66
+ }
67
+
68
+ // Retry with backoff (both 5xx and network errors)
69
+ if (attempt < MAX_RETRIES - 1) {
70
+ await new Promise((r) => setTimeout(r, delay));
71
+ delay *= 2;
72
+ }
73
+ }
74
+
75
+ throw new Error(
76
+ `Failed to reach Extension after ${MAX_RETRIES} attempts: ${lastError?.message}`,
77
+ );
78
+ }
79
+
80
+ /**
81
+ * Escape a value for safe inclusion in a shell `export KEY='value'` statement.
82
+ * Single-quotes are the safest quoting mechanism — only embedded single-quotes
83
+ * need escaping via the close-reopen pattern: ' → '\''
84
+ */
85
+ function shellEscape(value) {
86
+ return "'" + value.replace(/'/g, "'\\''") + "'";
87
+ }
88
+
89
+ // POSIX env var names: letters, digits, underscores; must not start with a digit
90
+ const VALID_ENV_NAME = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
91
+
92
+ function assertValidEnvName(name, source) {
93
+ if (!VALID_ENV_NAME.test(name)) {
94
+ process.stderr.write(
95
+ `[fjall-resolver] Invalid env var name '${name}' from ${source}. ` +
96
+ `Names must match [a-zA-Z_][a-zA-Z0-9_]* (no dots or hyphens).\n`,
97
+ );
98
+ process.exit(1);
99
+ }
100
+ }
101
+
102
+ /**
103
+ * Resolve SSM Parameter Store secrets.
104
+ * Reads SSM_SECRETS_PATH and SSM_SECRET_NAMES, fetches each SecureString parameter.
105
+ */
106
+ async function resolveSsmSecrets() {
107
+ const basePath = process.env.SSM_SECRETS_PATH;
108
+ const secretNames = process.env.SSM_SECRET_NAMES;
109
+
110
+ if (!basePath || !secretNames) return [];
111
+
112
+ const names = secretNames.split(",").filter(Boolean);
113
+ const exports = [];
114
+
115
+ for (const name of names) {
116
+ assertValidEnvName(name, "SSM_SECRET_NAMES");
117
+ const paramPath = `${basePath}/${name}`;
118
+ const encodedPath = encodeURIComponent(paramPath);
119
+
120
+ try {
121
+ const data = await fetchWithRetry(
122
+ `/systemsmanager/parameters/get?name=${encodedPath}&withDecryption=true`,
123
+ );
124
+ const value = data?.Parameter?.Value;
125
+ if (value !== undefined && value !== null) {
126
+ exports.push(`export ${name}=${shellEscape(value)}`);
127
+ }
128
+ } catch (err) {
129
+ const msg = err instanceof Error ? err.message : String(err);
130
+ process.stderr.write(
131
+ `[fjall-resolver] Failed to resolve SSM parameter ${paramPath}: ${msg}\n`,
132
+ );
133
+ process.exit(1);
134
+ }
135
+ }
136
+
137
+ return exports;
138
+ }
139
+
140
+ /**
141
+ * Resolve Secrets Manager secrets.
142
+ * Scans for *_SECRET_ARN env vars, fetches each secret from SM,
143
+ * optionally extracts a JSON field, and exports as the prefix.
144
+ */
145
+ async function resolveSecretsManagerSecrets() {
146
+ const exports = [];
147
+
148
+ for (const [key, arn] of Object.entries(process.env)) {
149
+ if (!key.endsWith("_SECRET_ARN") || !arn) continue;
150
+
151
+ const prefix = key.slice(0, -"_SECRET_ARN".length);
152
+ assertValidEnvName(prefix, "Secrets Manager");
153
+ const fieldKey = `${prefix}_SECRET_FIELD`;
154
+ const field = process.env[fieldKey];
155
+
156
+ const encodedArn = encodeURIComponent(arn);
157
+
158
+ try {
159
+ const data = await fetchWithRetry(
160
+ `/secretsmanager/get?secretId=${encodedArn}`,
161
+ );
162
+
163
+ let value;
164
+ if (field && data?.SecretString) {
165
+ let parsed;
166
+ try {
167
+ parsed = JSON.parse(data.SecretString);
168
+ } catch {
169
+ throw new Error(
170
+ `Secret is not valid JSON but field '${field}' was requested. Store the secret as a JSON object.`,
171
+ );
172
+ }
173
+ value = parsed[field];
174
+ if (value === undefined) {
175
+ throw new Error(
176
+ `Field '${field}' not found in secret (${Object.keys(parsed).length} fields present).`,
177
+ );
178
+ }
179
+ } else {
180
+ value = data?.SecretString;
181
+ }
182
+
183
+ if (value !== undefined && value !== null) {
184
+ exports.push(`export ${prefix}=${shellEscape(String(value))}`);
185
+ }
186
+ } catch (err) {
187
+ const msg = err instanceof Error ? err.message : String(err);
188
+ process.stderr.write(
189
+ `[fjall-resolver] Failed to resolve SM secret ${prefix} (${arn}): ${msg}\n`,
190
+ );
191
+ process.exit(1);
192
+ }
193
+ }
194
+
195
+ return exports;
196
+ }
197
+
198
+ async function main() {
199
+ const ssmExports = await resolveSsmSecrets();
200
+ const smExports = await resolveSecretsManagerSecrets();
201
+ const allExports = [...ssmExports, ...smExports];
202
+
203
+ if (allExports.length > 0) {
204
+ process.stdout.write(allExports.join("\n") + "\n");
205
+ }
206
+ }
207
+
208
+ main().catch((err) => {
209
+ const msg = err instanceof Error ? err.message : String(err);
210
+ process.stderr.write(`[fjall-resolver] Fatal error: ${msg}\n`);
211
+ process.exit(1);
212
+ });
@@ -0,0 +1,30 @@
1
+ #!/bin/bash
2
+ # Fjall Secrets Resolver Wrapper
3
+ #
4
+ # Invoked by AWS_LAMBDA_EXEC_WRAPPER before the Lambda runtime starts.
5
+ # Calls the Node.js resolver to fetch secrets from the AWS Parameters and
6
+ # Secrets Extension, then execs into the original runtime bootstrap.
7
+ #
8
+ # The resolver outputs `export KEY='value'` lines which we eval to inject
9
+ # secrets as environment variables visible to the handler.
10
+
11
+ set -euo pipefail
12
+
13
+ # Only run resolver if secrets are configured
14
+ if [ -n "${SSM_SECRET_NAMES:-}" ] || env | grep -q '_SECRET_ARN='; then
15
+ RESOLVER_OUTPUT=$(/var/lang/bin/node /opt/bin/resolve-secrets.mjs)
16
+ if [ -n "$RESOLVER_OUTPUT" ]; then
17
+ # Validate each line matches `export NAME='...'` before eval to prevent
18
+ # accidental code execution if the resolver ever emits unexpected output
19
+ while IFS= read -r line; do
20
+ if [[ "$line" =~ ^export\ [a-zA-Z_][a-zA-Z0-9_]*= ]]; then
21
+ eval "$line"
22
+ else
23
+ echo "[fjall-resolver] Unexpected output from resolver: ${line:0:80}" >&2
24
+ exit 1
25
+ fi
26
+ done <<< "$RESOLVER_OUTPUT"
27
+ fi
28
+ fi
29
+
30
+ exec "$@"