@friggframework/devtools 2.0.0-next.4 → 2.0.0-next.41

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 (198) hide show
  1. package/frigg-cli/.eslintrc.js +141 -0
  2. package/frigg-cli/__tests__/jest.config.js +102 -0
  3. package/frigg-cli/__tests__/unit/commands/build.test.js +483 -0
  4. package/frigg-cli/__tests__/unit/commands/install.test.js +418 -0
  5. package/frigg-cli/__tests__/unit/commands/ui.test.js +592 -0
  6. package/frigg-cli/__tests__/utils/command-tester.js +170 -0
  7. package/frigg-cli/__tests__/utils/mock-factory.js +270 -0
  8. package/frigg-cli/__tests__/utils/test-fixtures.js +463 -0
  9. package/frigg-cli/__tests__/utils/test-setup.js +286 -0
  10. package/frigg-cli/build-command/index.js +54 -0
  11. package/frigg-cli/deploy-command/index.js +175 -0
  12. package/frigg-cli/generate-command/__tests__/generate-command.test.js +312 -0
  13. package/frigg-cli/generate-command/azure-generator.js +43 -0
  14. package/frigg-cli/generate-command/gcp-generator.js +47 -0
  15. package/frigg-cli/generate-command/index.js +332 -0
  16. package/frigg-cli/generate-command/terraform-generator.js +555 -0
  17. package/frigg-cli/generate-iam-command.js +115 -0
  18. package/frigg-cli/index.js +47 -1
  19. package/frigg-cli/index.test.js +1 -4
  20. package/frigg-cli/init-command/backend-first-handler.js +756 -0
  21. package/frigg-cli/init-command/index.js +93 -0
  22. package/frigg-cli/init-command/template-handler.js +143 -0
  23. package/frigg-cli/install-command/index.js +1 -4
  24. package/frigg-cli/package.json +51 -0
  25. package/frigg-cli/start-command/index.js +30 -4
  26. package/frigg-cli/start-command/start-command.test.js +155 -0
  27. package/frigg-cli/test/init-command.test.js +180 -0
  28. package/frigg-cli/test/npm-registry.test.js +319 -0
  29. package/frigg-cli/ui-command/index.js +154 -0
  30. package/frigg-cli/utils/app-resolver.js +319 -0
  31. package/frigg-cli/utils/backend-path.js +16 -17
  32. package/frigg-cli/utils/npm-registry.js +167 -0
  33. package/frigg-cli/utils/process-manager.js +199 -0
  34. package/frigg-cli/utils/repo-detection.js +405 -0
  35. package/infrastructure/DEPLOYMENT-INSTRUCTIONS.md +268 -0
  36. package/infrastructure/GENERATE-IAM-DOCS.md +278 -0
  37. package/infrastructure/IAM-POLICY-TEMPLATES.md +176 -0
  38. package/infrastructure/README.md +443 -0
  39. package/infrastructure/WEBSOCKET-CONFIGURATION.md +105 -0
  40. package/infrastructure/__tests__/fixtures/mock-aws-resources.js +391 -0
  41. package/infrastructure/__tests__/helpers/test-utils.js +277 -0
  42. package/infrastructure/aws-discovery.js +1176 -0
  43. package/infrastructure/aws-discovery.test.js +1220 -0
  44. package/infrastructure/build-time-discovery.js +206 -0
  45. package/infrastructure/build-time-discovery.test.js +378 -0
  46. package/infrastructure/create-frigg-infrastructure.js +3 -5
  47. package/infrastructure/env-validator.js +77 -0
  48. package/infrastructure/frigg-deployment-iam-stack.yaml +401 -0
  49. package/infrastructure/iam-generator.js +836 -0
  50. package/infrastructure/iam-generator.test.js +172 -0
  51. package/infrastructure/iam-policy-basic.json +218 -0
  52. package/infrastructure/iam-policy-full.json +288 -0
  53. package/infrastructure/integration.test.js +383 -0
  54. package/infrastructure/run-discovery.js +110 -0
  55. package/infrastructure/serverless-template.js +1493 -138
  56. package/infrastructure/serverless-template.test.js +1804 -0
  57. package/management-ui/.eslintrc.js +22 -0
  58. package/management-ui/README.md +203 -0
  59. package/management-ui/components.json +21 -0
  60. package/management-ui/docs/phase2-integration-guide.md +320 -0
  61. package/management-ui/index.html +13 -0
  62. package/management-ui/package-lock.json +16517 -0
  63. package/management-ui/package.json +76 -0
  64. package/management-ui/packages/devtools/frigg-cli/ui-command/index.js +302 -0
  65. package/management-ui/postcss.config.js +6 -0
  66. package/management-ui/server/api/backend.js +256 -0
  67. package/management-ui/server/api/cli.js +315 -0
  68. package/management-ui/server/api/codegen.js +663 -0
  69. package/management-ui/server/api/connections.js +857 -0
  70. package/management-ui/server/api/discovery.js +185 -0
  71. package/management-ui/server/api/environment/index.js +1 -0
  72. package/management-ui/server/api/environment/router.js +378 -0
  73. package/management-ui/server/api/environment.js +328 -0
  74. package/management-ui/server/api/integrations.js +876 -0
  75. package/management-ui/server/api/logs.js +248 -0
  76. package/management-ui/server/api/monitoring.js +282 -0
  77. package/management-ui/server/api/open-ide.js +31 -0
  78. package/management-ui/server/api/project.js +1029 -0
  79. package/management-ui/server/api/users/sessions.js +371 -0
  80. package/management-ui/server/api/users/simulation.js +254 -0
  81. package/management-ui/server/api/users.js +362 -0
  82. package/management-ui/server/api-contract.md +275 -0
  83. package/management-ui/server/index.js +873 -0
  84. package/management-ui/server/middleware/errorHandler.js +93 -0
  85. package/management-ui/server/middleware/security.js +32 -0
  86. package/management-ui/server/processManager.js +296 -0
  87. package/management-ui/server/server.js +346 -0
  88. package/management-ui/server/services/aws-monitor.js +413 -0
  89. package/management-ui/server/services/npm-registry.js +347 -0
  90. package/management-ui/server/services/template-engine.js +538 -0
  91. package/management-ui/server/utils/cliIntegration.js +220 -0
  92. package/management-ui/server/utils/environment/auditLogger.js +471 -0
  93. package/management-ui/server/utils/environment/awsParameterStore.js +264 -0
  94. package/management-ui/server/utils/environment/encryption.js +278 -0
  95. package/management-ui/server/utils/environment/envFileManager.js +286 -0
  96. package/management-ui/server/utils/import-commonjs.js +28 -0
  97. package/management-ui/server/utils/response.js +83 -0
  98. package/management-ui/server/websocket/handler.js +325 -0
  99. package/management-ui/src/App.jsx +109 -0
  100. package/management-ui/src/assets/FriggLogo.svg +1 -0
  101. package/management-ui/src/components/AppRouter.jsx +65 -0
  102. package/management-ui/src/components/Button.jsx +70 -0
  103. package/management-ui/src/components/Card.jsx +97 -0
  104. package/management-ui/src/components/EnvironmentCompare.jsx +400 -0
  105. package/management-ui/src/components/EnvironmentEditor.jsx +372 -0
  106. package/management-ui/src/components/EnvironmentImportExport.jsx +469 -0
  107. package/management-ui/src/components/EnvironmentSchema.jsx +491 -0
  108. package/management-ui/src/components/EnvironmentSecurity.jsx +463 -0
  109. package/management-ui/src/components/ErrorBoundary.jsx +73 -0
  110. package/management-ui/src/components/IntegrationCard.jsx +481 -0
  111. package/management-ui/src/components/IntegrationCardEnhanced.jsx +770 -0
  112. package/management-ui/src/components/IntegrationExplorer.jsx +379 -0
  113. package/management-ui/src/components/IntegrationStatus.jsx +336 -0
  114. package/management-ui/src/components/Layout.jsx +716 -0
  115. package/management-ui/src/components/LoadingSpinner.jsx +113 -0
  116. package/management-ui/src/components/RepositoryPicker.jsx +248 -0
  117. package/management-ui/src/components/SessionMonitor.jsx +350 -0
  118. package/management-ui/src/components/StatusBadge.jsx +208 -0
  119. package/management-ui/src/components/UserContextSwitcher.jsx +212 -0
  120. package/management-ui/src/components/UserSimulation.jsx +327 -0
  121. package/management-ui/src/components/Welcome.jsx +434 -0
  122. package/management-ui/src/components/codegen/APIEndpointGenerator.jsx +637 -0
  123. package/management-ui/src/components/codegen/APIModuleSelector.jsx +227 -0
  124. package/management-ui/src/components/codegen/CodeGenerationWizard.jsx +247 -0
  125. package/management-ui/src/components/codegen/CodePreviewEditor.jsx +316 -0
  126. package/management-ui/src/components/codegen/DynamicModuleForm.jsx +271 -0
  127. package/management-ui/src/components/codegen/FormBuilder.jsx +737 -0
  128. package/management-ui/src/components/codegen/IntegrationGenerator.jsx +855 -0
  129. package/management-ui/src/components/codegen/ProjectScaffoldWizard.jsx +797 -0
  130. package/management-ui/src/components/codegen/SchemaBuilder.jsx +303 -0
  131. package/management-ui/src/components/codegen/TemplateSelector.jsx +586 -0
  132. package/management-ui/src/components/codegen/index.js +10 -0
  133. package/management-ui/src/components/connections/ConnectionConfigForm.jsx +362 -0
  134. package/management-ui/src/components/connections/ConnectionHealthMonitor.jsx +182 -0
  135. package/management-ui/src/components/connections/ConnectionTester.jsx +200 -0
  136. package/management-ui/src/components/connections/EntityRelationshipMapper.jsx +292 -0
  137. package/management-ui/src/components/connections/OAuthFlow.jsx +204 -0
  138. package/management-ui/src/components/connections/index.js +5 -0
  139. package/management-ui/src/components/index.js +21 -0
  140. package/management-ui/src/components/monitoring/APIGatewayMetrics.jsx +222 -0
  141. package/management-ui/src/components/monitoring/LambdaMetrics.jsx +169 -0
  142. package/management-ui/src/components/monitoring/MetricsChart.jsx +197 -0
  143. package/management-ui/src/components/monitoring/MonitoringDashboard.jsx +393 -0
  144. package/management-ui/src/components/monitoring/SQSMetrics.jsx +246 -0
  145. package/management-ui/src/components/monitoring/index.js +6 -0
  146. package/management-ui/src/components/monitoring/monitoring.css +218 -0
  147. package/management-ui/src/components/theme-provider.jsx +52 -0
  148. package/management-ui/src/components/theme-toggle.jsx +39 -0
  149. package/management-ui/src/components/ui/badge.tsx +36 -0
  150. package/management-ui/src/components/ui/button.test.jsx +56 -0
  151. package/management-ui/src/components/ui/button.tsx +57 -0
  152. package/management-ui/src/components/ui/card.tsx +76 -0
  153. package/management-ui/src/components/ui/dropdown-menu.tsx +199 -0
  154. package/management-ui/src/components/ui/select.tsx +157 -0
  155. package/management-ui/src/components/ui/skeleton.jsx +15 -0
  156. package/management-ui/src/hooks/useFrigg.jsx +601 -0
  157. package/management-ui/src/hooks/useSocket.jsx +58 -0
  158. package/management-ui/src/index.css +193 -0
  159. package/management-ui/src/lib/utils.ts +6 -0
  160. package/management-ui/src/main.jsx +10 -0
  161. package/management-ui/src/pages/CodeGeneration.jsx +14 -0
  162. package/management-ui/src/pages/Connections.jsx +252 -0
  163. package/management-ui/src/pages/ConnectionsEnhanced.jsx +633 -0
  164. package/management-ui/src/pages/Dashboard.jsx +311 -0
  165. package/management-ui/src/pages/Environment.jsx +314 -0
  166. package/management-ui/src/pages/IntegrationConfigure.jsx +669 -0
  167. package/management-ui/src/pages/IntegrationDiscovery.jsx +567 -0
  168. package/management-ui/src/pages/IntegrationTest.jsx +742 -0
  169. package/management-ui/src/pages/Integrations.jsx +253 -0
  170. package/management-ui/src/pages/Monitoring.jsx +17 -0
  171. package/management-ui/src/pages/Simulation.jsx +155 -0
  172. package/management-ui/src/pages/Users.jsx +492 -0
  173. package/management-ui/src/services/api.js +41 -0
  174. package/management-ui/src/services/apiModuleService.js +193 -0
  175. package/management-ui/src/services/websocket-handlers.js +120 -0
  176. package/management-ui/src/test/api/project.test.js +273 -0
  177. package/management-ui/src/test/components/Welcome.test.jsx +378 -0
  178. package/management-ui/src/test/mocks/server.js +178 -0
  179. package/management-ui/src/test/setup.js +61 -0
  180. package/management-ui/src/test/utils/test-utils.jsx +134 -0
  181. package/management-ui/src/utils/repository.js +98 -0
  182. package/management-ui/src/utils/repository.test.js +118 -0
  183. package/management-ui/src/workflows/phase2-integration-workflows.js +884 -0
  184. package/management-ui/tailwind.config.js +63 -0
  185. package/management-ui/tsconfig.json +37 -0
  186. package/management-ui/tsconfig.node.json +10 -0
  187. package/management-ui/vite.config.js +26 -0
  188. package/management-ui/vitest.config.js +38 -0
  189. package/package.json +20 -9
  190. package/infrastructure/app-handler-helpers.js +0 -57
  191. package/infrastructure/backend-utils.js +0 -90
  192. package/infrastructure/routers/auth.js +0 -26
  193. package/infrastructure/routers/integration-defined-routers.js +0 -37
  194. package/infrastructure/routers/middleware/loadUser.js +0 -15
  195. package/infrastructure/routers/middleware/requireLoggedInUser.js +0 -12
  196. package/infrastructure/routers/user.js +0 -41
  197. package/infrastructure/routers/websocket.js +0 -55
  198. package/infrastructure/workers/integration-defined-workers.js +0 -24
