@studion/infra-code-blocks 0.8.0-next.2 → 2.0.0-alpha.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.
- package/dist/components/acm-certificate/index.d.ts +20 -0
- package/dist/components/acm-certificate/index.d.ts.map +1 -0
- package/dist/components/acm-certificate/index.js +40 -0
- package/dist/components/cloudfront/index.d.ts +92 -0
- package/dist/components/cloudfront/index.d.ts.map +1 -0
- package/dist/components/cloudfront/index.js +208 -0
- package/dist/components/cloudfront/lb-cache-strategy.d.ts +21 -0
- package/dist/components/cloudfront/lb-cache-strategy.d.ts.map +1 -0
- package/dist/components/cloudfront/lb-cache-strategy.js +93 -0
- package/dist/components/cloudfront/s3-cache-strategy.d.ts +21 -0
- package/dist/components/cloudfront/s3-cache-strategy.d.ts.map +1 -0
- package/dist/components/cloudfront/s3-cache-strategy.js +78 -0
- package/dist/components/cloudfront/types.d.ts +10 -0
- package/dist/components/cloudfront/types.d.ts.map +1 -0
- package/dist/components/database/builder.d.ts +32 -0
- package/dist/components/database/builder.d.ts.map +1 -0
- package/dist/components/database/builder.js +82 -0
- package/dist/components/database/database-replica.d.ts +35 -0
- package/dist/components/database/database-replica.d.ts.map +1 -0
- package/dist/components/database/database-replica.js +40 -0
- package/dist/components/database/ec2-ssm-connect.d.ts +26 -0
- package/dist/components/database/ec2-ssm-connect.d.ts.map +1 -0
- package/dist/components/{ec2-ssm-connect.js → database/ec2-ssm-connect.js} +42 -34
- package/dist/components/database/index.d.ts +67 -0
- package/dist/components/database/index.d.ts.map +1 -0
- package/dist/components/database/index.js +144 -0
- package/dist/{v2/components → components}/ecs-service/index.d.ts +6 -5
- package/dist/components/ecs-service/index.d.ts.map +1 -0
- package/dist/{v2/components → components}/ecs-service/index.js +19 -30
- package/dist/components/ecs-service/policies.d.ts +3 -0
- package/dist/components/ecs-service/policies.d.ts.map +1 -0
- package/dist/components/ecs-service/task-size.d.ts +37 -0
- package/dist/components/ecs-service/task-size.d.ts.map +1 -0
- package/dist/{constants.js → components/ecs-service/task-size.js} +17 -7
- package/dist/components/grafana/dashboards/index.d.ts.map +1 -0
- package/dist/components/grafana/dashboards/panels.d.ts.map +1 -0
- package/dist/components/grafana/dashboards/types.d.ts.map +1 -0
- package/dist/components/grafana/dashboards/web-server-slo.d.ts.map +1 -0
- package/dist/components/grafana/index.d.ts.map +1 -0
- package/dist/components/password/index.d.ts +15 -0
- package/dist/components/password/index.d.ts.map +1 -0
- package/dist/components/{password.js → password/index.js} +6 -9
- package/dist/components/prometheus/index.d.ts.map +1 -0
- package/dist/components/prometheus/queries.d.ts.map +1 -0
- package/dist/components/prometheus/queries.test.d.ts.map +1 -0
- package/dist/components/redis/elasticache-redis.d.ts +38 -0
- package/dist/components/redis/elasticache-redis.d.ts.map +1 -0
- package/dist/components/redis/elasticache-redis.js +58 -0
- package/dist/components/redis/upstash-redis.d.ts +20 -0
- package/dist/components/redis/upstash-redis.d.ts.map +1 -0
- package/dist/components/redis/upstash-redis.js +29 -0
- package/dist/components/static-site/index.d.ts +23 -0
- package/dist/components/static-site/index.d.ts.map +1 -0
- package/dist/components/static-site/index.js +32 -0
- package/dist/components/static-site/s3-assets.d.ts +20 -0
- package/dist/components/static-site/s3-assets.d.ts.map +1 -0
- package/dist/components/static-site/s3-assets.js +63 -0
- package/dist/components/vpc/index.d.ts +20 -0
- package/dist/components/vpc/index.d.ts.map +1 -0
- package/dist/components/vpc/index.js +31 -0
- package/dist/{v2/components → components}/web-server/builder.d.ts +6 -2
- package/dist/components/web-server/builder.d.ts.map +1 -0
- package/dist/{v2/components → components}/web-server/builder.js +11 -1
- package/dist/{v2/components → components}/web-server/index.d.ts +30 -8
- package/dist/components/web-server/index.d.ts.map +1 -0
- package/dist/{v2/components → components}/web-server/index.js +49 -40
- package/dist/{v2/components → components}/web-server/load-balancer.d.ts +4 -3
- package/dist/components/web-server/load-balancer.d.ts.map +1 -0
- package/dist/{v2/components → components}/web-server/load-balancer.js +17 -14
- package/dist/index.d.ts +24 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +38 -26
- package/dist/otel/batch-processor.d.ts.map +1 -0
- package/dist/{v2/otel → otel}/builder.d.ts +15 -2
- package/dist/otel/builder.d.ts.map +1 -0
- package/dist/{v2/otel → otel}/builder.js +47 -2
- package/dist/{v2/otel → otel}/config.d.ts +13 -1
- package/dist/otel/config.d.ts.map +1 -0
- package/dist/{v2/otel → otel}/config.js +20 -3
- package/dist/{v2/otel → otel}/index.d.ts +8 -0
- package/dist/otel/index.d.ts.map +1 -0
- package/dist/otel/memory-limiter-processor.d.ts.map +1 -0
- package/dist/otel/otlp-receiver.d.ts.map +1 -0
- package/dist/otel/prometheus-remote-write-exporter.d.ts.map +1 -0
- package/dist/shared/common-tags.d.ts +5 -0
- package/dist/shared/common-tags.d.ts.map +1 -0
- package/dist/shared/common-tags.js +8 -0
- package/dist/shared/merge-with-defaults.d.ts +2 -0
- package/dist/shared/merge-with-defaults.d.ts.map +1 -0
- package/dist/shared/merge-with-defaults.js +7 -0
- package/package.json +32 -14
- package/dist/components/acm-certificate.d.ts +0 -11
- package/dist/components/acm-certificate.d.ts.map +0 -1
- package/dist/components/acm-certificate.js +0 -30
- package/dist/components/database-replica.d.ts +0 -69
- package/dist/components/database-replica.d.ts.map +0 -1
- package/dist/components/database-replica.js +0 -40
- package/dist/components/database.d.ts +0 -99
- package/dist/components/database.d.ts.map +0 -1
- package/dist/components/database.js +0 -118
- package/dist/components/ec2-ssm-connect.d.ts +0 -22
- package/dist/components/ec2-ssm-connect.d.ts.map +0 -1
- package/dist/components/ecs-service.d.ts +0 -143
- package/dist/components/ecs-service.d.ts.map +0 -1
- package/dist/components/ecs-service.js +0 -357
- package/dist/components/mongo.d.ts +0 -39
- package/dist/components/mongo.d.ts.map +0 -1
- package/dist/components/mongo.js +0 -54
- package/dist/components/nuxt-ssr.d.ts +0 -44
- package/dist/components/nuxt-ssr.d.ts.map +0 -1
- package/dist/components/nuxt-ssr.js +0 -277
- package/dist/components/password.d.ts +0 -13
- package/dist/components/password.d.ts.map +0 -1
- package/dist/components/project.d.ts +0 -77
- package/dist/components/project.d.ts.map +0 -1
- package/dist/components/project.js +0 -171
- package/dist/components/redis.d.ts +0 -23
- package/dist/components/redis.d.ts.map +0 -1
- package/dist/components/redis.js +0 -35
- package/dist/components/static-site.d.ts +0 -36
- package/dist/components/static-site.d.ts.map +0 -1
- package/dist/components/static-site.js +0 -138
- package/dist/components/web-server.d.ts +0 -38
- package/dist/components/web-server.d.ts.map +0 -1
- package/dist/components/web-server.js +0 -185
- package/dist/constants.d.ts +0 -23
- package/dist/constants.d.ts.map +0 -1
- package/dist/types/pulumi.d.ts +0 -5
- package/dist/types/pulumi.d.ts.map +0 -1
- package/dist/types/size.d.ts +0 -8
- package/dist/types/size.d.ts.map +0 -1
- package/dist/types/size.js +0 -2
- package/dist/v2/components/ecs-service/index.d.ts.map +0 -1
- package/dist/v2/components/ecs-service/policies.d.ts +0 -3
- package/dist/v2/components/ecs-service/policies.d.ts.map +0 -1
- package/dist/v2/components/grafana/dashboards/index.d.ts.map +0 -1
- package/dist/v2/components/grafana/dashboards/panels.d.ts.map +0 -1
- package/dist/v2/components/grafana/dashboards/types.d.ts.map +0 -1
- package/dist/v2/components/grafana/dashboards/web-server-slo.d.ts.map +0 -1
- package/dist/v2/components/grafana/index.d.ts.map +0 -1
- package/dist/v2/components/prometheus/index.d.ts.map +0 -1
- package/dist/v2/components/prometheus/queries.d.ts.map +0 -1
- package/dist/v2/components/prometheus/queries.test.d.ts.map +0 -1
- package/dist/v2/components/web-server/builder.d.ts.map +0 -1
- package/dist/v2/components/web-server/index.d.ts.map +0 -1
- package/dist/v2/components/web-server/load-balancer.d.ts.map +0 -1
- package/dist/v2/index.d.ts +0 -13
- package/dist/v2/index.d.ts.map +0 -1
- package/dist/v2/index.js +0 -16
- package/dist/v2/otel/batch-processor.d.ts.map +0 -1
- package/dist/v2/otel/builder.d.ts.map +0 -1
- package/dist/v2/otel/config.d.ts.map +0 -1
- package/dist/v2/otel/index.d.ts.map +0 -1
- package/dist/v2/otel/memory-limiter-processor.d.ts.map +0 -1
- package/dist/v2/otel/otlp-receiver.d.ts.map +0 -1
- package/dist/v2/otel/prometheus-remote-write-exporter.d.ts.map +0 -1
- /package/dist/{v2/components/grafana/dashboards → components/cloudfront}/types.js +0 -0
- /package/dist/{v2/components → components}/ecs-service/policies.js +0 -0
- /package/dist/{v2/components → components}/grafana/dashboards/index.d.ts +0 -0
- /package/dist/{v2/components → components}/grafana/dashboards/index.js +0 -0
- /package/dist/{v2/components → components}/grafana/dashboards/panels.d.ts +0 -0
- /package/dist/{v2/components → components}/grafana/dashboards/panels.js +0 -0
- /package/dist/{v2/components → components}/grafana/dashboards/types.d.ts +0 -0
- /package/dist/{types/pulumi.js → components/grafana/dashboards/types.js} +0 -0
- /package/dist/{v2/components → components}/grafana/dashboards/web-server-slo.d.ts +0 -0
- /package/dist/{v2/components → components}/grafana/dashboards/web-server-slo.js +0 -0
- /package/dist/{v2/components → components}/grafana/index.d.ts +0 -0
- /package/dist/{v2/components → components}/grafana/index.js +0 -0
- /package/dist/{v2/components → components}/prometheus/index.d.ts +0 -0
- /package/dist/{v2/components → components}/prometheus/index.js +0 -0
- /package/dist/{v2/components → components}/prometheus/queries.d.ts +0 -0
- /package/dist/{v2/components → components}/prometheus/queries.js +0 -0
- /package/dist/{v2/components → components}/prometheus/queries.test.d.ts +0 -0
- /package/dist/{v2/components → components}/prometheus/queries.test.js +0 -0
- /package/dist/{v2/otel → otel}/batch-processor.d.ts +0 -0
- /package/dist/{v2/otel → otel}/batch-processor.js +0 -0
- /package/dist/{v2/otel → otel}/index.js +0 -0
- /package/dist/{v2/otel → otel}/memory-limiter-processor.d.ts +0 -0
- /package/dist/{v2/otel → otel}/memory-limiter-processor.js +0 -0
- /package/dist/{v2/otel → otel}/otlp-receiver.d.ts +0 -0
- /package/dist/{v2/otel → otel}/otlp-receiver.js +0 -0
- /package/dist/{v2/otel → otel}/prometheus-remote-write-exporter.d.ts +0 -0
- /package/dist/{v2/otel → otel}/prometheus-remote-write-exporter.js +0 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DatabaseBuilder = void 0;
|
|
4
|
+
const _1 = require(".");
|
|
5
|
+
const pulumi = require("@pulumi/pulumi");
|
|
6
|
+
class DatabaseBuilder {
|
|
7
|
+
constructor(name) {
|
|
8
|
+
this.name = name;
|
|
9
|
+
}
|
|
10
|
+
withInstance(instanceConfig = {}) {
|
|
11
|
+
this.instanceConfig = instanceConfig;
|
|
12
|
+
return this;
|
|
13
|
+
}
|
|
14
|
+
withCredentials(credentialsConfig = {}) {
|
|
15
|
+
this.credentialsConfig = credentialsConfig;
|
|
16
|
+
return this;
|
|
17
|
+
}
|
|
18
|
+
withStorage(storageConfig = {}) {
|
|
19
|
+
this.storageConfig = storageConfig;
|
|
20
|
+
return this;
|
|
21
|
+
}
|
|
22
|
+
withVpc(vpc) {
|
|
23
|
+
this.vpc = pulumi.output(vpc);
|
|
24
|
+
return this;
|
|
25
|
+
}
|
|
26
|
+
withMonitoring() {
|
|
27
|
+
this.enableMonitoring = true;
|
|
28
|
+
return this;
|
|
29
|
+
}
|
|
30
|
+
withSnapshot(snapshotIdentifier) {
|
|
31
|
+
this.snapshotIdentifier = snapshotIdentifier;
|
|
32
|
+
return this;
|
|
33
|
+
}
|
|
34
|
+
withKms(kmsKeyId) {
|
|
35
|
+
this.kmsKeyId = kmsKeyId;
|
|
36
|
+
return this;
|
|
37
|
+
}
|
|
38
|
+
withParameterGroup(parameterGroupName) {
|
|
39
|
+
this.parameterGroupName = parameterGroupName;
|
|
40
|
+
return this;
|
|
41
|
+
}
|
|
42
|
+
withTags(tags) {
|
|
43
|
+
this.tags = tags;
|
|
44
|
+
return this;
|
|
45
|
+
}
|
|
46
|
+
withReplica(replicaConfig = {}) {
|
|
47
|
+
this.createReplica = true;
|
|
48
|
+
this.replicaConfig = replicaConfig;
|
|
49
|
+
return this;
|
|
50
|
+
}
|
|
51
|
+
withSSMConnect(ssmConnectConfig = {}) {
|
|
52
|
+
this.enableSSMConnect = true;
|
|
53
|
+
this.ssmConnectConfig = ssmConnectConfig;
|
|
54
|
+
return this;
|
|
55
|
+
}
|
|
56
|
+
build(opts = {}) {
|
|
57
|
+
var _a, _b, _c, _d, _e;
|
|
58
|
+
if (!this.snapshotIdentifier && !((_a = this.instanceConfig) === null || _a === void 0 ? void 0 : _a.dbName)) {
|
|
59
|
+
throw new Error('DbName not provided. Make sure to call DatabaseBuilder.withInstance() and set dbName.');
|
|
60
|
+
}
|
|
61
|
+
if (!this.snapshotIdentifier && !((_b = this.credentialsConfig) === null || _b === void 0 ? void 0 : _b.username)) {
|
|
62
|
+
throw new Error('Username not provided. Make sure to call DatabaseBuilder.withCredentials() and set username.');
|
|
63
|
+
}
|
|
64
|
+
if (this.snapshotIdentifier && ((_c = this.instanceConfig) === null || _c === void 0 ? void 0 : _c.dbName)) {
|
|
65
|
+
throw new Error(`You can't set dbName when using snapshotIdentifier.`);
|
|
66
|
+
}
|
|
67
|
+
if (this.snapshotIdentifier && ((_d = this.credentialsConfig) === null || _d === void 0 ? void 0 : _d.username)) {
|
|
68
|
+
throw new Error(`You can't set username when using snapshotIdentifier.`);
|
|
69
|
+
}
|
|
70
|
+
if (this.createReplica && ((_e = this.replicaConfig) === null || _e === void 0 ? void 0 : _e.enableMonitoring)) {
|
|
71
|
+
if (!this.enableMonitoring && !this.replicaConfig.monitoringRole) {
|
|
72
|
+
throw new Error(`If you want enable monitoring on the replica instance either provide monitoring role or
|
|
73
|
+
enable monitoring on the primary instance to reuse the same monitoring role.`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (!this.vpc) {
|
|
77
|
+
throw new Error('VPC not provided. Make sure to call DatabaseBuilder.withVpc().');
|
|
78
|
+
}
|
|
79
|
+
return new _1.Database(this.name, Object.assign(Object.assign(Object.assign(Object.assign({}, this.instanceConfig), this.credentialsConfig), this.storageConfig), { vpc: this.vpc, enableMonitoring: this.enableMonitoring, snapshotIdentifier: this.snapshotIdentifier, kmsKeyId: this.kmsKeyId, parameterGroupName: this.parameterGroupName, tags: this.tags, createReplica: this.createReplica, replicaConfig: this.replicaConfig, enableSSMConnect: this.enableSSMConnect, ssmConnectConfig: this.ssmConnectConfig }), opts);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
exports.DatabaseBuilder = DatabaseBuilder;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as aws from '@pulumi/aws-v7';
|
|
2
|
+
import * as pulumi from '@pulumi/pulumi';
|
|
3
|
+
export declare namespace DatabaseReplica {
|
|
4
|
+
type Instance = {
|
|
5
|
+
engineVersion?: pulumi.Input<string>;
|
|
6
|
+
multiAz?: pulumi.Input<boolean>;
|
|
7
|
+
instanceClass?: pulumi.Input<string>;
|
|
8
|
+
allowMajorVersionUpgrade?: pulumi.Input<boolean>;
|
|
9
|
+
autoMinorVersionUpgrade?: pulumi.Input<boolean>;
|
|
10
|
+
applyImmediately?: pulumi.Input<boolean>;
|
|
11
|
+
};
|
|
12
|
+
type Security = {
|
|
13
|
+
dbSecurityGroup: aws.ec2.SecurityGroup;
|
|
14
|
+
dbSubnetGroup?: aws.rds.SubnetGroup;
|
|
15
|
+
};
|
|
16
|
+
type Storage = {
|
|
17
|
+
allocatedStorage?: pulumi.Input<number>;
|
|
18
|
+
maxAllocatedStorage?: pulumi.Input<number>;
|
|
19
|
+
};
|
|
20
|
+
type Args = Instance & Security & Storage & {
|
|
21
|
+
replicateSourceDb: pulumi.Input<string>;
|
|
22
|
+
monitoringRole?: aws.iam.Role;
|
|
23
|
+
parameterGroupName?: pulumi.Input<string>;
|
|
24
|
+
tags?: pulumi.Input<{
|
|
25
|
+
[key: string]: pulumi.Input<string>;
|
|
26
|
+
}>;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export declare class DatabaseReplica extends pulumi.ComponentResource {
|
|
30
|
+
name: string;
|
|
31
|
+
instance: aws.rds.Instance;
|
|
32
|
+
constructor(name: string, args: DatabaseReplica.Args, opts?: pulumi.ComponentResourceOptions);
|
|
33
|
+
private createDatabaseInstance;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=database-replica.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-replica.d.ts","sourceRoot":"","sources":["../../../src/components/database/database-replica.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,MAAM,MAAM,gBAAgB,CAAC;AAIzC,yBAAiB,eAAe,CAAC;IAC/B,KAAY,QAAQ,GAAG;QACrB,aAAa,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrC,OAAO,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAChC,aAAa,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrC,wBAAwB,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjD,uBAAuB,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAChD,gBAAgB,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;KAC1C,CAAC;IAEF,KAAY,QAAQ,GAAG;QACrB,eAAe,EAAE,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC;QACvC,aAAa,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC;KACrC,CAAC;IAEF,KAAY,OAAO,GAAG;QACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxC,mBAAmB,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;KAC5C,CAAC;IAEF,KAAY,IAAI,GAAG,QAAQ,GACzB,QAAQ,GACR,OAAO,GAAG;QACR,iBAAiB,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxC,cAAc,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;QAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC;YAClB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;SACrC,CAAC,CAAC;KACJ,CAAC;CACL;AAaD,qBAAa,eAAgB,SAAQ,MAAM,CAAC,iBAAiB;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAGzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,eAAe,CAAC,IAAI,EAC1B,IAAI,GAAE,MAAM,CAAC,wBAA6B;IAmB5C,OAAO,CAAC,sBAAsB;CA2C/B"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DatabaseReplica = void 0;
|
|
4
|
+
const aws = require("@pulumi/aws-v7");
|
|
5
|
+
const pulumi = require("@pulumi/pulumi");
|
|
6
|
+
const common_tags_1 = require("../../shared/common-tags");
|
|
7
|
+
const merge_with_defaults_1 = require("../../shared/merge-with-defaults");
|
|
8
|
+
const defaults = {
|
|
9
|
+
multiAz: false,
|
|
10
|
+
applyImmediately: false,
|
|
11
|
+
allocatedStorage: 20,
|
|
12
|
+
maxAllocatedStorage: 100,
|
|
13
|
+
instanceClass: 'db.t4g.micro',
|
|
14
|
+
allowMajorVersionUpgrade: false,
|
|
15
|
+
autoMinorVersionUpgrade: true,
|
|
16
|
+
engineVersion: '17.2',
|
|
17
|
+
};
|
|
18
|
+
class DatabaseReplica extends pulumi.ComponentResource {
|
|
19
|
+
constructor(name, args, opts = {}) {
|
|
20
|
+
super('studion:database:DatabaseReplica', name, {}, Object.assign(Object.assign({}, opts), { aliases: [...(opts.aliases || []), { type: 'studion:DatabaseReplica' }] }));
|
|
21
|
+
this.name = name;
|
|
22
|
+
this.instance = this.createDatabaseInstance(args, opts);
|
|
23
|
+
this.registerOutputs();
|
|
24
|
+
}
|
|
25
|
+
createDatabaseInstance(args, opts) {
|
|
26
|
+
var _a;
|
|
27
|
+
const argsWithDefaults = (0, merge_with_defaults_1.mergeWithDefaults)(defaults, args);
|
|
28
|
+
const monitoringOptions = argsWithDefaults.monitoringRole
|
|
29
|
+
? {
|
|
30
|
+
monitoringInterval: 60,
|
|
31
|
+
monitoringRoleArn: argsWithDefaults.monitoringRole.arn,
|
|
32
|
+
performanceInsightsEnabled: true,
|
|
33
|
+
performanceInsightsRetentionPeriod: 7,
|
|
34
|
+
}
|
|
35
|
+
: {};
|
|
36
|
+
const instance = new aws.rds.Instance(`${this.name}-rds`, Object.assign(Object.assign({ identifierPrefix: `${this.name}-`, engine: 'postgres', engineVersion: argsWithDefaults.engineVersion, allocatedStorage: argsWithDefaults.allocatedStorage, maxAllocatedStorage: argsWithDefaults.maxAllocatedStorage, instanceClass: argsWithDefaults.instanceClass, vpcSecurityGroupIds: [argsWithDefaults.dbSecurityGroup.id], dbSubnetGroupName: (_a = argsWithDefaults.dbSubnetGroup) === null || _a === void 0 ? void 0 : _a.name, multiAz: argsWithDefaults.multiAz, applyImmediately: argsWithDefaults.applyImmediately, allowMajorVersionUpgrade: argsWithDefaults.allowMajorVersionUpgrade, autoMinorVersionUpgrade: argsWithDefaults.autoMinorVersionUpgrade, replicateSourceDb: argsWithDefaults.replicateSourceDb, parameterGroupName: argsWithDefaults.parameterGroupName, storageEncrypted: true, publiclyAccessible: false, skipFinalSnapshot: true }, monitoringOptions), { tags: Object.assign(Object.assign({}, common_tags_1.commonTags), argsWithDefaults.tags) }), { parent: this, dependsOn: opts.dependsOn });
|
|
37
|
+
return instance;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.DatabaseReplica = DatabaseReplica;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as aws from '@pulumi/aws-v7';
|
|
2
|
+
import * as awsx from '@pulumi/awsx-v3';
|
|
3
|
+
import * as pulumi from '@pulumi/pulumi';
|
|
4
|
+
export declare namespace Ec2SSMConnect {
|
|
5
|
+
type Args = {
|
|
6
|
+
vpc: pulumi.Input<awsx.ec2.Vpc>;
|
|
7
|
+
instanceType?: pulumi.Input<string>;
|
|
8
|
+
tags?: pulumi.Input<{
|
|
9
|
+
[key: string]: pulumi.Input<string>;
|
|
10
|
+
}>;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export declare class Ec2SSMConnect extends pulumi.ComponentResource {
|
|
14
|
+
name: string;
|
|
15
|
+
vpc: pulumi.Output<awsx.ec2.Vpc>;
|
|
16
|
+
ec2SecurityGroup: aws.ec2.SecurityGroup;
|
|
17
|
+
role: aws.iam.Role;
|
|
18
|
+
ssmProfile: aws.iam.InstanceProfile;
|
|
19
|
+
ssmVpcEndpoint: aws.ec2.VpcEndpoint;
|
|
20
|
+
ec2MessagesVpcEndpoint: aws.ec2.VpcEndpoint;
|
|
21
|
+
ssmMessagesVpcEndpoint: aws.ec2.VpcEndpoint;
|
|
22
|
+
ec2: aws.ec2.Instance;
|
|
23
|
+
ami: pulumi.Output<aws.ec2.GetAmiResult>;
|
|
24
|
+
constructor(name: string, args: Ec2SSMConnect.Args, opts?: pulumi.ComponentResourceOptions);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=ec2-ssm-connect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ec2-ssm-connect.d.ts","sourceRoot":"","sources":["../../../src/components/database/ec2-ssm-connect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAC;AACxC,OAAO,KAAK,MAAM,MAAM,gBAAgB,CAAC;AAOzC,yBAAiB,aAAa,CAAC;IAC7B,KAAY,IAAI,GAAG;QACjB,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,YAAY,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC;YAClB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;SACrC,CAAC,CAAC;KACJ,CAAC;CACH;AAMD,qBAAa,aAAc,SAAQ,MAAM,CAAC,iBAAiB;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjC,gBAAgB,EAAE,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC;IACxC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;IACnB,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC;IACpC,cAAc,EAAE,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC;IACpC,sBAAsB,EAAE,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC;IAC5C,sBAAsB,EAAE,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC;IAC5C,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;gBAGvC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,aAAa,CAAC,IAAI,EACxB,IAAI,GAAE,MAAM,CAAC,wBAA6B;CAoK7C"}
|
|
@@ -1,16 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Ec2SSMConnect = void 0;
|
|
4
|
+
const aws = require("@pulumi/aws-v7");
|
|
4
5
|
const pulumi = require("@pulumi/pulumi");
|
|
5
|
-
const
|
|
6
|
-
const
|
|
6
|
+
const common_tags_1 = require("../../shared/common-tags");
|
|
7
|
+
const merge_with_defaults_1 = require("../../shared/merge-with-defaults");
|
|
7
8
|
const config = new pulumi.Config('aws');
|
|
8
9
|
const awsRegion = config.require('region');
|
|
10
|
+
const defaults = {
|
|
11
|
+
instanceType: 't4g.nano',
|
|
12
|
+
};
|
|
9
13
|
class Ec2SSMConnect extends pulumi.ComponentResource {
|
|
10
14
|
constructor(name, args, opts = {}) {
|
|
11
|
-
super('studion:
|
|
12
|
-
|
|
13
|
-
|
|
15
|
+
super('studion:database:Ec2SSMConnect', name, {}, Object.assign(Object.assign({}, opts), { aliases: [
|
|
16
|
+
...(opts.aliases || []),
|
|
17
|
+
{ type: 'studion:Ec2BastionSSMConnect' },
|
|
18
|
+
] }));
|
|
19
|
+
const { vpc, instanceType, tags } = (0, merge_with_defaults_1.mergeWithDefaults)(defaults, args);
|
|
20
|
+
this.name = name;
|
|
21
|
+
this.vpc = pulumi.output(vpc);
|
|
22
|
+
const subnetId = this.vpc.privateSubnetIds.apply(ids => ids[0]);
|
|
23
|
+
this.ami = aws.ec2.getAmiOutput({
|
|
14
24
|
filters: [
|
|
15
25
|
{ name: 'architecture', values: ['arm64'] },
|
|
16
26
|
{ name: 'root-device-type', values: ['ebs'] },
|
|
@@ -18,33 +28,31 @@ class Ec2SSMConnect extends pulumi.ComponentResource {
|
|
|
18
28
|
{ name: 'ena-support', values: ['true'] },
|
|
19
29
|
],
|
|
20
30
|
owners: ['amazon'],
|
|
21
|
-
|
|
22
|
-
// https://docs.aws.amazon.com/linux/al2023/ug/ec2.html
|
|
23
|
-
nameRegex: 'al2023-ami-20[0-9]+.*-kernel-6.1-arm64',
|
|
31
|
+
nameRegex: 'al2023-ami-2023\.[0-9]+\.[0-9]+\.[0-9]+-kernel-[0-9]+\.[0-9]+-arm64',
|
|
24
32
|
mostRecent: true,
|
|
25
33
|
});
|
|
26
|
-
this.ec2SecurityGroup = new aws.ec2.SecurityGroup(`${name}-ec2-security-group`, {
|
|
34
|
+
this.ec2SecurityGroup = new aws.ec2.SecurityGroup(`${this.name}-ec2-security-group`, {
|
|
27
35
|
ingress: [
|
|
28
36
|
{
|
|
29
37
|
protocol: 'tcp',
|
|
30
38
|
fromPort: 22,
|
|
31
39
|
toPort: 22,
|
|
32
|
-
cidrBlocks: [
|
|
40
|
+
cidrBlocks: [this.vpc.vpc.cidrBlock],
|
|
33
41
|
},
|
|
34
42
|
{
|
|
35
43
|
protocol: 'tcp',
|
|
36
44
|
fromPort: 443,
|
|
37
45
|
toPort: 443,
|
|
38
|
-
cidrBlocks: [
|
|
46
|
+
cidrBlocks: [this.vpc.vpc.cidrBlock],
|
|
39
47
|
},
|
|
40
48
|
],
|
|
41
49
|
egress: [
|
|
42
50
|
{ protocol: '-1', fromPort: 0, toPort: 0, cidrBlocks: ['0.0.0.0/0'] },
|
|
43
51
|
],
|
|
44
|
-
vpcId:
|
|
45
|
-
tags:
|
|
52
|
+
vpcId: this.vpc.vpcId,
|
|
53
|
+
tags: common_tags_1.commonTags,
|
|
46
54
|
}, { parent: this });
|
|
47
|
-
|
|
55
|
+
this.role = new aws.iam.Role(`${this.name}-ec2-role`, {
|
|
48
56
|
assumeRolePolicy: {
|
|
49
57
|
Version: '2012-10-17',
|
|
50
58
|
Statement: [
|
|
@@ -57,54 +65,54 @@ class Ec2SSMConnect extends pulumi.ComponentResource {
|
|
|
57
65
|
},
|
|
58
66
|
],
|
|
59
67
|
},
|
|
60
|
-
tags:
|
|
68
|
+
tags: common_tags_1.commonTags,
|
|
61
69
|
}, { parent: this });
|
|
62
|
-
const ssmPolicyAttachment = new aws.iam.RolePolicyAttachment(`${name}-ssm-policy-attachment`, {
|
|
63
|
-
role: role.name,
|
|
70
|
+
const ssmPolicyAttachment = new aws.iam.RolePolicyAttachment(`${this.name}-ssm-policy-attachment`, {
|
|
71
|
+
role: this.role.name,
|
|
64
72
|
policyArn: 'arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore',
|
|
65
73
|
}, { parent: this });
|
|
66
|
-
|
|
67
|
-
role: role.name,
|
|
68
|
-
tags:
|
|
74
|
+
this.ssmProfile = new aws.iam.InstanceProfile(`${this.name}-ssm-profile`, {
|
|
75
|
+
role: this.role.name,
|
|
76
|
+
tags: common_tags_1.commonTags,
|
|
69
77
|
}, { parent: this, dependsOn: [ssmPolicyAttachment] });
|
|
70
|
-
this.ec2 = new aws.ec2.Instance(`${name}-ec2`, {
|
|
71
|
-
ami:
|
|
78
|
+
this.ec2 = new aws.ec2.Instance(`${this.name}-ec2`, {
|
|
79
|
+
ami: this.ami.id,
|
|
72
80
|
associatePublicIpAddress: false,
|
|
73
|
-
instanceType
|
|
74
|
-
iamInstanceProfile: ssmProfile.name,
|
|
81
|
+
instanceType,
|
|
82
|
+
iamInstanceProfile: this.ssmProfile.name,
|
|
75
83
|
subnetId,
|
|
76
84
|
vpcSecurityGroupIds: [this.ec2SecurityGroup.id],
|
|
77
|
-
tags: Object.assign(Object.assign(Object.assign({},
|
|
85
|
+
tags: Object.assign(Object.assign(Object.assign({}, common_tags_1.commonTags), { Name: `${this.name}-ec2` }), tags),
|
|
78
86
|
}, { parent: this });
|
|
79
|
-
this.ssmVpcEndpoint = new aws.ec2.VpcEndpoint(`${name}-ssm-vpc-endpoint`, {
|
|
80
|
-
vpcId:
|
|
87
|
+
this.ssmVpcEndpoint = new aws.ec2.VpcEndpoint(`${this.name}-ssm-vpc-endpoint`, {
|
|
88
|
+
vpcId: this.vpc.vpcId,
|
|
81
89
|
ipAddressType: 'ipv4',
|
|
82
90
|
serviceName: `com.amazonaws.${awsRegion}.ssm`,
|
|
83
91
|
vpcEndpointType: 'Interface',
|
|
84
92
|
subnetIds: [subnetId],
|
|
85
93
|
securityGroupIds: [this.ec2SecurityGroup.id],
|
|
86
94
|
privateDnsEnabled: true,
|
|
87
|
-
tags:
|
|
95
|
+
tags: common_tags_1.commonTags,
|
|
88
96
|
}, { parent: this, dependsOn: [this.ec2] });
|
|
89
|
-
this.ec2MessagesVpcEndpoint = new aws.ec2.VpcEndpoint(`${name}-ec2messages-vpc-endpoint`, {
|
|
90
|
-
vpcId:
|
|
97
|
+
this.ec2MessagesVpcEndpoint = new aws.ec2.VpcEndpoint(`${this.name}-ec2messages-vpc-endpoint`, {
|
|
98
|
+
vpcId: this.vpc.vpcId,
|
|
91
99
|
ipAddressType: 'ipv4',
|
|
92
100
|
serviceName: `com.amazonaws.${awsRegion}.ec2messages`,
|
|
93
101
|
vpcEndpointType: 'Interface',
|
|
94
102
|
subnetIds: [subnetId],
|
|
95
103
|
securityGroupIds: [this.ec2SecurityGroup.id],
|
|
96
104
|
privateDnsEnabled: true,
|
|
97
|
-
tags:
|
|
105
|
+
tags: common_tags_1.commonTags,
|
|
98
106
|
}, { parent: this, dependsOn: [this.ec2] });
|
|
99
|
-
this.ssmMessagesVpcEndpoint = new aws.ec2.VpcEndpoint(`${name}-ssmmessages-vpc-endpoint`, {
|
|
100
|
-
vpcId:
|
|
107
|
+
this.ssmMessagesVpcEndpoint = new aws.ec2.VpcEndpoint(`${this.name}-ssmmessages-vpc-endpoint`, {
|
|
108
|
+
vpcId: this.vpc.vpcId,
|
|
101
109
|
ipAddressType: 'ipv4',
|
|
102
110
|
serviceName: `com.amazonaws.${awsRegion}.ssmmessages`,
|
|
103
111
|
vpcEndpointType: 'Interface',
|
|
104
112
|
subnetIds: [subnetId],
|
|
105
113
|
securityGroupIds: [this.ec2SecurityGroup.id],
|
|
106
114
|
privateDnsEnabled: true,
|
|
107
|
-
tags:
|
|
115
|
+
tags: common_tags_1.commonTags,
|
|
108
116
|
}, { parent: this, dependsOn: [this.ec2] });
|
|
109
117
|
this.registerOutputs();
|
|
110
118
|
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import * as aws from '@pulumi/aws-v7';
|
|
2
|
+
import * as awsNative from '@pulumi/aws-native';
|
|
3
|
+
import * as awsx from '@pulumi/awsx-v3';
|
|
4
|
+
import * as pulumi from '@pulumi/pulumi';
|
|
5
|
+
import { DatabaseReplica } from './database-replica';
|
|
6
|
+
import { Ec2SSMConnect } from './ec2-ssm-connect';
|
|
7
|
+
import { Password } from '../password';
|
|
8
|
+
export declare namespace Database {
|
|
9
|
+
type Instance = {
|
|
10
|
+
dbName?: pulumi.Input<string>;
|
|
11
|
+
engineVersion?: pulumi.Input<string>;
|
|
12
|
+
multiAz?: pulumi.Input<boolean>;
|
|
13
|
+
instanceClass?: pulumi.Input<string>;
|
|
14
|
+
allowMajorVersionUpgrade?: pulumi.Input<boolean>;
|
|
15
|
+
autoMinorVersionUpgrade?: pulumi.Input<boolean>;
|
|
16
|
+
applyImmediately?: pulumi.Input<boolean>;
|
|
17
|
+
};
|
|
18
|
+
type Credentials = {
|
|
19
|
+
username?: pulumi.Input<string>;
|
|
20
|
+
password?: pulumi.Input<string>;
|
|
21
|
+
};
|
|
22
|
+
type Storage = {
|
|
23
|
+
allocatedStorage?: pulumi.Input<number>;
|
|
24
|
+
maxAllocatedStorage?: pulumi.Input<number>;
|
|
25
|
+
};
|
|
26
|
+
type ReplicaConfig = Partial<Omit<DatabaseReplica.Args, 'replicateSourceDb' | keyof DatabaseReplica.Security>> & {
|
|
27
|
+
enableMonitoring?: pulumi.Input<boolean>;
|
|
28
|
+
};
|
|
29
|
+
type SSMConnectConfig = Omit<Ec2SSMConnect.Args, 'vpc'>;
|
|
30
|
+
type Args = Instance & Credentials & Storage & {
|
|
31
|
+
vpc: pulumi.Input<awsx.ec2.Vpc>;
|
|
32
|
+
enableMonitoring?: pulumi.Input<boolean>;
|
|
33
|
+
snapshotIdentifier?: pulumi.Input<string>;
|
|
34
|
+
parameterGroupName?: pulumi.Input<string>;
|
|
35
|
+
kmsKeyId?: pulumi.Input<string>;
|
|
36
|
+
createReplica?: pulumi.Input<boolean>;
|
|
37
|
+
replicaConfig?: ReplicaConfig;
|
|
38
|
+
enableSSMConnect?: pulumi.Input<boolean>;
|
|
39
|
+
ssmConnectConfig?: SSMConnectConfig;
|
|
40
|
+
tags?: pulumi.Input<{
|
|
41
|
+
[key: string]: pulumi.Input<string>;
|
|
42
|
+
}>;
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export declare class Database extends pulumi.ComponentResource {
|
|
46
|
+
name: string;
|
|
47
|
+
instance: awsNative.rds.DbInstance;
|
|
48
|
+
vpc: pulumi.Output<awsx.ec2.Vpc>;
|
|
49
|
+
dbSubnetGroup: aws.rds.SubnetGroup;
|
|
50
|
+
dbSecurityGroup: aws.ec2.SecurityGroup;
|
|
51
|
+
password: Password;
|
|
52
|
+
kmsKeyId: pulumi.Output<string>;
|
|
53
|
+
monitoringRole?: aws.iam.Role;
|
|
54
|
+
encryptedSnapshotCopy?: aws.rds.SnapshotCopy;
|
|
55
|
+
replica?: DatabaseReplica;
|
|
56
|
+
ec2SSMConnect?: Ec2SSMConnect;
|
|
57
|
+
constructor(name: string, args: Database.Args, opts?: pulumi.ComponentResourceOptions);
|
|
58
|
+
private createSubnetGroup;
|
|
59
|
+
private createSecurityGroup;
|
|
60
|
+
private createEncryptionKey;
|
|
61
|
+
private createMonitoringRole;
|
|
62
|
+
private createEncryptedSnapshotCopy;
|
|
63
|
+
private createDatabaseReplica;
|
|
64
|
+
private createEc2SSMConnect;
|
|
65
|
+
private createDatabaseInstance;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/database/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Database = void 0;
|
|
4
|
+
const aws = require("@pulumi/aws-v7");
|
|
5
|
+
const awsNative = require("@pulumi/aws-native");
|
|
6
|
+
const pulumi = require("@pulumi/pulumi");
|
|
7
|
+
const common_tags_1 = require("../../shared/common-tags");
|
|
8
|
+
const database_replica_1 = require("./database-replica");
|
|
9
|
+
const ec2_ssm_connect_1 = require("./ec2-ssm-connect");
|
|
10
|
+
const merge_with_defaults_1 = require("../../shared/merge-with-defaults");
|
|
11
|
+
const password_1 = require("../password");
|
|
12
|
+
const defaults = {
|
|
13
|
+
multiAz: false,
|
|
14
|
+
applyImmediately: false,
|
|
15
|
+
allocatedStorage: 20,
|
|
16
|
+
maxAllocatedStorage: 100,
|
|
17
|
+
instanceClass: 'db.t4g.micro',
|
|
18
|
+
enableMonitoring: false,
|
|
19
|
+
allowMajorVersionUpgrade: false,
|
|
20
|
+
autoMinorVersionUpgrade: true,
|
|
21
|
+
engineVersion: '17.2',
|
|
22
|
+
};
|
|
23
|
+
class Database extends pulumi.ComponentResource {
|
|
24
|
+
constructor(name, args, opts = {}) {
|
|
25
|
+
super('studion:database:Database', name, {}, Object.assign(Object.assign({}, opts), { aliases: [...(opts.aliases || []), { type: 'studion:Database' }] }));
|
|
26
|
+
this.name = name;
|
|
27
|
+
const argsWithDefaults = (0, merge_with_defaults_1.mergeWithDefaults)(defaults, args);
|
|
28
|
+
const { vpc, kmsKeyId, enableMonitoring, snapshotIdentifier, createReplica, replicaConfig = {}, enableSSMConnect, ssmConnectConfig = {}, } = argsWithDefaults;
|
|
29
|
+
this.vpc = pulumi.output(vpc);
|
|
30
|
+
this.dbSubnetGroup = this.createSubnetGroup();
|
|
31
|
+
this.dbSecurityGroup = this.createSecurityGroup();
|
|
32
|
+
this.password = new password_1.Password(`${this.name}-database-password`, { value: args.password }, { parent: this });
|
|
33
|
+
this.kmsKeyId = kmsKeyId
|
|
34
|
+
? pulumi.output(kmsKeyId)
|
|
35
|
+
: this.createEncryptionKey().arn;
|
|
36
|
+
if (enableMonitoring) {
|
|
37
|
+
this.monitoringRole = this.createMonitoringRole();
|
|
38
|
+
}
|
|
39
|
+
if (snapshotIdentifier) {
|
|
40
|
+
this.encryptedSnapshotCopy =
|
|
41
|
+
this.createEncryptedSnapshotCopy(snapshotIdentifier);
|
|
42
|
+
}
|
|
43
|
+
this.instance = this.createDatabaseInstance(argsWithDefaults);
|
|
44
|
+
if (createReplica) {
|
|
45
|
+
this.replica = this.createDatabaseReplica(replicaConfig);
|
|
46
|
+
}
|
|
47
|
+
if (enableSSMConnect) {
|
|
48
|
+
this.ec2SSMConnect = this.createEc2SSMConnect(ssmConnectConfig);
|
|
49
|
+
}
|
|
50
|
+
this.registerOutputs();
|
|
51
|
+
}
|
|
52
|
+
createSubnetGroup() {
|
|
53
|
+
return new aws.rds.SubnetGroup(`${this.name}-subnet-group`, {
|
|
54
|
+
subnetIds: this.vpc.isolatedSubnetIds,
|
|
55
|
+
tags: common_tags_1.commonTags,
|
|
56
|
+
}, { parent: this });
|
|
57
|
+
}
|
|
58
|
+
createSecurityGroup() {
|
|
59
|
+
return new aws.ec2.SecurityGroup(`${this.name}-security-group`, {
|
|
60
|
+
vpcId: this.vpc.vpcId,
|
|
61
|
+
ingress: [
|
|
62
|
+
{
|
|
63
|
+
protocol: 'tcp',
|
|
64
|
+
fromPort: 5432,
|
|
65
|
+
toPort: 5432,
|
|
66
|
+
cidrBlocks: [this.vpc.vpc.cidrBlock],
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
tags: common_tags_1.commonTags,
|
|
70
|
+
}, { parent: this });
|
|
71
|
+
}
|
|
72
|
+
createEncryptionKey() {
|
|
73
|
+
return new aws.kms.Key(`${this.name}-rds-key`, {
|
|
74
|
+
description: `${this.name} RDS encryption key`,
|
|
75
|
+
customerMasterKeySpec: 'SYMMETRIC_DEFAULT',
|
|
76
|
+
isEnabled: true,
|
|
77
|
+
keyUsage: 'ENCRYPT_DECRYPT',
|
|
78
|
+
multiRegion: false,
|
|
79
|
+
enableKeyRotation: true,
|
|
80
|
+
tags: common_tags_1.commonTags,
|
|
81
|
+
}, { parent: this });
|
|
82
|
+
}
|
|
83
|
+
createMonitoringRole() {
|
|
84
|
+
const monitoringRole = new aws.iam.Role(`${this.name}-rds-monitoring`, {
|
|
85
|
+
assumeRolePolicy: {
|
|
86
|
+
Version: '2012-10-17',
|
|
87
|
+
Statement: [
|
|
88
|
+
{
|
|
89
|
+
Action: 'sts:AssumeRole',
|
|
90
|
+
Effect: 'Allow',
|
|
91
|
+
Principal: {
|
|
92
|
+
Service: 'monitoring.rds.amazonaws.com',
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
],
|
|
96
|
+
},
|
|
97
|
+
}, { parent: this });
|
|
98
|
+
new aws.iam.RolePolicyAttachment(`${this.name}-rds-monitoring-role-attachment`, {
|
|
99
|
+
role: monitoringRole.name,
|
|
100
|
+
policyArn: 'arn:aws:iam::aws:policy/service-role/AmazonRDSEnhancedMonitoringRole',
|
|
101
|
+
}, { parent: this });
|
|
102
|
+
return monitoringRole;
|
|
103
|
+
}
|
|
104
|
+
createEncryptedSnapshotCopy(snapshotIdentifier) {
|
|
105
|
+
const sourceDbSnapshotIdentifier = pulumi
|
|
106
|
+
.output(snapshotIdentifier)
|
|
107
|
+
.apply(snapshotIdentifier => aws.rds.getSnapshot({
|
|
108
|
+
dbSnapshotIdentifier: snapshotIdentifier,
|
|
109
|
+
})).dbSnapshotArn;
|
|
110
|
+
return new aws.rds.SnapshotCopy(`${this.name}-encrypted-snapshot-copy`, {
|
|
111
|
+
sourceDbSnapshotIdentifier,
|
|
112
|
+
targetDbSnapshotIdentifier: pulumi.interpolate `${snapshotIdentifier}-encrypted-copy`,
|
|
113
|
+
kmsKeyId: this.kmsKeyId,
|
|
114
|
+
}, { parent: this });
|
|
115
|
+
}
|
|
116
|
+
createDatabaseReplica(config = {}) {
|
|
117
|
+
const monitoringRole = config.enableMonitoring
|
|
118
|
+
? config.monitoringRole || this.monitoringRole
|
|
119
|
+
: undefined;
|
|
120
|
+
const replica = new database_replica_1.DatabaseReplica(`${this.name}-replica`, Object.assign({ replicateSourceDb: this.instance.dbInstanceIdentifier.apply(id => id), dbSecurityGroup: this.dbSecurityGroup, monitoringRole }, config), { parent: this, dependsOn: [this.instance] });
|
|
121
|
+
return replica;
|
|
122
|
+
}
|
|
123
|
+
createEc2SSMConnect(config = {}) {
|
|
124
|
+
return new ec2_ssm_connect_1.Ec2SSMConnect(`${this.name}-ssm-connect`, Object.assign({ vpc: this.vpc }, config), { parent: this });
|
|
125
|
+
}
|
|
126
|
+
createDatabaseInstance(args) {
|
|
127
|
+
var _a, _b;
|
|
128
|
+
const monitoringOptions = args.enableMonitoring && this.monitoringRole
|
|
129
|
+
? {
|
|
130
|
+
monitoringInterval: 60,
|
|
131
|
+
monitoringRoleArn: this.monitoringRole.arn,
|
|
132
|
+
enablePerformanceInsights: true,
|
|
133
|
+
performanceInsightsRetentionPeriod: 7,
|
|
134
|
+
}
|
|
135
|
+
: {};
|
|
136
|
+
const instance = new awsNative.rds.DbInstance(`${this.name}-rds`, Object.assign(Object.assign({ dbInstanceIdentifier: `${this.name}-db-instance`, engine: 'postgres', engineVersion: args.engineVersion, dbInstanceClass: args.instanceClass, dbName: args.dbName, masterUsername: args.username, masterUserPassword: this.password.value, dbSubnetGroupName: this.dbSubnetGroup.name, vpcSecurityGroups: [this.dbSecurityGroup.id], allocatedStorage: (_a = args.allocatedStorage) === null || _a === void 0 ? void 0 : _a.toString(), maxAllocatedStorage: args.maxAllocatedStorage, multiAz: args.multiAz, applyImmediately: args.applyImmediately, allowMajorVersionUpgrade: args.allowMajorVersionUpgrade, autoMinorVersionUpgrade: args.autoMinorVersionUpgrade, kmsKeyId: this.kmsKeyId, storageEncrypted: true, publiclyAccessible: false, preferredMaintenanceWindow: 'Mon:07:00-Mon:07:30', preferredBackupWindow: '06:00-06:30', backupRetentionPeriod: 14, caCertificateIdentifier: 'rds-ca-rsa2048-g1', dbParameterGroupName: args.parameterGroupName, dbSnapshotIdentifier: (_b = this.encryptedSnapshotCopy) === null || _b === void 0 ? void 0 : _b.targetDbSnapshotIdentifier }, monitoringOptions), { tags: pulumi
|
|
137
|
+
.output(args.tags)
|
|
138
|
+
.apply(tags => [
|
|
139
|
+
...Object.entries(Object.assign(Object.assign({}, common_tags_1.commonTags), tags)).map(([key, value]) => ({ key, value })),
|
|
140
|
+
]) }), { parent: this, dependsOn: [this.password] });
|
|
141
|
+
return instance;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
exports.Database = Database;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as pulumi from '@pulumi/pulumi';
|
|
2
|
-
import * as aws from '@pulumi/aws';
|
|
3
|
-
import * as awsx from '@pulumi/awsx';
|
|
4
|
-
import {
|
|
2
|
+
import * as aws from '@pulumi/aws-v7';
|
|
3
|
+
import * as awsx from '@pulumi/awsx-v3';
|
|
4
|
+
import { TaskSize } from './task-size';
|
|
5
5
|
type PersistentStorage = {
|
|
6
6
|
fileSystem: aws.efs.FileSystem;
|
|
7
7
|
accessPoint: aws.efs.AccessPoint;
|
|
@@ -85,10 +85,11 @@ export declare namespace EcsService {
|
|
|
85
85
|
* - `medium` (0.5 vCPU, 1 GB memory)
|
|
86
86
|
* - `large` (1 vCPU memory, 2 GB memory)
|
|
87
87
|
* - `xlarge` (2 vCPU, 4 GB memory)
|
|
88
|
-
*
|
|
88
|
+
* - `2xlarge` (4 vCPU, 8 GB memory)
|
|
89
|
+
* - `3xlarge` (8 vCPU, 16 GB memory)
|
|
89
90
|
* @default "small"
|
|
90
91
|
*/
|
|
91
|
-
size?: pulumi.Input<
|
|
92
|
+
size?: pulumi.Input<TaskSize>;
|
|
92
93
|
/**
|
|
93
94
|
* Custom service security group
|
|
94
95
|
* In case no security group is provided, default security group will be automatically created.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ecs-service/index.ts"],"names":[],"mappings":"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"}
|