(cloudProvider: GcpCloudProvider)
| 48 | }; |
| 49 | |
| 50 | export const createAirnodeBucket = async (cloudProvider: GcpCloudProvider) => { |
| 51 | const storage = initializeGcsService(); |
| 52 | const bucketName = generateBucketName(); |
| 53 | |
| 54 | logger.debug(`Creating GCS bucket '${bucketName}' in ${cloudProvider.region}`); |
| 55 | const goCreate = await go(() => storage.createBucket(bucketName, { location: cloudProvider.region })); |
| 56 | if (!goCreate.success) { |
| 57 | throw new Error(`Failed to create an GCS bucket: ${goCreate.error}`); |
| 58 | } |
| 59 | |
| 60 | const [bucket] = goCreate.data; |
| 61 | |
| 62 | // Setting uniform bucket-level access |
| 63 | // https://cloud.google.com/storage/docs/uniform-bucket-level-access |
| 64 | logger.debug(`Setting uniform bucket-level access for GCS bucket '${bucketName}'`); |
| 65 | const goMetadata = await go(() => |
| 66 | bucket.setMetadata({ |
| 67 | iamConfiguration: { uniformBucketLevelAccess: { enabled: true }, publicAccessPrevention: 'enforced' }, |
| 68 | }) |
| 69 | ); |
| 70 | if (!goMetadata.success) { |
| 71 | throw new Error(`Failed to setup a uniform bucket-level access for bucket '${bucketName}': ${goMetadata.error}`); |
| 72 | } |
| 73 | |
| 74 | // Adding roles that are by default added when adding bucket via GCP Console. Some are missing when creating bucket via SDK, |
| 75 | // causing user not being able to see the bucket content in the GCP Console. |
| 76 | const policy = { |
| 77 | bindings: [ |
| 78 | { |
| 79 | role: 'roles/storage.legacyBucketReader', |
| 80 | members: [`projectViewer:${cloudProvider.projectId}`], |
| 81 | }, |
| 82 | { |
| 83 | role: 'roles/storage.legacyBucketOwner', |
| 84 | members: [`projectEditor:${cloudProvider.projectId}`, `projectOwner:${cloudProvider.projectId}`], |
| 85 | }, |
| 86 | { |
| 87 | role: 'roles/storage.legacyObjectReader', |
| 88 | members: [`projectViewer:${cloudProvider.projectId}`], |
| 89 | }, |
| 90 | { |
| 91 | role: 'roles/storage.legacyObjectOwner', |
| 92 | members: [`projectEditor:${cloudProvider.projectId}`, `projectOwner:${cloudProvider.projectId}`], |
| 93 | }, |
| 94 | ], |
| 95 | }; |
| 96 | logger.debug(`Setting necessary IAM policy for GCS bucket '${bucketName}'`); |
| 97 | const goPolicy = await go(() => bucket.iam.setPolicy(policy)); |
| 98 | if (!goPolicy.success) { |
| 99 | throw new Error(`Failed to setup IAM policy for bucket '${bucketName}': ${goPolicy.error}`); |
| 100 | } |
| 101 | |
| 102 | return { |
| 103 | name: bucketName, |
| 104 | region: cloudProvider.region, |
| 105 | }; |
| 106 | }; |
| 107 |
no test coverage detected