@@ -0,0 +1,172 @@
1
+ const { generateIAMCloudFormation, getFeatureSummary } = require('./iam-generator');
2
+
3
+ describe('IAM Generator', () => {
4
+ describe('getFeatureSummary', () => {
5
+ it('should detect all features when enabled', () => {
6
+ const appDefinition = {
7
+ name: 'test-app',
8
+ integrations: ['Integration1', 'Integration2'],
9
+ vpc: { enable: true },
10
+ encryption: { fieldLevelEncryptionMethod: 'kms' },
11
+ ssm: { enable: true },
12
+ websockets: { enable: true }
13
+ };
14
+
15
+ const summary = getFeatureSummary(appDefinition);
16
+
17
+ expect(summary.appName).toBe('test-app');
18
+ expect(summary.integrationCount).toBe(2);
19
+ expect(summary.features.core).toBe(true);
20
+ expect(summary.features.vpc).toBe(true);
21
+ expect(summary.features.kms).toBe(true);
22
+ expect(summary.features.ssm).toBe(true);
23
+ expect(summary.features.websockets).toBe(true);
24
+ });
25
+
26
+ it('should detect minimal features when disabled', () => {
27
+ const appDefinition = {
28
+ integrations: []
29
+ };
30
+
31
+ const summary = getFeatureSummary(appDefinition);
32
+
33
+ expect(summary.appName).toBe('Unnamed Frigg App');
34
+ expect(summary.integrationCount).toBe(0);
35
+ expect(summary.features.core).toBe(true);
36
+ expect(summary.features.vpc).toBe(false);
37
+ expect(summary.features.kms).toBe(false);
38
+ expect(summary.features.ssm).toBe(false);
39
+ expect(summary.features.websockets).toBe(false);
40
+ });
41
+ });
42
+
43
+ describe('generateIAMCloudFormation', () => {
44
+ it('should generate valid CloudFormation YAML', () => {
45
+ const appDefinition = {
46
+ name: 'test-app',
47
+ integrations: [],
48
+ vpc: { enable: false },
49
+ encryption: { fieldLevelEncryptionMethod: 'aes' },
50
+ ssm: { enable: false },
51
+ websockets: { enable: false }
52
+ };
53
+
54
+ const yaml = generateIAMCloudFormation(appDefinition);
55
+
56
+ expect(yaml).toContain('AWSTemplateFormatVersion');
57
+ expect(yaml).toContain('FriggDeploymentUser');
58
+ expect(yaml).toContain('FriggCoreDeploymentPolicy');
59
+ expect(yaml).toContain('FriggDiscoveryPolicy');
60
+ });
61
+
62
+ it('should include VPC policy when VPC is enabled', () => {
63
+ const appDefinition = {
64
+ name: 'test-app',
65
+ integrations: [],
66
+ vpc: { enable: true }
67
+ };
68
+
69
+ const yaml = generateIAMCloudFormation(appDefinition);
70
+
71
+ expect(yaml).toContain('FriggVPCPolicy');
72
+ expect(yaml).toContain('CreateVPCPermissions');
73
+ expect(yaml).toContain('EnableVPCSupport');
74
+ expect(yaml).toContain('ec2:ReplaceRoute');
75
+ });
76
+
77
+ it('should include KMS policy when encryption is enabled', () => {
78
+ const appDefinition = {
79
+ name: 'test-app',
80
+ integrations: [],
81
+ encryption: { fieldLevelEncryptionMethod: 'kms' }
82
+ };
83
+
84
+ const yaml = generateIAMCloudFormation(appDefinition);
85
+
86
+ expect(yaml).toContain('FriggKMSPolicy');
87
+ expect(yaml).toContain('CreateKMSPermissions');
88
+ expect(yaml).toContain('EnableKMSSupport');
89
+ expect(yaml).toContain('FriggKMSKeyAlias');
90
+ expect(yaml).toContain('kms:CreateAlias');
91
+ });
92
+
93
+ it('should include SSM policy when SSM is enabled', () => {
94
+ const appDefinition = {
95
+ name: 'test-app',
96
+ integrations: [],
97
+ ssm: { enable: true }
98
+ };
99
+
100
+ const yaml = generateIAMCloudFormation(appDefinition);
101
+
102
+ expect(yaml).toContain('FriggSSMPolicy');
103
+ expect(yaml).toContain('CreateSSMPermissions');
104
+ expect(yaml).toContain('EnableSSMSupport');
105
+ });
106
+
107
+ it('should set correct default parameter values based on features', () => {
108
+ const appDefinition = {
109
+ name: 'test-app',
110
+ integrations: [],
111
+ vpc: { enable: true },
112
+ encryption: { fieldLevelEncryptionMethod: 'aes' },
113
+ ssm: { enable: true }
114
+ };
115
+
116
+ const yaml = generateIAMCloudFormation(appDefinition);
117
+
118
+ // Check parameter defaults match the enabled features
119
+ expect(yaml).toContain("Default: 'true'"); // VPC enabled
120
+ expect(yaml).toContain("Default: 'false'"); // KMS disabled
121
+ expect(yaml).toContain('alias/frigg-deployment');
122
+ });
123
+
124
+ it('should include all core permissions', () => {
125
+ const appDefinition = {
126
+ name: 'test-app',
127
+ integrations: []
128
+ };
129
+
130
+ const yaml = generateIAMCloudFormation(appDefinition);
131
+
132
+ // Check for core permissions
133
+ expect(yaml).toContain('cloudformation:CreateStack');
134
+ expect(yaml).toContain('cloudformation:ListStackResources');
135
+ expect(yaml).toContain('lambda:CreateFunction');
136
+ expect(yaml).toContain('iam:CreateRole');
137
+ expect(yaml).toContain('s3:CreateBucket');
138
+ expect(yaml).toContain('sqs:CreateQueue');
139
+ expect(yaml).toContain('sns:CreateTopic');
140
+ expect(yaml).toContain('logs:CreateLogGroup');
141
+ expect(yaml).toContain('apigateway:POST');
142
+ expect(yaml).toContain('lambda:ListVersionsByFunction');
143
+ expect(yaml).toContain('iam:ListPolicyVersions');
144
+ });
145
+
146
+ it('should include internal-error-queue pattern in SQS resources', () => {
147
+ const appDefinition = {
148
+ name: 'test-app',
149
+ integrations: []
150
+ };
151
+
152
+ const yaml = generateIAMCloudFormation(appDefinition);
153
+
154
+ expect(yaml).toContain('internal-error-queue-*');
155
+ });
156
+
157
+ it('should generate outputs section', () => {
158
+ const appDefinition = {
159
+ name: 'test-app',
160
+ integrations: []
161
+ };
162
+
163
+ const yaml = generateIAMCloudFormation(appDefinition);
164
+
165
+ expect(yaml).toContain('Outputs:');
166
+ expect(yaml).toContain('DeploymentUserArn:');
167
+ expect(yaml).toContain('AccessKeyId:');
168
+ expect(yaml).toContain('SecretAccessKeyCommand:');
169
+ expect(yaml).toContain('CredentialsSecretArn:');
170
+ });
171
+ });
172
+ });
@@ -0,0 +1,218 @@
1
+ {
2
+ "Version": "2012-10-17",
3
+ "Statement": [
4
+ {
5
+ "Sid": "AWSDiscoveryPermissions",
6
+ "Effect": "Allow",
7
+ "Action": [
8
+ "sts:GetCallerIdentity",
9
+ "ec2:DescribeVpcs",
10
+ "ec2:DescribeSubnets",
11
+ "ec2:DescribeSecurityGroups",
12
+ "ec2:DescribeRouteTables",
13
+ "kms:ListKeys",
14
+ "kms:DescribeKey"
15
+ ],
16
+ "Resource": "*"
17
+ },
18
+ {
19
+ "Sid": "CloudFormationFriggStacks",
20
+ "Effect": "Allow",
21
+ "Action": [
22
+ "cloudformation:CreateStack",
23
+ "cloudformation:UpdateStack",
24
+ "cloudformation:DeleteStack",
25
+ "cloudformation:DescribeStacks",
26
+ "cloudformation:DescribeStackEvents",
27
+ "cloudformation:DescribeStackResources",
28
+ "cloudformation:DescribeStackResource",
29
+ "cloudformation:ListStackResources",
30
+ "cloudformation:GetTemplate",
31
+ "cloudformation:ValidateTemplate",
32
+ "cloudformation:DescribeChangeSet",
33
+ "cloudformation:CreateChangeSet",
34
+ "cloudformation:DeleteChangeSet",
35
+ "cloudformation:ExecuteChangeSet"
36
+ ],
37
+ "Resource": [
38
+ "arn:aws:cloudformation:*:*:stack/*frigg*/*"
39
+ ]
40
+ },
41
+ {
42
+ "Sid": "S3DeploymentBucket",
43
+ "Effect": "Allow",
44
+ "Action": [
45
+ "s3:CreateBucket",
46
+ "s3:PutObject",
47
+ "s3:GetObject",
48
+ "s3:DeleteObject",
49
+ "s3:PutBucketPolicy",
50
+ "s3:PutBucketVersioning",
51
+ "s3:PutBucketPublicAccessBlock",
52
+ "s3:GetBucketLocation",
53
+ "s3:ListBucket",
54
+ "s3:PutBucketTagging",
55
+ "s3:GetBucketTagging"
56
+ ],
57
+ "Resource": [
58
+ "arn:aws:s3:::*serverless*",
59
+ "arn:aws:s3:::*serverless*/*"
60
+ ]
61
+ },
62
+ {
63
+ "Sid": "LambdaFriggFunctions",
64
+ "Effect": "Allow",
65
+ "Action": [
66
+ "lambda:CreateFunction",
67
+ "lambda:UpdateFunctionCode",
68
+ "lambda:UpdateFunctionConfiguration",
69
+ "lambda:DeleteFunction",
70
+ "lambda:GetFunction",
71
+ "lambda:ListFunctions",
72
+ "lambda:PublishVersion",
73
+ "lambda:CreateAlias",
74
+ "lambda:UpdateAlias",
75
+ "lambda:DeleteAlias",
76
+ "lambda:GetAlias",
77
+ "lambda:AddPermission",
78
+ "lambda:RemovePermission",
79
+ "lambda:GetPolicy",
80
+ "lambda:PutProvisionedConcurrencyConfig",
81
+ "lambda:DeleteProvisionedConcurrencyConfig",
82
+ "lambda:PutConcurrency",
83
+ "lambda:DeleteConcurrency",
84
+ "lambda:TagResource",
85
+ "lambda:UntagResource",
86
+ "lambda:ListVersionsByFunction"
87
+ ],
88
+ "Resource": [
89
+ "arn:aws:lambda:*:*:function:*frigg*"
90
+ ]
91
+ },
92
+ {
93
+ "Sid": "FriggLambdaEventSourceMapping",
94
+ "Effect": "Allow",
95
+ "Action": [
96
+ "lambda:CreateEventSourceMapping",
97
+ "lambda:DeleteEventSourceMapping",
98
+ "lambda:GetEventSourceMapping",
99
+ "lambda:UpdateEventSourceMapping",
100
+ "lambda:ListEventSourceMappings"
101
+ ],
102
+ "Resource": [
103
+ "arn:aws:lambda:*:*:event-source-mapping:*"
104
+ ]
105
+ },
106
+ {
107
+ "Sid": "IAMRolesForFriggLambda",
108
+ "Effect": "Allow",
109
+ "Action": [
110
+ "iam:CreateRole",
111
+ "iam:DeleteRole",
112
+ "iam:GetRole",
113
+ "iam:PassRole",
114
+ "iam:PutRolePolicy",
115
+ "iam:DeleteRolePolicy",
116
+ "iam:GetRolePolicy",
117
+ "iam:AttachRolePolicy",
118
+ "iam:DetachRolePolicy",
119
+ "iam:TagRole",
120
+ "iam:UntagRole"
121
+ ],
122
+ "Resource": [
123
+ "arn:aws:iam::*:role/*frigg*",
124
+ "arn:aws:iam::*:role/*frigg*LambdaRole*"
125
+ ]
126
+ },
127
+ {
128
+ "Sid": "IAMPolicyVersionPermissions",
129
+ "Effect": "Allow",
130
+ "Action": [
131
+ "iam:ListPolicyVersions"
132
+ ],
133
+ "Resource": [
134
+ "arn:aws:iam::*:policy/*"
135
+ ]
136
+ },
137
+ {
138
+ "Sid": "FriggMessagingServices",
139
+ "Effect": "Allow",
140
+ "Action": [
141
+ "sqs:CreateQueue",
142
+ "sqs:DeleteQueue",
143
+ "sqs:GetQueueAttributes",
144
+ "sqs:SetQueueAttributes",
145
+ "sqs:GetQueueUrl",
146
+ "sqs:TagQueue",
147
+ "sqs:UntagQueue"
148
+ ],
149
+ "Resource": [
150
+ "arn:aws:sqs:*:*:*frigg*",
151
+ "arn:aws:sqs:*:*:internal-error-queue-*"
152
+ ]
153
+ },
154
+ {
155
+ "Sid": "FriggSNSTopics",
156
+ "Effect": "Allow",
157
+ "Action": [
158
+ "sns:CreateTopic",
159
+ "sns:DeleteTopic",
160
+ "sns:GetTopicAttributes",
161
+ "sns:SetTopicAttributes",
162
+ "sns:Subscribe",
163
+ "sns:Unsubscribe",
164
+ "sns:ListSubscriptionsByTopic",
165
+ "sns:TagResource",
166
+ "sns:UntagResource"
167
+ ],
168
+ "Resource": [
169
+ "arn:aws:sns:*:*:*frigg*"
170
+ ]
171
+ },
172
+ {
173
+ "Sid": "FriggMonitoringAndLogs",
174
+ "Effect": "Allow",
175
+ "Action": [
176
+ "cloudwatch:PutMetricAlarm",
177
+ "cloudwatch:DeleteAlarms",
178
+ "cloudwatch:DescribeAlarms",
179
+ "logs:CreateLogGroup",
180
+ "logs:CreateLogStream",
181
+ "logs:DeleteLogGroup",
182
+ "logs:DescribeLogGroups",
183
+ "logs:DescribeLogStreams",
184
+ "logs:FilterLogEvents",
185
+ "logs:PutLogEvents",
186
+ "logs:PutRetentionPolicy"
187
+ ],
188
+ "Resource": [
189
+ "arn:aws:logs:*:*:log-group:/aws/lambda/*frigg*",
190
+ "arn:aws:logs:*:*:log-group:/aws/lambda/*frigg*:*",
191
+ "arn:aws:cloudwatch:*:*:alarm:*frigg*"
192
+ ]
193
+ },
194
+ {
195
+ "Sid": "FriggAPIGateway",
196
+ "Effect": "Allow",
197
+ "Action": [
198
+ "apigateway:POST",
199
+ "apigateway:PUT",
200
+ "apigateway:DELETE",
201
+ "apigateway:GET",
202
+ "apigateway:PATCH",
203
+ "apigateway:TagResource",
204
+ "apigateway:UntagResource"
205
+ ],
206
+ "Resource": [
207
+ "arn:aws:apigateway:*::/restapis",
208
+ "arn:aws:apigateway:*::/restapis/*",
209
+ "arn:aws:apigateway:*::/apis",
210
+ "arn:aws:apigateway:*::/apis/*",
211
+ "arn:aws:apigateway:*::/apis/*/stages",
212
+ "arn:aws:apigateway:*::/apis/*/stages/*",
213
+ "arn:aws:apigateway:*::/domainnames",
214
+ "arn:aws:apigateway:*::/domainnames/*"
215
+ ]
216
+ }
217
+ ]
218
+ }
@@ -0,0 +1,288 @@
1
+ {
2
+ "Version": "2012-10-17",
3
+ "Statement": [
4
+ {
5
+ "Sid": "AWSDiscoveryPermissions",
6
+ "Effect": "Allow",
7
+ "Action": [
8
+ "sts:GetCallerIdentity",
9
+ "ec2:DescribeVpcs",
10
+ "ec2:DescribeSubnets",
11
+ "ec2:DescribeSecurityGroups",
12
+ "ec2:DescribeRouteTables",
13
+ "kms:ListKeys",
14
+ "kms:DescribeKey"
15
+ ],
16
+ "Resource": "*"
17
+ },
18
+ {
19
+ "Sid": "CloudFormationFriggStacks",
20
+ "Effect": "Allow",
21
+ "Action": [
22
+ "cloudformation:CreateStack",
23
+ "cloudformation:UpdateStack",
24
+ "cloudformation:DeleteStack",
25
+ "cloudformation:DescribeStacks",
26
+ "cloudformation:DescribeStackEvents",
27
+ "cloudformation:DescribeStackResources",
28
+ "cloudformation:DescribeStackResource",
29
+ "cloudformation:ListStackResources",
30
+ "cloudformation:GetTemplate",
31
+ "cloudformation:ValidateTemplate",
32
+ "cloudformation:DescribeChangeSet",
33
+ "cloudformation:CreateChangeSet",
34
+ "cloudformation:DeleteChangeSet",
35
+ "cloudformation:ExecuteChangeSet"
36
+ ],
37
+ "Resource": [
38
+ "arn:aws:cloudformation:*:*:stack/*frigg*/*"
39
+ ]
40
+ },
41
+ {
42
+ "Sid": "S3DeploymentBucket",
43
+ "Effect": "Allow",
44
+ "Action": [
45
+ "s3:CreateBucket",
46
+ "s3:PutObject",
47
+ "s3:GetObject",
48
+ "s3:DeleteObject",
49
+ "s3:PutBucketPolicy",
50
+ "s3:PutBucketVersioning",
51
+ "s3:PutBucketPublicAccessBlock",
52
+ "s3:GetBucketLocation",
53
+ "s3:ListBucket",
54
+ "s3:PutBucketTagging",
55
+ "s3:GetBucketTagging"
56
+ ],
57
+ "Resource": [
58
+ "arn:aws:s3:::*serverless*",
59
+ "arn:aws:s3:::*serverless*/*"
60
+ ]
61
+ },
62
+ {
63
+ "Sid": "LambdaFriggFunctions",
64
+ "Effect": "Allow",
65
+ "Action": [
66
+ "lambda:CreateFunction",
67
+ "lambda:UpdateFunctionCode",
68
+ "lambda:UpdateFunctionConfiguration",
69
+ "lambda:DeleteFunction",
70
+ "lambda:GetFunction",
71
+ "lambda:ListFunctions",
72
+ "lambda:PublishVersion",
73
+ "lambda:CreateAlias",
74
+ "lambda:UpdateAlias",
75
+ "lambda:DeleteAlias",
76
+ "lambda:GetAlias",
77
+ "lambda:AddPermission",
78
+ "lambda:RemovePermission",
79
+ "lambda:GetPolicy",
80
+ "lambda:PutProvisionedConcurrencyConfig",
81
+ "lambda:DeleteProvisionedConcurrencyConfig",
82
+ "lambda:PutConcurrency",
83
+ "lambda:DeleteConcurrency",
84
+ "lambda:TagResource",
85
+ "lambda:UntagResource",
86
+ "lambda:ListVersionsByFunction"
87
+ ],
88
+ "Resource": [
89
+ "arn:aws:lambda:*:*:function:*frigg*"
90
+ ]
91
+ },
92
+ {
93
+ "Sid": "FriggLambdaEventSourceMapping",
94
+ "Effect": "Allow",
95
+ "Action": [
96
+ "lambda:CreateEventSourceMapping",
97
+ "lambda:DeleteEventSourceMapping",
98
+ "lambda:GetEventSourceMapping",
99
+ "lambda:UpdateEventSourceMapping",
100
+ "lambda:ListEventSourceMappings"
101
+ ],
102
+ "Resource": [
103
+ "arn:aws:lambda:*:*:event-source-mapping:*"
104
+ ]
105
+ },
106
+ {
107
+ "Sid": "IAMRolesForFriggLambda",
108
+ "Effect": "Allow",
109
+ "Action": [
110
+ "iam:CreateRole",
111
+ "iam:DeleteRole",
112
+ "iam:GetRole",
113
+ "iam:PassRole",
114
+ "iam:PutRolePolicy",
115
+ "iam:DeleteRolePolicy",
116
+ "iam:GetRolePolicy",
117
+ "iam:AttachRolePolicy",
118
+ "iam:DetachRolePolicy",
119
+ "iam:TagRole",
120
+ "iam:UntagRole"
121
+ ],
122
+ "Resource": [
123
+ "arn:aws:iam::*:role/*frigg*",
124
+ "arn:aws:iam::*:role/*frigg*LambdaRole*"
125
+ ]
126
+ },
127
+ {
128
+ "Sid": "IAMPolicyVersionPermissions",
129
+ "Effect": "Allow",
130
+ "Action": [
131
+ "iam:ListPolicyVersions"
132
+ ],
133
+ "Resource": [
134
+ "arn:aws:iam::*:policy/*"
135
+ ]
136
+ },
137
+ {
138
+ "Sid": "FriggMessagingServices",
139
+ "Effect": "Allow",
140
+ "Action": [
141
+ "sqs:CreateQueue",
142
+ "sqs:DeleteQueue",
143
+ "sqs:GetQueueAttributes",
144
+ "sqs:SetQueueAttributes",
145
+ "sqs:GetQueueUrl",
146
+ "sqs:TagQueue",
147
+ "sqs:UntagQueue"
148
+ ],
149
+ "Resource": [
150
+ "arn:aws:sqs:*:*:*frigg*",
151
+ "arn:aws:sqs:*:*:internal-error-queue-*"
152
+ ]
153
+ },
154
+ {
155
+ "Sid": "FriggSNSTopics",
156
+ "Effect": "Allow",
157
+ "Action": [
158
+ "sns:CreateTopic",
159
+ "sns:DeleteTopic",
160
+ "sns:GetTopicAttributes",
161
+ "sns:SetTopicAttributes",
162
+ "sns:Subscribe",
163
+ "sns:Unsubscribe",
164
+ "sns:ListSubscriptionsByTopic",
165
+ "sns:TagResource",
166
+ "sns:UntagResource"
167
+ ],
168
+ "Resource": [
169
+ "arn:aws:sns:*:*:*frigg*"
170
+ ]
171
+ },
172
+ {
173
+ "Sid": "FriggMonitoringAndLogs",
174
+ "Effect": "Allow",
175
+ "Action": [
176
+ "cloudwatch:PutMetricAlarm",
177
+ "cloudwatch:DeleteAlarms",
178
+ "cloudwatch:DescribeAlarms",
179
+ "logs:CreateLogGroup",
180
+ "logs:CreateLogStream",
181
+ "logs:DeleteLogGroup",
182
+ "logs:DescribeLogGroups",
183
+ "logs:DescribeLogStreams",
184
+ "logs:FilterLogEvents",
185
+ "logs:PutLogEvents",
186
+ "logs:PutRetentionPolicy"
187
+ ],
188
+ "Resource": [
189
+ "arn:aws:logs:*:*:log-group:/aws/lambda/*frigg*",
190
+ "arn:aws:logs:*:*:log-group:/aws/lambda/*frigg*:*",
191
+ "arn:aws:cloudwatch:*:*:alarm:*frigg*"
192
+ ]
193
+ },
194
+ {
195
+ "Sid": "FriggAPIGateway",
196
+ "Effect": "Allow",
197
+ "Action": [
198
+ "apigateway:POST",
199
+ "apigateway:PUT",
200
+ "apigateway:DELETE",
201
+ "apigateway:GET",
202
+ "apigateway:PATCH",
203
+ "apigateway:TagResource",
204
+ "apigateway:UntagResource"
205
+ ],
206
+ "Resource": [
207
+ "arn:aws:apigateway:*::/restapis",
208
+ "arn:aws:apigateway:*::/restapis/*",
209
+ "arn:aws:apigateway:*::/apis",
210
+ "arn:aws:apigateway:*::/apis/*",
211
+ "arn:aws:apigateway:*::/apis/*/stages",
212
+ "arn:aws:apigateway:*::/apis/*/stages/*",
213
+ "arn:aws:apigateway:*::/domainnames",
214
+ "arn:aws:apigateway:*::/domainnames/*"
215
+ ]
216
+ },
217
+ {
218
+ "Sid": "FriggVPCDeploymentPermissions",
219
+ "Effect": "Allow",
220
+ "Action": [
221
+ "ec2:CreateVpcEndpoint",
222
+ "ec2:DeleteVpcEndpoint",
223
+ "ec2:DescribeVpcEndpoints",
224
+ "ec2:ModifyVpcEndpoint",
225
+ "ec2:CreateNatGateway",
226
+ "ec2:DeleteNatGateway",
227
+ "ec2:DescribeNatGateways",
228
+ "ec2:AllocateAddress",
229
+ "ec2:ReleaseAddress",
230
+ "ec2:DescribeAddresses",
231
+ "ec2:CreateRouteTable",
232
+ "ec2:DeleteRouteTable",
233
+ "ec2:DescribeRouteTables",
234
+ "ec2:CreateRoute",
235
+ "ec2:DeleteRoute",
236
+ "ec2:AssociateRouteTable",
237
+ "ec2:DisassociateRouteTable",
238
+ "ec2:CreateSecurityGroup",
239
+ "ec2:DeleteSecurityGroup",
240
+ "ec2:AuthorizeSecurityGroupEgress",
241
+ "ec2:AuthorizeSecurityGroupIngress",
242
+ "ec2:RevokeSecurityGroupEgress",
243
+ "ec2:RevokeSecurityGroupIngress",
244
+ "ec2:CreateTags",
245
+ "ec2:DeleteTags",
246
+ "ec2:DescribeTags"
247
+ ],
248
+ "Resource": "*",
249
+ "Condition": {
250
+ "StringLike": {
251
+ "aws:RequestTag/Name": "*frigg*"
252
+ }
253
+ }
254
+ },
255
+ {
256
+ "Sid": "FriggKMSEncryptionPermissions",
257
+ "Effect": "Allow",
258
+ "Action": [
259
+ "kms:GenerateDataKey",
260
+ "kms:Decrypt"
261
+ ],
262
+ "Resource": [
263
+ "arn:aws:kms:*:*:key/*"
264
+ ],
265
+ "Condition": {
266
+ "StringEquals": {
267
+ "kms:ViaService": [
268
+ "lambda.*.amazonaws.com",
269
+ "s3.*.amazonaws.com"
270
+ ]
271
+ }
272
+ }
273
+ },
274
+ {
275
+ "Sid": "FriggSSMParameterAccess",
276
+ "Effect": "Allow",
277
+ "Action": [
278
+ "ssm:GetParameter",
279
+ "ssm:GetParameters",
280
+ "ssm:GetParametersByPath"
281
+ ],
282
+ "Resource": [
283
+ "arn:aws:ssm:*:*:parameter/*frigg*",
284
+ "arn:aws:ssm:*:*:parameter/*frigg*/*"
285
+ ]
286
+ }
287
+ ]
288
+ }