@friggframework/devtools 2.0.0--canary.398.53eac55.0 → 2.0.0--canary.398.a314355.0
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.
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# Frigg IAM Policy Templates
|
|
2
|
+
|
|
3
|
+
This directory contains IAM policy templates for deploying Frigg applications with the appropriate permissions.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
For immediate deployment, you have two ready-to-use IAM policy options:
|
|
8
|
+
|
|
9
|
+
### Option 1: Basic Policy (Recommended for getting started)
|
|
10
|
+
```bash
|
|
11
|
+
# Use the basic policy for core Frigg functionality
|
|
12
|
+
aws iam put-user-policy \
|
|
13
|
+
--user-name frigg-deployment-user \
|
|
14
|
+
--policy-name FriggBasicDeploymentPolicy \
|
|
15
|
+
--policy-document file://iam-policy-basic.json
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
**Includes permissions for:**
|
|
19
|
+
- ✅ AWS Discovery (finding your VPC, subnets, security groups)
|
|
20
|
+
- ✅ CloudFormation stacks (deploy/update Frigg applications)
|
|
21
|
+
- ✅ Lambda functions (create and manage serverless functions)
|
|
22
|
+
- ✅ API Gateway (HTTP endpoints for your integrations)
|
|
23
|
+
- ✅ SQS/SNS (message queues and notifications)
|
|
24
|
+
- ✅ S3 (deployment artifacts)
|
|
25
|
+
- ✅ CloudWatch/Logs (monitoring and logging)
|
|
26
|
+
- ✅ IAM roles (Lambda execution roles)
|
|
27
|
+
|
|
28
|
+
### Option 2: Full Policy (All features enabled)
|
|
29
|
+
```bash
|
|
30
|
+
# Use the full policy for advanced Frigg features
|
|
31
|
+
aws iam put-user-policy \
|
|
32
|
+
--user-name frigg-deployment-user \
|
|
33
|
+
--policy-name FriggFullDeploymentPolicy \
|
|
34
|
+
--policy-document file://iam-policy-full.json
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**Includes everything from Basic Policy PLUS:**
|
|
38
|
+
- ✅ **VPC Management** - Create route tables, NAT gateways, VPC endpoints
|
|
39
|
+
- ✅ **KMS Encryption** - Field-level encryption for sensitive data
|
|
40
|
+
- ✅ **SSM Parameter Store** - Secure configuration management
|
|
41
|
+
|
|
42
|
+
## When to Use Which Policy
|
|
43
|
+
|
|
44
|
+
### Use Basic Policy When:
|
|
45
|
+
- Getting started with Frigg
|
|
46
|
+
- Building simple integrations without VPC requirements
|
|
47
|
+
- You want minimal AWS permissions
|
|
48
|
+
- You're not handling sensitive data requiring encryption
|
|
49
|
+
|
|
50
|
+
### Use Full Policy When:
|
|
51
|
+
- You need VPC isolation for security/compliance
|
|
52
|
+
- You're handling sensitive data requiring KMS encryption
|
|
53
|
+
- You want to use SSM Parameter Store for configuration
|
|
54
|
+
- You're deploying production applications
|
|
55
|
+
|
|
56
|
+
## Current Issue Resolution
|
|
57
|
+
|
|
58
|
+
**If you're seeing the error:** `User is not authorized to perform: ec2:CreateRouteTable`
|
|
59
|
+
|
|
60
|
+
This means your current deployment user doesn't have VPC permissions. You have two options:
|
|
61
|
+
|
|
62
|
+
### Quick Fix: Apply Full Policy
|
|
63
|
+
```bash
|
|
64
|
+
aws iam put-user-policy \
|
|
65
|
+
--user-name frigg-deployment-user \
|
|
66
|
+
--policy-name FriggFullDeploymentPolicy \
|
|
67
|
+
--policy-document file://iam-policy-full.json
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Alternative: Update CloudFormation Stack
|
|
71
|
+
If you deployed using the CloudFormation template, update it with VPC support:
|
|
72
|
+
```bash
|
|
73
|
+
aws cloudformation update-stack \
|
|
74
|
+
--stack-name frigg-deployment-iam \
|
|
75
|
+
--template-body file://frigg-deployment-iam-stack.yaml \
|
|
76
|
+
--parameters ParameterKey=EnableVPCSupport,ParameterValue=true \
|
|
77
|
+
--capabilities CAPABILITY_IAM
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Using the IAM Generator
|
|
81
|
+
|
|
82
|
+
For custom policy generation based on your app definition:
|
|
83
|
+
|
|
84
|
+
```javascript
|
|
85
|
+
const { generateIAMPolicy, generateIAMCloudFormation } = require('./iam-generator');
|
|
86
|
+
|
|
87
|
+
// Generate basic JSON policy
|
|
88
|
+
const basicPolicy = generateIAMPolicy('basic');
|
|
89
|
+
|
|
90
|
+
// Generate full JSON policy
|
|
91
|
+
const fullPolicy = generateIAMPolicy('full');
|
|
92
|
+
|
|
93
|
+
// Generate CloudFormation template with auto-detection
|
|
94
|
+
const autoTemplate = generateIAMCloudFormation(appDefinition, { mode: 'auto' });
|
|
95
|
+
|
|
96
|
+
// Generate CloudFormation template with specific mode
|
|
97
|
+
const basicTemplate = generateIAMCloudFormation(appDefinition, { mode: 'basic' });
|
|
98
|
+
const fullTemplate = generateIAMCloudFormation(appDefinition, { mode: 'full' });
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Generator Modes
|
|
102
|
+
|
|
103
|
+
- **`basic`** - Core permissions only, ignores app definition features
|
|
104
|
+
- **`full`** - All features enabled, ignores app definition features
|
|
105
|
+
- **`auto`** - Analyzes app definition and enables features as needed (default)
|
|
106
|
+
|
|
107
|
+
## Security Best Practices
|
|
108
|
+
|
|
109
|
+
### Resource Scoping
|
|
110
|
+
Both policies are scoped to resources containing "frigg" in their names:
|
|
111
|
+
- ✅ `my-frigg-app-prod` (will work)
|
|
112
|
+
- ❌ `my-integration-app` (won't work - missing "frigg")
|
|
113
|
+
|
|
114
|
+
### Account-Specific Resources
|
|
115
|
+
Replace `*` with your AWS account ID for tighter security:
|
|
116
|
+
```json
|
|
117
|
+
{
|
|
118
|
+
"Resource": [
|
|
119
|
+
"arn:aws:lambda:us-east-1:123456789012:function:*frigg*"
|
|
120
|
+
]
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Environment-Specific Policies
|
|
125
|
+
Consider separate policies for different environments:
|
|
126
|
+
- `frigg-dev-policy` (full permissions for development)
|
|
127
|
+
- `frigg-prod-policy` (restricted permissions for production)
|
|
128
|
+
|
|
129
|
+
## Troubleshooting
|
|
130
|
+
|
|
131
|
+
### Common Permission Errors
|
|
132
|
+
|
|
133
|
+
1. **"ec2:CreateRouteTable" error** → Use Full Policy
|
|
134
|
+
2. **"kms:GenerateDataKey" error** → Enable KMS in your policy
|
|
135
|
+
3. **"ssm:GetParameter" error** → Enable SSM in your policy
|
|
136
|
+
4. **Lambda VPC errors** → Ensure VPC permissions are enabled
|
|
137
|
+
|
|
138
|
+
### Validation
|
|
139
|
+
Test your policy by deploying a simple Frigg app:
|
|
140
|
+
```bash
|
|
141
|
+
npx create-frigg-app test-deployment
|
|
142
|
+
cd test-deployment
|
|
143
|
+
frigg deploy
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Policy Comparison
|
|
147
|
+
|
|
148
|
+
| Feature | Basic Policy | Full Policy | CloudFormation Template |
|
|
149
|
+
|---------|--------------|-------------|-------------------------|
|
|
150
|
+
| Core Deployment | ✅ | ✅ | ✅ |
|
|
151
|
+
| VPC Management | ❌ | ✅ | ✅ (conditional) |
|
|
152
|
+
| KMS Encryption | ❌ | ✅ | ✅ (conditional) |
|
|
153
|
+
| SSM Parameters | ❌ | ✅ | ✅ (conditional) |
|
|
154
|
+
| Format | JSON | JSON | YAML with parameters |
|
|
155
|
+
| Use Case | Getting started | Production ready | Infrastructure as Code |
|
|
156
|
+
|
|
157
|
+
## Files in this Directory
|
|
158
|
+
|
|
159
|
+
- `iam-policy-basic.json` - Core Frigg permissions only (JSON format)
|
|
160
|
+
- `iam-policy-full.json` - All features enabled (JSON format)
|
|
161
|
+
- `frigg-deployment-iam-stack.yaml` - CloudFormation template with conditional parameters
|
|
162
|
+
- `iam-generator.js` - Programmatic policy generation with basic/full/auto modes
|
|
163
|
+
- `AWS-IAM-CREDENTIAL-NEEDS.md` - Detailed permission explanations and troubleshooting
|
|
164
|
+
- `IAM-POLICY-TEMPLATES.md` - This file - Quick start guide and usage examples
|
|
165
|
+
|
|
166
|
+
## Support
|
|
167
|
+
|
|
168
|
+
If you encounter permission issues:
|
|
169
|
+
1. Check the error message for the specific missing permission
|
|
170
|
+
2. Verify your resource names contain "frigg"
|
|
171
|
+
3. Consider upgrading from Basic to Full policy
|
|
172
|
+
4. Review the AWS-IAM-CREDENTIAL-NEEDS.md for detailed explanations
|
|
@@ -280,15 +280,10 @@ Resources:
|
|
|
280
280
|
- 'ec2:AuthorizeSecurityGroupIngress'
|
|
281
281
|
- 'ec2:RevokeSecurityGroupEgress'
|
|
282
282
|
- 'ec2:RevokeSecurityGroupIngress'
|
|
283
|
+
- 'ec2:CreateTags'
|
|
284
|
+
- 'ec2:DeleteTags'
|
|
285
|
+
- 'ec2:DescribeTags'
|
|
283
286
|
Resource: '*'
|
|
284
|
-
Condition:
|
|
285
|
-
StringLike:
|
|
286
|
-
'ec2:CreateAction':
|
|
287
|
-
- 'CreateVpcEndpoint'
|
|
288
|
-
- 'CreateNatGateway'
|
|
289
|
-
- 'CreateRouteTable'
|
|
290
|
-
- 'CreateRoute'
|
|
291
|
-
- 'CreateSecurityGroup'
|
|
292
287
|
|
|
293
288
|
# KMS permissions
|
|
294
289
|
FriggKMSPolicy:
|
|
@@ -7,21 +7,40 @@ const path = require('path');
|
|
|
7
7
|
* @param {Object} options - Generation options
|
|
8
8
|
* @param {string} [options.deploymentUserName='frigg-deployment-user'] - IAM user name
|
|
9
9
|
* @param {string} [options.stackName='frigg-deployment-iam'] - CloudFormation stack name
|
|
10
|
+
* @param {string} [options.mode='auto'] - Policy mode: 'basic', 'full', or 'auto' (auto-detect from appDefinition)
|
|
10
11
|
* @returns {string} CloudFormation YAML template
|
|
11
12
|
*/
|
|
12
13
|
function generateIAMCloudFormation(appDefinition, options = {}) {
|
|
13
14
|
const {
|
|
14
15
|
deploymentUserName = 'frigg-deployment-user',
|
|
15
|
-
stackName = 'frigg-deployment-iam'
|
|
16
|
+
stackName = 'frigg-deployment-iam',
|
|
17
|
+
mode = 'auto'
|
|
16
18
|
} = options;
|
|
17
19
|
|
|
18
|
-
// Determine which features are enabled
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
// Determine which features are enabled based on mode
|
|
21
|
+
let features;
|
|
22
|
+
if (mode === 'basic') {
|
|
23
|
+
features = {
|
|
24
|
+
vpc: false,
|
|
25
|
+
kms: false,
|
|
26
|
+
ssm: false,
|
|
27
|
+
websockets: appDefinition.websockets?.enable === true
|
|
28
|
+
};
|
|
29
|
+
} else if (mode === 'full') {
|
|
30
|
+
features = {
|
|
31
|
+
vpc: true,
|
|
32
|
+
kms: true,
|
|
33
|
+
ssm: true,
|
|
34
|
+
websockets: appDefinition.websockets?.enable === true
|
|
35
|
+
};
|
|
36
|
+
} else { // mode === 'auto'
|
|
37
|
+
features = {
|
|
38
|
+
vpc: appDefinition.vpc?.enable === true,
|
|
39
|
+
kms: appDefinition.encryption?.useDefaultKMSForFieldLevelEncryption === true,
|
|
40
|
+
ssm: appDefinition.ssm?.enable === true,
|
|
41
|
+
websockets: appDefinition.websockets?.enable === true
|
|
42
|
+
};
|
|
43
|
+
}
|
|
25
44
|
|
|
26
45
|
// Build the CloudFormation template
|
|
27
46
|
const template = {
|
|
@@ -638,7 +657,40 @@ function getFeatureSummary(appDefinition) {
|
|
|
638
657
|
};
|
|
639
658
|
}
|
|
640
659
|
|
|
660
|
+
/**
|
|
661
|
+
* Generate basic IAM policy (JSON format) - Core Frigg permissions only
|
|
662
|
+
* @returns {Object} Basic IAM policy document
|
|
663
|
+
*/
|
|
664
|
+
function generateBasicIAMPolicy() {
|
|
665
|
+
const basicPolicyPath = path.join(__dirname, 'iam-policy-basic.json');
|
|
666
|
+
return require(basicPolicyPath);
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
/**
|
|
670
|
+
* Generate full IAM policy (JSON format) - All features enabled
|
|
671
|
+
* @returns {Object} Full IAM policy document
|
|
672
|
+
*/
|
|
673
|
+
function generateFullIAMPolicy() {
|
|
674
|
+
const fullPolicyPath = path.join(__dirname, 'iam-policy-full.json');
|
|
675
|
+
return require(fullPolicyPath);
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
/**
|
|
679
|
+
* Generate IAM policy based on mode
|
|
680
|
+
* @param {string} mode - 'basic' or 'full'
|
|
681
|
+
* @returns {Object} IAM policy document
|
|
682
|
+
*/
|
|
683
|
+
function generateIAMPolicy(mode = 'basic') {
|
|
684
|
+
if (mode === 'full') {
|
|
685
|
+
return generateFullIAMPolicy();
|
|
686
|
+
}
|
|
687
|
+
return generateBasicIAMPolicy();
|
|
688
|
+
}
|
|
689
|
+
|
|
641
690
|
module.exports = {
|
|
642
691
|
generateIAMCloudFormation,
|
|
643
|
-
getFeatureSummary
|
|
692
|
+
getFeatureSummary,
|
|
693
|
+
generateBasicIAMPolicy,
|
|
694
|
+
generateFullIAMPolicy,
|
|
695
|
+
generateIAMPolicy
|
|
644
696
|
};
|
|
@@ -0,0 +1,196 @@
|
|
|
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
|
+
],
|
|
55
|
+
"Resource": [
|
|
56
|
+
"arn:aws:s3:::*serverless*",
|
|
57
|
+
"arn:aws:s3:::*serverless*/*"
|
|
58
|
+
]
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"Sid": "LambdaFriggFunctions",
|
|
62
|
+
"Effect": "Allow",
|
|
63
|
+
"Action": [
|
|
64
|
+
"lambda:CreateFunction",
|
|
65
|
+
"lambda:UpdateFunctionCode",
|
|
66
|
+
"lambda:UpdateFunctionConfiguration",
|
|
67
|
+
"lambda:DeleteFunction",
|
|
68
|
+
"lambda:GetFunction",
|
|
69
|
+
"lambda:ListFunctions",
|
|
70
|
+
"lambda:PublishVersion",
|
|
71
|
+
"lambda:CreateAlias",
|
|
72
|
+
"lambda:UpdateAlias",
|
|
73
|
+
"lambda:DeleteAlias",
|
|
74
|
+
"lambda:GetAlias",
|
|
75
|
+
"lambda:AddPermission",
|
|
76
|
+
"lambda:RemovePermission",
|
|
77
|
+
"lambda:GetPolicy",
|
|
78
|
+
"lambda:PutProvisionedConcurrencyConfig",
|
|
79
|
+
"lambda:DeleteProvisionedConcurrencyConfig",
|
|
80
|
+
"lambda:PutConcurrency",
|
|
81
|
+
"lambda:DeleteConcurrency",
|
|
82
|
+
"lambda:TagResource",
|
|
83
|
+
"lambda:UntagResource",
|
|
84
|
+
"lambda:ListVersionsByFunction"
|
|
85
|
+
],
|
|
86
|
+
"Resource": [
|
|
87
|
+
"arn:aws:lambda:*:*:function:*frigg*"
|
|
88
|
+
]
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"Sid": "IAMRolesForFriggLambda",
|
|
92
|
+
"Effect": "Allow",
|
|
93
|
+
"Action": [
|
|
94
|
+
"iam:CreateRole",
|
|
95
|
+
"iam:DeleteRole",
|
|
96
|
+
"iam:GetRole",
|
|
97
|
+
"iam:PassRole",
|
|
98
|
+
"iam:PutRolePolicy",
|
|
99
|
+
"iam:DeleteRolePolicy",
|
|
100
|
+
"iam:GetRolePolicy",
|
|
101
|
+
"iam:AttachRolePolicy",
|
|
102
|
+
"iam:DetachRolePolicy",
|
|
103
|
+
"iam:TagRole",
|
|
104
|
+
"iam:UntagRole"
|
|
105
|
+
],
|
|
106
|
+
"Resource": [
|
|
107
|
+
"arn:aws:iam::*:role/*frigg*",
|
|
108
|
+
"arn:aws:iam::*:role/*frigg*LambdaRole*"
|
|
109
|
+
]
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"Sid": "IAMPolicyVersionPermissions",
|
|
113
|
+
"Effect": "Allow",
|
|
114
|
+
"Action": [
|
|
115
|
+
"iam:ListPolicyVersions"
|
|
116
|
+
],
|
|
117
|
+
"Resource": [
|
|
118
|
+
"arn:aws:iam::*:policy/*"
|
|
119
|
+
]
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"Sid": "FriggMessagingServices",
|
|
123
|
+
"Effect": "Allow",
|
|
124
|
+
"Action": [
|
|
125
|
+
"sqs:CreateQueue",
|
|
126
|
+
"sqs:DeleteQueue",
|
|
127
|
+
"sqs:GetQueueAttributes",
|
|
128
|
+
"sqs:SetQueueAttributes",
|
|
129
|
+
"sqs:GetQueueUrl",
|
|
130
|
+
"sqs:TagQueue",
|
|
131
|
+
"sqs:UntagQueue"
|
|
132
|
+
],
|
|
133
|
+
"Resource": [
|
|
134
|
+
"arn:aws:sqs:*:*:*frigg*",
|
|
135
|
+
"arn:aws:sqs:*:*:internal-error-queue-*"
|
|
136
|
+
]
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
"Sid": "FriggSNSTopics",
|
|
140
|
+
"Effect": "Allow",
|
|
141
|
+
"Action": [
|
|
142
|
+
"sns:CreateTopic",
|
|
143
|
+
"sns:DeleteTopic",
|
|
144
|
+
"sns:GetTopicAttributes",
|
|
145
|
+
"sns:SetTopicAttributes",
|
|
146
|
+
"sns:Subscribe",
|
|
147
|
+
"sns:Unsubscribe",
|
|
148
|
+
"sns:ListSubscriptionsByTopic",
|
|
149
|
+
"sns:TagResource",
|
|
150
|
+
"sns:UntagResource"
|
|
151
|
+
],
|
|
152
|
+
"Resource": [
|
|
153
|
+
"arn:aws:sns:*:*:*frigg*"
|
|
154
|
+
]
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
"Sid": "FriggMonitoringAndLogs",
|
|
158
|
+
"Effect": "Allow",
|
|
159
|
+
"Action": [
|
|
160
|
+
"cloudwatch:PutMetricAlarm",
|
|
161
|
+
"cloudwatch:DeleteAlarms",
|
|
162
|
+
"cloudwatch:DescribeAlarms",
|
|
163
|
+
"logs:CreateLogGroup",
|
|
164
|
+
"logs:CreateLogStream",
|
|
165
|
+
"logs:DeleteLogGroup",
|
|
166
|
+
"logs:DescribeLogGroups",
|
|
167
|
+
"logs:DescribeLogStreams",
|
|
168
|
+
"logs:FilterLogEvents",
|
|
169
|
+
"logs:PutLogEvents",
|
|
170
|
+
"logs:PutRetentionPolicy"
|
|
171
|
+
],
|
|
172
|
+
"Resource": [
|
|
173
|
+
"arn:aws:logs:*:*:log-group:/aws/lambda/*frigg*",
|
|
174
|
+
"arn:aws:logs:*:*:log-group:/aws/lambda/*frigg*:*",
|
|
175
|
+
"arn:aws:cloudwatch:*:*:alarm:*frigg*"
|
|
176
|
+
]
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
"Sid": "FriggAPIGateway",
|
|
180
|
+
"Effect": "Allow",
|
|
181
|
+
"Action": [
|
|
182
|
+
"apigateway:POST",
|
|
183
|
+
"apigateway:PUT",
|
|
184
|
+
"apigateway:DELETE",
|
|
185
|
+
"apigateway:GET",
|
|
186
|
+
"apigateway:PATCH"
|
|
187
|
+
],
|
|
188
|
+
"Resource": [
|
|
189
|
+
"arn:aws:apigateway:*::/restapis",
|
|
190
|
+
"arn:aws:apigateway:*::/restapis/*",
|
|
191
|
+
"arn:aws:apigateway:*::/domainnames",
|
|
192
|
+
"arn:aws:apigateway:*::/domainnames/*"
|
|
193
|
+
]
|
|
194
|
+
}
|
|
195
|
+
]
|
|
196
|
+
}
|
|
@@ -0,0 +1,266 @@
|
|
|
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
|
+
],
|
|
55
|
+
"Resource": [
|
|
56
|
+
"arn:aws:s3:::*serverless*",
|
|
57
|
+
"arn:aws:s3:::*serverless*/*"
|
|
58
|
+
]
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"Sid": "LambdaFriggFunctions",
|
|
62
|
+
"Effect": "Allow",
|
|
63
|
+
"Action": [
|
|
64
|
+
"lambda:CreateFunction",
|
|
65
|
+
"lambda:UpdateFunctionCode",
|
|
66
|
+
"lambda:UpdateFunctionConfiguration",
|
|
67
|
+
"lambda:DeleteFunction",
|
|
68
|
+
"lambda:GetFunction",
|
|
69
|
+
"lambda:ListFunctions",
|
|
70
|
+
"lambda:PublishVersion",
|
|
71
|
+
"lambda:CreateAlias",
|
|
72
|
+
"lambda:UpdateAlias",
|
|
73
|
+
"lambda:DeleteAlias",
|
|
74
|
+
"lambda:GetAlias",
|
|
75
|
+
"lambda:AddPermission",
|
|
76
|
+
"lambda:RemovePermission",
|
|
77
|
+
"lambda:GetPolicy",
|
|
78
|
+
"lambda:PutProvisionedConcurrencyConfig",
|
|
79
|
+
"lambda:DeleteProvisionedConcurrencyConfig",
|
|
80
|
+
"lambda:PutConcurrency",
|
|
81
|
+
"lambda:DeleteConcurrency",
|
|
82
|
+
"lambda:TagResource",
|
|
83
|
+
"lambda:UntagResource",
|
|
84
|
+
"lambda:ListVersionsByFunction"
|
|
85
|
+
],
|
|
86
|
+
"Resource": [
|
|
87
|
+
"arn:aws:lambda:*:*:function:*frigg*"
|
|
88
|
+
]
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"Sid": "IAMRolesForFriggLambda",
|
|
92
|
+
"Effect": "Allow",
|
|
93
|
+
"Action": [
|
|
94
|
+
"iam:CreateRole",
|
|
95
|
+
"iam:DeleteRole",
|
|
96
|
+
"iam:GetRole",
|
|
97
|
+
"iam:PassRole",
|
|
98
|
+
"iam:PutRolePolicy",
|
|
99
|
+
"iam:DeleteRolePolicy",
|
|
100
|
+
"iam:GetRolePolicy",
|
|
101
|
+
"iam:AttachRolePolicy",
|
|
102
|
+
"iam:DetachRolePolicy",
|
|
103
|
+
"iam:TagRole",
|
|
104
|
+
"iam:UntagRole"
|
|
105
|
+
],
|
|
106
|
+
"Resource": [
|
|
107
|
+
"arn:aws:iam::*:role/*frigg*",
|
|
108
|
+
"arn:aws:iam::*:role/*frigg*LambdaRole*"
|
|
109
|
+
]
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"Sid": "IAMPolicyVersionPermissions",
|
|
113
|
+
"Effect": "Allow",
|
|
114
|
+
"Action": [
|
|
115
|
+
"iam:ListPolicyVersions"
|
|
116
|
+
],
|
|
117
|
+
"Resource": [
|
|
118
|
+
"arn:aws:iam::*:policy/*"
|
|
119
|
+
]
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"Sid": "FriggMessagingServices",
|
|
123
|
+
"Effect": "Allow",
|
|
124
|
+
"Action": [
|
|
125
|
+
"sqs:CreateQueue",
|
|
126
|
+
"sqs:DeleteQueue",
|
|
127
|
+
"sqs:GetQueueAttributes",
|
|
128
|
+
"sqs:SetQueueAttributes",
|
|
129
|
+
"sqs:GetQueueUrl",
|
|
130
|
+
"sqs:TagQueue",
|
|
131
|
+
"sqs:UntagQueue"
|
|
132
|
+
],
|
|
133
|
+
"Resource": [
|
|
134
|
+
"arn:aws:sqs:*:*:*frigg*",
|
|
135
|
+
"arn:aws:sqs:*:*:internal-error-queue-*"
|
|
136
|
+
]
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
"Sid": "FriggSNSTopics",
|
|
140
|
+
"Effect": "Allow",
|
|
141
|
+
"Action": [
|
|
142
|
+
"sns:CreateTopic",
|
|
143
|
+
"sns:DeleteTopic",
|
|
144
|
+
"sns:GetTopicAttributes",
|
|
145
|
+
"sns:SetTopicAttributes",
|
|
146
|
+
"sns:Subscribe",
|
|
147
|
+
"sns:Unsubscribe",
|
|
148
|
+
"sns:ListSubscriptionsByTopic",
|
|
149
|
+
"sns:TagResource",
|
|
150
|
+
"sns:UntagResource"
|
|
151
|
+
],
|
|
152
|
+
"Resource": [
|
|
153
|
+
"arn:aws:sns:*:*:*frigg*"
|
|
154
|
+
]
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
"Sid": "FriggMonitoringAndLogs",
|
|
158
|
+
"Effect": "Allow",
|
|
159
|
+
"Action": [
|
|
160
|
+
"cloudwatch:PutMetricAlarm",
|
|
161
|
+
"cloudwatch:DeleteAlarms",
|
|
162
|
+
"cloudwatch:DescribeAlarms",
|
|
163
|
+
"logs:CreateLogGroup",
|
|
164
|
+
"logs:CreateLogStream",
|
|
165
|
+
"logs:DeleteLogGroup",
|
|
166
|
+
"logs:DescribeLogGroups",
|
|
167
|
+
"logs:DescribeLogStreams",
|
|
168
|
+
"logs:FilterLogEvents",
|
|
169
|
+
"logs:PutLogEvents",
|
|
170
|
+
"logs:PutRetentionPolicy"
|
|
171
|
+
],
|
|
172
|
+
"Resource": [
|
|
173
|
+
"arn:aws:logs:*:*:log-group:/aws/lambda/*frigg*",
|
|
174
|
+
"arn:aws:logs:*:*:log-group:/aws/lambda/*frigg*:*",
|
|
175
|
+
"arn:aws:cloudwatch:*:*:alarm:*frigg*"
|
|
176
|
+
]
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
"Sid": "FriggAPIGateway",
|
|
180
|
+
"Effect": "Allow",
|
|
181
|
+
"Action": [
|
|
182
|
+
"apigateway:POST",
|
|
183
|
+
"apigateway:PUT",
|
|
184
|
+
"apigateway:DELETE",
|
|
185
|
+
"apigateway:GET",
|
|
186
|
+
"apigateway:PATCH"
|
|
187
|
+
],
|
|
188
|
+
"Resource": [
|
|
189
|
+
"arn:aws:apigateway:*::/restapis",
|
|
190
|
+
"arn:aws:apigateway:*::/restapis/*",
|
|
191
|
+
"arn:aws:apigateway:*::/domainnames",
|
|
192
|
+
"arn:aws:apigateway:*::/domainnames/*"
|
|
193
|
+
]
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
"Sid": "FriggVPCDeploymentPermissions",
|
|
197
|
+
"Effect": "Allow",
|
|
198
|
+
"Action": [
|
|
199
|
+
"ec2:CreateVpcEndpoint",
|
|
200
|
+
"ec2:DeleteVpcEndpoint",
|
|
201
|
+
"ec2:DescribeVpcEndpoints",
|
|
202
|
+
"ec2:ModifyVpcEndpoint",
|
|
203
|
+
"ec2:CreateNatGateway",
|
|
204
|
+
"ec2:DeleteNatGateway",
|
|
205
|
+
"ec2:DescribeNatGateways",
|
|
206
|
+
"ec2:AllocateAddress",
|
|
207
|
+
"ec2:ReleaseAddress",
|
|
208
|
+
"ec2:DescribeAddresses",
|
|
209
|
+
"ec2:CreateRouteTable",
|
|
210
|
+
"ec2:DeleteRouteTable",
|
|
211
|
+
"ec2:DescribeRouteTables",
|
|
212
|
+
"ec2:CreateRoute",
|
|
213
|
+
"ec2:DeleteRoute",
|
|
214
|
+
"ec2:AssociateRouteTable",
|
|
215
|
+
"ec2:DisassociateRouteTable",
|
|
216
|
+
"ec2:CreateSecurityGroup",
|
|
217
|
+
"ec2:DeleteSecurityGroup",
|
|
218
|
+
"ec2:AuthorizeSecurityGroupEgress",
|
|
219
|
+
"ec2:AuthorizeSecurityGroupIngress",
|
|
220
|
+
"ec2:RevokeSecurityGroupEgress",
|
|
221
|
+
"ec2:RevokeSecurityGroupIngress",
|
|
222
|
+
"ec2:CreateTags",
|
|
223
|
+
"ec2:DeleteTags",
|
|
224
|
+
"ec2:DescribeTags"
|
|
225
|
+
],
|
|
226
|
+
"Resource": "*",
|
|
227
|
+
"Condition": {
|
|
228
|
+
"StringLike": {
|
|
229
|
+
"aws:RequestTag/Name": "*frigg*"
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
"Sid": "FriggKMSEncryptionPermissions",
|
|
235
|
+
"Effect": "Allow",
|
|
236
|
+
"Action": [
|
|
237
|
+
"kms:GenerateDataKey",
|
|
238
|
+
"kms:Decrypt"
|
|
239
|
+
],
|
|
240
|
+
"Resource": [
|
|
241
|
+
"arn:aws:kms:*:*:key/*"
|
|
242
|
+
],
|
|
243
|
+
"Condition": {
|
|
244
|
+
"StringEquals": {
|
|
245
|
+
"kms:ViaService": [
|
|
246
|
+
"lambda.*.amazonaws.com",
|
|
247
|
+
"s3.*.amazonaws.com"
|
|
248
|
+
]
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
"Sid": "FriggSSMParameterAccess",
|
|
254
|
+
"Effect": "Allow",
|
|
255
|
+
"Action": [
|
|
256
|
+
"ssm:GetParameter",
|
|
257
|
+
"ssm:GetParameters",
|
|
258
|
+
"ssm:GetParametersByPath"
|
|
259
|
+
],
|
|
260
|
+
"Resource": [
|
|
261
|
+
"arn:aws:ssm:*:*:parameter/*frigg*",
|
|
262
|
+
"arn:aws:ssm:*:*:parameter/*frigg*/*"
|
|
263
|
+
]
|
|
264
|
+
}
|
|
265
|
+
]
|
|
266
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@friggframework/devtools",
|
|
3
3
|
"prettier": "@friggframework/prettier-config",
|
|
4
|
-
"version": "2.0.0--canary.398.
|
|
4
|
+
"version": "2.0.0--canary.398.a314355.0",
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"@aws-sdk/client-ec2": "^3.835.0",
|
|
7
7
|
"@aws-sdk/client-kms": "^3.835.0",
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"@babel/eslint-parser": "^7.18.9",
|
|
10
10
|
"@babel/parser": "^7.25.3",
|
|
11
11
|
"@babel/traverse": "^7.25.3",
|
|
12
|
-
"@friggframework/test": "2.0.0--canary.398.
|
|
12
|
+
"@friggframework/test": "2.0.0--canary.398.a314355.0",
|
|
13
13
|
"@hapi/boom": "^10.0.1",
|
|
14
14
|
"@inquirer/prompts": "^5.3.8",
|
|
15
15
|
"axios": "^1.7.2",
|
|
@@ -31,8 +31,8 @@
|
|
|
31
31
|
"serverless-http": "^2.7.0"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
|
-
"@friggframework/eslint-config": "2.0.0--canary.398.
|
|
35
|
-
"@friggframework/prettier-config": "2.0.0--canary.398.
|
|
34
|
+
"@friggframework/eslint-config": "2.0.0--canary.398.a314355.0",
|
|
35
|
+
"@friggframework/prettier-config": "2.0.0--canary.398.a314355.0",
|
|
36
36
|
"prettier": "^2.7.1",
|
|
37
37
|
"serverless": "3.39.0",
|
|
38
38
|
"serverless-dotenv-plugin": "^6.0.0",
|
|
@@ -64,5 +64,5 @@
|
|
|
64
64
|
"publishConfig": {
|
|
65
65
|
"access": "public"
|
|
66
66
|
},
|
|
67
|
-
"gitHead": "
|
|
67
|
+
"gitHead": "a31435596361f047f54cfbcc03c9863b129d0d1c"
|
|
68
68
|
}
|