@webda/aws 4.0.0-beta.1 → 4.0.0-beta.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.
- package/README.md +64 -7
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js.map +1 -1
- package/lib/services/aws-parameters.d.ts +33 -0
- package/lib/services/aws-parameters.d.ts.map +1 -0
- package/lib/services/aws-parameters.js +18 -0
- package/lib/services/aws-parameters.js.map +1 -0
- package/lib/services/awscommands.service.d.ts +39 -0
- package/lib/services/awscommands.service.d.ts.map +1 -0
- package/lib/services/awscommands.service.js +127 -0
- package/lib/services/awscommands.service.js.map +1 -0
- package/lib/services/cloudwatchlogger.service.d.ts +131 -0
- package/lib/services/cloudwatchlogger.service.d.ts.map +1 -0
- package/lib/services/{cloudwatchlogger.js → cloudwatchlogger.service.js} +66 -34
- package/lib/services/cloudwatchlogger.service.js.map +1 -0
- package/lib/services/contributors.d.ts +37 -0
- package/lib/services/contributors.d.ts.map +1 -0
- package/lib/services/contributors.js +2 -0
- package/lib/services/contributors.js.map +1 -0
- package/lib/services/dynamodb.service.d.ts +297 -0
- package/lib/services/dynamodb.service.d.ts.map +1 -0
- package/lib/services/dynamodb.service.js +985 -0
- package/lib/services/dynamodb.service.js.map +1 -0
- package/lib/services/index.d.ts +12 -31
- package/lib/services/index.d.ts.map +1 -0
- package/lib/services/index.js +11 -8
- package/lib/services/index.js.map +1 -1
- package/lib/services/lambdacaller.service.d.ts +81 -0
- package/lib/services/lambdacaller.service.d.ts.map +1 -0
- package/lib/services/lambdacaller.service.js +75 -0
- package/lib/services/lambdacaller.service.js.map +1 -0
- package/lib/services/lambdaserver.service.d.ts +127 -0
- package/lib/services/lambdaserver.service.d.ts.map +1 -0
- package/lib/services/lambdaserver.service.js +294 -0
- package/lib/services/lambdaserver.service.js.map +1 -0
- package/lib/services/{route53.d.ts → route53.service.d.ts} +21 -11
- package/lib/services/route53.service.d.ts.map +1 -0
- package/lib/services/{route53.js → route53.service.js} +35 -38
- package/lib/services/route53.service.js.map +1 -0
- package/lib/services/s3binary.service.d.ts +215 -0
- package/lib/services/s3binary.service.d.ts.map +1 -0
- package/lib/services/{s3binary.js → s3binary.service.js} +113 -74
- package/lib/services/s3binary.service.js.map +1 -0
- package/lib/services/secretsmanager.service.d.ts +102 -0
- package/lib/services/secretsmanager.service.d.ts.map +1 -0
- package/lib/services/{secretsmanager.js → secretsmanager.service.js} +42 -24
- package/lib/services/secretsmanager.service.js.map +1 -0
- package/lib/services/{sqsqueue.d.ts → sqsqueue.service.d.ts} +60 -34
- package/lib/services/sqsqueue.service.d.ts.map +1 -0
- package/lib/services/{sqsqueue.js → sqsqueue.service.js} +60 -35
- package/lib/services/sqsqueue.service.js.map +1 -0
- package/package.json +59 -65
- package/webda.module.json +738 -377
- package/lib/deployers/cloudformation.d.ts +0 -316
- package/lib/deployers/cloudformation.js +0 -837
- package/lib/deployers/cloudformation.js.map +0 -1
- package/lib/deployers/cloudformation.spec.d.ts +0 -1
- package/lib/deployers/cloudformation.spec.js +0 -530
- package/lib/deployers/cloudformation.spec.js.map +0 -1
- package/lib/deployers/index.d.ts +0 -254
- package/lib/deployers/index.js +0 -543
- package/lib/deployers/index.js.map +0 -1
- package/lib/deployers/index.spec.d.ts +0 -8
- package/lib/deployers/index.spec.js +0 -595
- package/lib/deployers/index.spec.js.map +0 -1
- package/lib/deployers/lambda-entrypoint.d.ts +0 -1
- package/lib/deployers/lambda-entrypoint.js +0 -11
- package/lib/deployers/lambda-entrypoint.js.map +0 -1
- package/lib/deployers/lambdapackager.d.ts +0 -27
- package/lib/deployers/lambdapackager.js +0 -26
- package/lib/deployers/lambdapackager.js.map +0 -1
- package/lib/deployers/lambdapackager.spec.d.ts +0 -1
- package/lib/deployers/lambdapackager.spec.js +0 -44
- package/lib/deployers/lambdapackager.spec.js.map +0 -1
- package/lib/index.spec.d.ts +0 -10
- package/lib/index.spec.js +0 -42
- package/lib/index.spec.js.map +0 -1
- package/lib/services/aws-mixin.d.ts +0 -24
- package/lib/services/aws-mixin.js +0 -18
- package/lib/services/aws-mixin.js.map +0 -1
- package/lib/services/cloudwatchlogger.d.ts +0 -81
- package/lib/services/cloudwatchlogger.js.map +0 -1
- package/lib/services/cloudwatchlogger.spec.d.ts +0 -1
- package/lib/services/cloudwatchlogger.spec.js +0 -104
- package/lib/services/cloudwatchlogger.spec.js.map +0 -1
- package/lib/services/dynamodb.d.ts +0 -173
- package/lib/services/dynamodb.js +0 -711
- package/lib/services/dynamodb.js.map +0 -1
- package/lib/services/dynamodb.spec.d.ts +0 -23
- package/lib/services/dynamodb.spec.js +0 -339
- package/lib/services/dynamodb.spec.js.map +0 -1
- package/lib/services/lambdacaller.d.ts +0 -68
- package/lib/services/lambdacaller.js +0 -63
- package/lib/services/lambdacaller.js.map +0 -1
- package/lib/services/lambdacaller.spec.d.ts +0 -1
- package/lib/services/lambdacaller.spec.js +0 -70
- package/lib/services/lambdacaller.spec.js.map +0 -1
- package/lib/services/lambdaserver.d.ts +0 -86
- package/lib/services/lambdaserver.js +0 -264
- package/lib/services/lambdaserver.js.map +0 -1
- package/lib/services/lambdaserver.spec.d.ts +0 -1
- package/lib/services/lambdaserver.spec.js +0 -417
- package/lib/services/lambdaserver.spec.js.map +0 -1
- package/lib/services/route53.js.map +0 -1
- package/lib/services/route53.spec.d.ts +0 -1
- package/lib/services/route53.spec.js +0 -102
- package/lib/services/route53.spec.js.map +0 -1
- package/lib/services/s3binary.d.ts +0 -162
- package/lib/services/s3binary.js.map +0 -1
- package/lib/services/s3binary.spec.d.ts +0 -1
- package/lib/services/s3binary.spec.js +0 -269
- package/lib/services/s3binary.spec.js.map +0 -1
- package/lib/services/secretsmanager.d.ts +0 -80
- package/lib/services/secretsmanager.js.map +0 -1
- package/lib/services/secretsmanager.spec.d.ts +0 -1
- package/lib/services/secretsmanager.spec.js +0 -66
- package/lib/services/secretsmanager.spec.js.map +0 -1
- package/lib/services/sqsqueue.js.map +0 -1
- package/lib/services/sqsqueue.spec.d.ts +0 -1
- package/lib/services/sqsqueue.spec.js +0 -152
- package/lib/services/sqsqueue.spec.js.map +0 -1
- package/lib/shell.d.ts +0 -12
- package/lib/shell.js +0 -42
- package/lib/shell.js.map +0 -1
- package/webda.shell.json +0 -11
package/lib/deployers/index.js
DELETED
|
@@ -1,543 +0,0 @@
|
|
|
1
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
-
};
|
|
7
|
-
import { ACM } from "@aws-sdk/client-acm";
|
|
8
|
-
import { EC2 } from "@aws-sdk/client-ec2";
|
|
9
|
-
import { Route53 } from "@aws-sdk/client-route-53";
|
|
10
|
-
import { NotFound, S3 } from "@aws-sdk/client-s3";
|
|
11
|
-
import { STS } from "@aws-sdk/client-sts";
|
|
12
|
-
import { Cache, WaitFor, WaitLinearDelay, WebdaError } from "@webda/core";
|
|
13
|
-
import { Deployer } from "@webda/shell";
|
|
14
|
-
import bluebird from "bluebird";
|
|
15
|
-
import * as crypto from "crypto";
|
|
16
|
-
import * as fs from "fs";
|
|
17
|
-
import { globSync } from "glob";
|
|
18
|
-
import IamPolicyOptimizer from "iam-policy-optimizer";
|
|
19
|
-
import * as mime from "mime-types";
|
|
20
|
-
import * as path from "path";
|
|
21
|
-
import { randomUUID } from "crypto";
|
|
22
|
-
import { Route53Service } from "../services/route53.js";
|
|
23
|
-
/**
|
|
24
|
-
* Abstract AWS Deployer
|
|
25
|
-
*
|
|
26
|
-
* It includes some basic utilities methods to be used by
|
|
27
|
-
* final deployers
|
|
28
|
-
*/
|
|
29
|
-
export class AWSDeployer extends Deployer {
|
|
30
|
-
constructor(manager, resources) {
|
|
31
|
-
super(manager, resources);
|
|
32
|
-
this.resources.accessKeyId = this.resources.accessKeyId || process.env["AWS_ACCESS_KEY_ID"];
|
|
33
|
-
this.resources.secretAccessKey = this.resources.secretAccessKey || process.env["AWS_SECRET_ACCESS_KEY"];
|
|
34
|
-
this.resources.sessionToken = this.resources.sessionToken || process.env["AWS_SESSION_TOKEN"];
|
|
35
|
-
this.resources.region = this.resources.region || process.env["AWS_DEFAULT_REGION"] || "us-east-1";
|
|
36
|
-
this.resources.endpoints = this.resources.endpoints || {};
|
|
37
|
-
this.resources.Tags = this.resources.Tags || {};
|
|
38
|
-
if (!Array.isArray(this.resources.Tags)) {
|
|
39
|
-
this.resources.Tags = this.transformMapTagsToArray(this.resources.Tags);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Return AWS region
|
|
44
|
-
*/
|
|
45
|
-
getRegion() {
|
|
46
|
-
return this.resources.region;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Return the current AWS Identity used
|
|
50
|
-
*/
|
|
51
|
-
async getAWSIdentity() {
|
|
52
|
-
let sts = new STS({
|
|
53
|
-
endpoint: this.resources.endpoints.STS
|
|
54
|
-
});
|
|
55
|
-
return sts.getCallerIdentity({});
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Return the default VPC for the current region
|
|
59
|
-
*/
|
|
60
|
-
async getDefaultVpc() {
|
|
61
|
-
let defaultVpc = {
|
|
62
|
-
Id: "",
|
|
63
|
-
Subnets: []
|
|
64
|
-
};
|
|
65
|
-
let vpcFilter;
|
|
66
|
-
let ec2 = new EC2({
|
|
67
|
-
endpoint: this.resources.endpoints.EC2
|
|
68
|
-
});
|
|
69
|
-
let res = await ec2.describeVpcs({});
|
|
70
|
-
for (let i in res.Vpcs) {
|
|
71
|
-
if (res.Vpcs[i].IsDefault) {
|
|
72
|
-
defaultVpc.Id = res.Vpcs[i].VpcId;
|
|
73
|
-
break;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
if (defaultVpc.Id === "") {
|
|
77
|
-
return undefined;
|
|
78
|
-
}
|
|
79
|
-
vpcFilter = {
|
|
80
|
-
Filters: [
|
|
81
|
-
{
|
|
82
|
-
Name: "vpc-id",
|
|
83
|
-
Values: [defaultVpc.Id]
|
|
84
|
-
}
|
|
85
|
-
]
|
|
86
|
-
};
|
|
87
|
-
let res2 = await ec2.describeSubnets(vpcFilter);
|
|
88
|
-
for (let i in res2.Subnets) {
|
|
89
|
-
defaultVpc.Subnets.push(res2.Subnets[i]);
|
|
90
|
-
}
|
|
91
|
-
return defaultVpc;
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Generate a MD5 in hex
|
|
95
|
-
* @param str to hash
|
|
96
|
-
*/
|
|
97
|
-
md5(str) {
|
|
98
|
-
return this.hash(str, "md5", "hex");
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Hash the string
|
|
102
|
-
*
|
|
103
|
-
* @param str to hash
|
|
104
|
-
* @param type of hash
|
|
105
|
-
* @param format hex or b64
|
|
106
|
-
*/
|
|
107
|
-
hash(str, type = "md5", format = "hex") {
|
|
108
|
-
return crypto.createHash(type).update(str).digest(format);
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Replace / by _ as theses ID are not allowed in AWS
|
|
112
|
-
*
|
|
113
|
-
* @param id
|
|
114
|
-
*/
|
|
115
|
-
_replaceForAWS(id) {
|
|
116
|
-
return id.replace(/\//g, "_");
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* Get a certificate or create it
|
|
120
|
-
*
|
|
121
|
-
* @param domain to get certificate for
|
|
122
|
-
* @param region
|
|
123
|
-
*/
|
|
124
|
-
async getCertificate(domain, region = undefined) {
|
|
125
|
-
if (domain.endsWith(".")) {
|
|
126
|
-
domain = domain.substring(0, domain.length - 1);
|
|
127
|
-
}
|
|
128
|
-
let acm = new ACM({
|
|
129
|
-
endpoint: this.resources.endpoints.ACM,
|
|
130
|
-
region
|
|
131
|
-
});
|
|
132
|
-
let params = {};
|
|
133
|
-
let res;
|
|
134
|
-
let certificate;
|
|
135
|
-
do {
|
|
136
|
-
res = await acm.listCertificates(params);
|
|
137
|
-
certificate = res.CertificateSummaryList.filter(cert => cert.DomainName === domain).pop();
|
|
138
|
-
params.NextToken = res.NextToken;
|
|
139
|
-
} while (!certificate && res.NextToken);
|
|
140
|
-
// We did not find the certificate need to create one
|
|
141
|
-
if (!certificate) {
|
|
142
|
-
let zone = await this.getZoneForDomainName(domain);
|
|
143
|
-
if (!zone) {
|
|
144
|
-
throw new WebdaError.CodeError("ROUTE53_NOTFOUND", "Cannot create certificate as Route53 Zone was not found");
|
|
145
|
-
}
|
|
146
|
-
this.logger.log("INFO", "Creating a certificate for", domain);
|
|
147
|
-
certificate = await this.doCreateCertificate(domain, zone);
|
|
148
|
-
}
|
|
149
|
-
return certificate;
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Get the closest zone to the domain
|
|
153
|
-
*
|
|
154
|
-
* @param domain to get zone for
|
|
155
|
-
*/
|
|
156
|
-
async getZoneForDomainName(domain) {
|
|
157
|
-
return Route53Service.getZoneForDomainName(domain);
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* Transform a tag map into a tag array
|
|
161
|
-
*
|
|
162
|
-
* @param tags
|
|
163
|
-
*/
|
|
164
|
-
transformMapTagsToArray(tags) {
|
|
165
|
-
if (Array.isArray(tags)) {
|
|
166
|
-
return tags;
|
|
167
|
-
}
|
|
168
|
-
let res = [];
|
|
169
|
-
for (let i in tags) {
|
|
170
|
-
res.push({ Key: i, Value: tags[i] });
|
|
171
|
-
}
|
|
172
|
-
return res;
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* Transform a tag array into a tag map
|
|
176
|
-
*
|
|
177
|
-
* @param tags
|
|
178
|
-
*/
|
|
179
|
-
transformArrayTagsToMap(tags) {
|
|
180
|
-
if (!Array.isArray(tags)) {
|
|
181
|
-
return tags;
|
|
182
|
-
}
|
|
183
|
-
let res = {};
|
|
184
|
-
tags.forEach(t => (res[t.Key] = t.Value));
|
|
185
|
-
return res;
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* Take this.resources[key].Tags and add all remaining Tags from this.resources.Tags
|
|
189
|
-
*
|
|
190
|
-
* @param key of the resources to add
|
|
191
|
-
*/
|
|
192
|
-
getDefaultTags(key = undefined) {
|
|
193
|
-
let Tags;
|
|
194
|
-
if (typeof key === "string") {
|
|
195
|
-
Tags = this.resources[key] ? this.transformMapTagsToArray(this.resources[key].Tags) || [] : [];
|
|
196
|
-
}
|
|
197
|
-
else {
|
|
198
|
-
Tags = this.transformMapTagsToArray(key) || [];
|
|
199
|
-
}
|
|
200
|
-
if (this.resources.Tags.length) {
|
|
201
|
-
let TagKeys = Tags.map(t => t.Key);
|
|
202
|
-
Tags.push(...this.resources.Tags.filter(t => TagKeys.indexOf(t.Key) < 0));
|
|
203
|
-
}
|
|
204
|
-
return Tags;
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* Take this.resources[key].Tags and add all remaining Tags from this.resources.Tags
|
|
208
|
-
*
|
|
209
|
-
* @param key of the resources to add
|
|
210
|
-
*/
|
|
211
|
-
getDefaultTagsAsMap(key = undefined) {
|
|
212
|
-
return this.transformArrayTagsToMap(this.getDefaultTags(key));
|
|
213
|
-
}
|
|
214
|
-
/**
|
|
215
|
-
* Return the S3 Tagging string
|
|
216
|
-
* @param key of the resources to add
|
|
217
|
-
*/
|
|
218
|
-
getDefaultTagsAsS3Tagging(key = undefined) {
|
|
219
|
-
return this.getDefaultTags(key)
|
|
220
|
-
.map(tag => `${encodeURIComponent(tag.Key)}=${encodeURIComponent(tag.Value)}`)
|
|
221
|
-
.join("&");
|
|
222
|
-
}
|
|
223
|
-
async waitFor(callback, retries, title, delay) {
|
|
224
|
-
return WaitFor(callback, retries, title, this.logger, WaitLinearDelay(delay));
|
|
225
|
-
}
|
|
226
|
-
/**
|
|
227
|
-
* Create a certificate for a domain
|
|
228
|
-
* Will use Route 53 to do the validation
|
|
229
|
-
*
|
|
230
|
-
* @param domain to create the certificate for
|
|
231
|
-
* @param zone
|
|
232
|
-
*/
|
|
233
|
-
async doCreateCertificate(domain, zone) {
|
|
234
|
-
let acm = new ACM({
|
|
235
|
-
endpoint: this.resources.endpoints.S3
|
|
236
|
-
});
|
|
237
|
-
if (domain.endsWith(".")) {
|
|
238
|
-
domain = domain.substring(0, domain.length - 1);
|
|
239
|
-
}
|
|
240
|
-
let params = {
|
|
241
|
-
DomainName: domain,
|
|
242
|
-
DomainValidationOptions: [
|
|
243
|
-
{
|
|
244
|
-
DomainName: domain,
|
|
245
|
-
ValidationDomain: domain
|
|
246
|
-
}
|
|
247
|
-
],
|
|
248
|
-
ValidationMethod: "DNS",
|
|
249
|
-
IdempotencyToken: "Webda_" + this.md5(domain).substring(0, 26)
|
|
250
|
-
};
|
|
251
|
-
let certificate = await acm.requestCertificate(params);
|
|
252
|
-
let cert = await this.waitFor(async (resolve) => {
|
|
253
|
-
let res = await acm.describeCertificate({
|
|
254
|
-
CertificateArn: certificate.CertificateArn
|
|
255
|
-
});
|
|
256
|
-
if (res.Certificate.DomainValidationOptions && res.Certificate.DomainValidationOptions[0].ResourceRecord) {
|
|
257
|
-
resolve(res.Certificate);
|
|
258
|
-
return true;
|
|
259
|
-
}
|
|
260
|
-
return false;
|
|
261
|
-
}, 5, "Waiting for certificate challenge", 10000);
|
|
262
|
-
if (cert === undefined || cert.Status === "FAILED") {
|
|
263
|
-
throw new WebdaError.CodeError("ACM_VALIDATION_FAILED", "Certificate validation has failed");
|
|
264
|
-
}
|
|
265
|
-
if (cert.Status === "PENDING_VALIDATION") {
|
|
266
|
-
// On create need to wait
|
|
267
|
-
let record = cert.DomainValidationOptions[0].ResourceRecord;
|
|
268
|
-
this.logger.log("INFO", "Need to validate certificate", cert.CertificateArn);
|
|
269
|
-
await this.createDNSEntry(record.Name, "CNAME", record.Value, zone);
|
|
270
|
-
// Waiting for certificate validation
|
|
271
|
-
cert = await this.waitFor(async (resolve, reject) => {
|
|
272
|
-
let res = await acm.describeCertificate({
|
|
273
|
-
CertificateArn: cert.CertificateArn
|
|
274
|
-
});
|
|
275
|
-
if (res.Certificate.Status === "ISSUED") {
|
|
276
|
-
resolve(res.Certificate);
|
|
277
|
-
return true;
|
|
278
|
-
}
|
|
279
|
-
if (res.Certificate.Status !== "PENDING_VALIDATION") {
|
|
280
|
-
reject(res.Certificate);
|
|
281
|
-
return true;
|
|
282
|
-
}
|
|
283
|
-
}, 10, "Waiting for certificate validation", 60000);
|
|
284
|
-
}
|
|
285
|
-
//
|
|
286
|
-
return cert;
|
|
287
|
-
}
|
|
288
|
-
/**
|
|
289
|
-
* Create DNS entry
|
|
290
|
-
*
|
|
291
|
-
* @param domain to create
|
|
292
|
-
* @param type of DNS
|
|
293
|
-
* @param value the value of the record
|
|
294
|
-
* @param targetZone
|
|
295
|
-
*/
|
|
296
|
-
async createDNSEntry(domain, type, value, targetZone = undefined) {
|
|
297
|
-
this.logger.log("INFO", `Creating DNS entry ${domain} ${type} ${value}`);
|
|
298
|
-
let r53 = new Route53({
|
|
299
|
-
endpoint: this.resources.endpoints.S3
|
|
300
|
-
});
|
|
301
|
-
if (!domain.endsWith(".")) {
|
|
302
|
-
domain = domain + ".";
|
|
303
|
-
}
|
|
304
|
-
if (!targetZone) {
|
|
305
|
-
targetZone = await this.getZoneForDomainName(domain);
|
|
306
|
-
}
|
|
307
|
-
if (!targetZone) {
|
|
308
|
-
throw Error("Domain is not handled on AWS");
|
|
309
|
-
}
|
|
310
|
-
await r53.changeResourceRecordSets({
|
|
311
|
-
HostedZoneId: targetZone.Id,
|
|
312
|
-
ChangeBatch: {
|
|
313
|
-
Changes: [
|
|
314
|
-
{
|
|
315
|
-
Action: "UPSERT",
|
|
316
|
-
ResourceRecordSet: {
|
|
317
|
-
Name: domain,
|
|
318
|
-
ResourceRecords: [
|
|
319
|
-
{
|
|
320
|
-
Value: value
|
|
321
|
-
}
|
|
322
|
-
],
|
|
323
|
-
TTL: 360,
|
|
324
|
-
Type: type
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
],
|
|
328
|
-
Comment: "webda-automated-deploiement"
|
|
329
|
-
}
|
|
330
|
-
});
|
|
331
|
-
}
|
|
332
|
-
getARNPolicy(accountId, region) {
|
|
333
|
-
return [
|
|
334
|
-
{
|
|
335
|
-
Sid: "WebdaLog",
|
|
336
|
-
Effect: "Allow",
|
|
337
|
-
Action: ["logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents"],
|
|
338
|
-
Resource: ["arn:aws:logs:" + region + ":" + accountId + ":*"]
|
|
339
|
-
}
|
|
340
|
-
];
|
|
341
|
-
}
|
|
342
|
-
/**
|
|
343
|
-
* Generate the `PolicyDocument`
|
|
344
|
-
*
|
|
345
|
-
* It will browse all services for a method `getARNPolicy`
|
|
346
|
-
* Allowing you to write some specific Service or Bean that
|
|
347
|
-
* requires specific AWS permissions
|
|
348
|
-
*/
|
|
349
|
-
async getPolicyDocument(additionalStatements = []) {
|
|
350
|
-
let me = await this.getAWSIdentity();
|
|
351
|
-
let services = this.manager.getWebda().getServices();
|
|
352
|
-
let statements = [];
|
|
353
|
-
// Build policy
|
|
354
|
-
for (let i in services) {
|
|
355
|
-
if ("getARNPolicy" in services[i]) {
|
|
356
|
-
// Update to match recuring policy - might need to split if policy too big
|
|
357
|
-
let res = services[i].getARNPolicy(me.Account, this.getRegion());
|
|
358
|
-
if (Array.isArray(res)) {
|
|
359
|
-
statements.push(...res);
|
|
360
|
-
}
|
|
361
|
-
else {
|
|
362
|
-
statements.push(res);
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
statements.push(...this.getARNPolicy(me.Account, this.getRegion()));
|
|
367
|
-
let policyDocument = {
|
|
368
|
-
Version: "2012-10-17",
|
|
369
|
-
Statement: [...statements, ...additionalStatements]
|
|
370
|
-
};
|
|
371
|
-
// @ts-ignore
|
|
372
|
-
return IamPolicyOptimizer.default?.reducePolicyObject(policyDocument);
|
|
373
|
-
}
|
|
374
|
-
/**
|
|
375
|
-
* Create a bucket if it does not exist
|
|
376
|
-
*
|
|
377
|
-
* @param bucket to create
|
|
378
|
-
*/
|
|
379
|
-
async createBucket(Bucket) {
|
|
380
|
-
let s3 = new S3({
|
|
381
|
-
endpoint: this.resources.endpoints.S3,
|
|
382
|
-
forcePathStyle: this.resources.endpoints.S3 !== undefined
|
|
383
|
-
});
|
|
384
|
-
try {
|
|
385
|
-
await s3.headBucket({
|
|
386
|
-
Bucket
|
|
387
|
-
});
|
|
388
|
-
}
|
|
389
|
-
catch (err) {
|
|
390
|
-
if (err.name === "Forbidden") {
|
|
391
|
-
this.logger.log("ERROR", "S3 bucket already exists in another account or you do not have permissions on it");
|
|
392
|
-
}
|
|
393
|
-
else if (err instanceof NotFound) {
|
|
394
|
-
this.logger.log("INFO", "\tCreating S3 Bucket", Bucket);
|
|
395
|
-
// Setup www permission on it
|
|
396
|
-
await s3.createBucket({
|
|
397
|
-
Bucket: Bucket
|
|
398
|
-
});
|
|
399
|
-
let Tags = this.getDefaultTags([]);
|
|
400
|
-
if (Tags.length) {
|
|
401
|
-
await s3.putBucketTagging({
|
|
402
|
-
Bucket,
|
|
403
|
-
Tagging: {
|
|
404
|
-
TagSet: Tags
|
|
405
|
-
}
|
|
406
|
-
});
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
/**
|
|
412
|
-
* Send a full folder (recursive) on bucket
|
|
413
|
-
*
|
|
414
|
-
* @param bucket to send data to
|
|
415
|
-
* @param folder path to local folder to send
|
|
416
|
-
* @param prefix prefix on the bucket
|
|
417
|
-
*/
|
|
418
|
-
async putFolderOnBucket(bucket, folder, prefix = "") {
|
|
419
|
-
let absFolder = path.resolve(folder);
|
|
420
|
-
let files = globSync(`${absFolder}/**/*`);
|
|
421
|
-
await this.putFilesOnBucket(bucket,
|
|
422
|
-
// Replace \ by / for Windows system
|
|
423
|
-
files.map(f => ({
|
|
424
|
-
key: `${prefix}${path.relative(absFolder, f).replace(/\\/g, "/")}`,
|
|
425
|
-
src: f
|
|
426
|
-
})));
|
|
427
|
-
}
|
|
428
|
-
/**
|
|
429
|
-
* Find the common prefix between two strings
|
|
430
|
-
*
|
|
431
|
-
* Example
|
|
432
|
-
* ```
|
|
433
|
-
* commonPrefix("/test/plop1", "/templates/") => "/te"
|
|
434
|
-
* ```
|
|
435
|
-
*
|
|
436
|
-
*
|
|
437
|
-
* @param str1 to compare
|
|
438
|
-
* @param str2 to compare
|
|
439
|
-
*/
|
|
440
|
-
commonPrefix(str1, str2) {
|
|
441
|
-
let res = "";
|
|
442
|
-
let i = 0;
|
|
443
|
-
while (i < str1.length && i < str2.length && str1[i] === str2[i]) {
|
|
444
|
-
res += str1[i];
|
|
445
|
-
i++;
|
|
446
|
-
}
|
|
447
|
-
return res;
|
|
448
|
-
}
|
|
449
|
-
/**
|
|
450
|
-
* Add files to a bucket
|
|
451
|
-
*
|
|
452
|
-
* It uses hash and ETag to avoid uploading files already present
|
|
453
|
-
*
|
|
454
|
-
*
|
|
455
|
-
* The files src can be either:
|
|
456
|
-
* - a string representing the local path
|
|
457
|
-
* - a Buffer with the dynamic content
|
|
458
|
-
*
|
|
459
|
-
* @param bucket to send bucket
|
|
460
|
-
* @param files to send
|
|
461
|
-
*/
|
|
462
|
-
async putFilesOnBucket(bucket, files) {
|
|
463
|
-
let s3 = new S3({
|
|
464
|
-
endpoint: this.resources.endpoints.S3,
|
|
465
|
-
forcePathStyle: this.resources.endpoints.S3 !== undefined
|
|
466
|
-
});
|
|
467
|
-
if (!files.length) {
|
|
468
|
-
return;
|
|
469
|
-
}
|
|
470
|
-
files.forEach(f => {
|
|
471
|
-
if (f.src === undefined) {
|
|
472
|
-
throw Error("Should have src and key defined");
|
|
473
|
-
}
|
|
474
|
-
else if (!f.key) {
|
|
475
|
-
f.key = path.relative(process.cwd(), f.src);
|
|
476
|
-
}
|
|
477
|
-
});
|
|
478
|
-
// Create the bucket
|
|
479
|
-
await this.createBucket(bucket);
|
|
480
|
-
// Retrieve current files to only upload the one we do not have
|
|
481
|
-
let currentFiles = {};
|
|
482
|
-
let Prefix = files.reduce((prev, cur) => this.commonPrefix(prev, cur.key), files[0].key);
|
|
483
|
-
let Params = {
|
|
484
|
-
Bucket: bucket,
|
|
485
|
-
Prefix,
|
|
486
|
-
MaxKeys: 1000,
|
|
487
|
-
ContinuationToken: undefined
|
|
488
|
-
};
|
|
489
|
-
do {
|
|
490
|
-
let res = await s3.listObjectsV2(Params);
|
|
491
|
-
res.Contents.forEach(obj => {
|
|
492
|
-
currentFiles[obj.Key] = obj;
|
|
493
|
-
});
|
|
494
|
-
Params.ContinuationToken = res.NextContinuationToken;
|
|
495
|
-
} while (Params.ContinuationToken);
|
|
496
|
-
// Should implement multithread here - cleaning too
|
|
497
|
-
let uuid = randomUUID();
|
|
498
|
-
let fullSize = 0;
|
|
499
|
-
files = files.filter(info => {
|
|
500
|
-
if (typeof info.src === "string") {
|
|
501
|
-
let s3obj = currentFiles[info.key];
|
|
502
|
-
let stat = fs.statSync(info.src);
|
|
503
|
-
if (s3obj && stat.size === s3obj.Size) {
|
|
504
|
-
let md5 = `"${this.hash(fs.readFileSync(info.src).toString(), "md5", "hex")}"`;
|
|
505
|
-
if (md5 === s3obj.ETag) {
|
|
506
|
-
this.logger.log("TRACE", "Skipping upload of", info.src, "file with same hash already on bucket");
|
|
507
|
-
return false;
|
|
508
|
-
}
|
|
509
|
-
}
|
|
510
|
-
fullSize += stat.size;
|
|
511
|
-
}
|
|
512
|
-
return true;
|
|
513
|
-
});
|
|
514
|
-
this.logger.logProgressStart(uuid, files.length, "Uploading to S3 bucket " + bucket);
|
|
515
|
-
await bluebird.map(files, async (info) => {
|
|
516
|
-
// Need to have mimetype to serve the content correctly
|
|
517
|
-
let mimetype = info.mimetype || mime.contentType(path.extname(info.key)) || "application/octet-stream";
|
|
518
|
-
// use of upload and get size length
|
|
519
|
-
await s3.putObject({
|
|
520
|
-
Bucket: bucket,
|
|
521
|
-
Body: typeof info.src === "string" ? fs.createReadStream(info.src) : info.src,
|
|
522
|
-
Key: info.key,
|
|
523
|
-
ContentType: mimetype,
|
|
524
|
-
Tagging: this.getDefaultTagsAsS3Tagging()
|
|
525
|
-
});
|
|
526
|
-
this.logger.logProgressIncrement(1, uuid);
|
|
527
|
-
this.logger.log("INFO", "Uploaded", typeof info.src === "string" ? info.src : "<dynamicContent>", "to", `s3://${bucket}/${info.key}`, "(" + mimetype + ")");
|
|
528
|
-
}, { concurrency: 5 });
|
|
529
|
-
}
|
|
530
|
-
}
|
|
531
|
-
__decorate([
|
|
532
|
-
Cache()
|
|
533
|
-
], AWSDeployer.prototype, "getAWSIdentity", null);
|
|
534
|
-
__decorate([
|
|
535
|
-
Cache()
|
|
536
|
-
], AWSDeployer.prototype, "getDefaultVpc", null);
|
|
537
|
-
__decorate([
|
|
538
|
-
Cache()
|
|
539
|
-
], AWSDeployer.prototype, "getZoneForDomainName", null);
|
|
540
|
-
__decorate([
|
|
541
|
-
Cache()
|
|
542
|
-
], AWSDeployer.prototype, "getPolicyDocument", null);
|
|
543
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/deployers/index.ts"],"names":[],"mappings":"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"}
|