@anyakichi/cdk-rsync-backup 0.1.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/LICENSE +21 -0
- package/README.md +6 -0
- package/assets/rsync-backup.sh +95 -0
- package/assets/rsyncd.conf +5 -0
- package/assets/rsyncd.inc +4 -0
- package/jest.config.js +8 -0
- package/lib/index.d.ts +20 -0
- package/lib/index.js +133 -0
- package/package.json +37 -0
- package/test/cdk-rsync-backup.test.d.ts +0 -0
- package/test/cdk-rsync-backup.test.js +18 -0
- package/tsconfig.json +30 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2022 anyakichi
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
set -o errexit
|
|
4
|
+
set -o nounset
|
|
5
|
+
set -o pipefail
|
|
6
|
+
|
|
7
|
+
export AWS_DEFAULT_REGION
|
|
8
|
+
AWS_DEFAULT_REGION=$(curl -s http://169.254.169.254/latest/meta-data/placement/region)
|
|
9
|
+
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
|
|
10
|
+
INSTANCE_AZ=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)
|
|
11
|
+
|
|
12
|
+
main() {
|
|
13
|
+
local host="$1"
|
|
14
|
+
local size="$2"
|
|
15
|
+
local device="$3"
|
|
16
|
+
local name="backup-$1"
|
|
17
|
+
local mnt="/srv/rsync-backup/mnt/$host"
|
|
18
|
+
local args rsync_status s3base snapshot_id timestamp volume_id
|
|
19
|
+
|
|
20
|
+
timestamp="$(date -u "+%Y%m%dT%H%MZ")"
|
|
21
|
+
s3base=s3://$S3_LOGS_BUCKET/RsyncBackupLogs/$(date -u "+%Y/%m/%d")/
|
|
22
|
+
|
|
23
|
+
volume_id=$(aws ec2 describe-volumes \
|
|
24
|
+
--filter "Name=tag:Name,Values=$name" \
|
|
25
|
+
--query "Volumes[].VolumeId" --output text)
|
|
26
|
+
if [ -n "$volume_id" ]; then
|
|
27
|
+
# Data volume already exists.
|
|
28
|
+
echo backup volume already exists
|
|
29
|
+
exit 1
|
|
30
|
+
fi
|
|
31
|
+
|
|
32
|
+
# Get the latest snapshot ID.
|
|
33
|
+
snapshot_id=$(aws ec2 describe-snapshots --owner-ids self \
|
|
34
|
+
--filter "Name=tag:Name,Values=$name" \
|
|
35
|
+
--query "reverse(sort_by(Snapshots,&StartTime))[0].SnapshotId" \
|
|
36
|
+
--output text)
|
|
37
|
+
|
|
38
|
+
args=()
|
|
39
|
+
if [[ $snapshot_id != None ]]; then
|
|
40
|
+
args+=(--snapshot-id "$snapshot_id")
|
|
41
|
+
else
|
|
42
|
+
args+=(--size "$size")
|
|
43
|
+
fi
|
|
44
|
+
volume_id=$(aws ec2 create-volume --availability-zone "$INSTANCE_AZ" \
|
|
45
|
+
--encrypted --volume-type gp3 \
|
|
46
|
+
--tag-specifications "ResourceType=volume,Tags=[{Key=Name,Value=$name}]" \
|
|
47
|
+
--query VolumeId --output text "${args[@]}")
|
|
48
|
+
|
|
49
|
+
aws ec2 wait volume-available --volume-ids "$volume_id"
|
|
50
|
+
aws ec2 attach-volume --volume-id "$volume_id" \
|
|
51
|
+
--instance-id "$INSTANCE_ID" --device "$device" &>/dev/null
|
|
52
|
+
|
|
53
|
+
while true; do
|
|
54
|
+
if [[ -e $device ]]; then
|
|
55
|
+
break
|
|
56
|
+
fi
|
|
57
|
+
sleep 1
|
|
58
|
+
done
|
|
59
|
+
|
|
60
|
+
mkdir -p "$mnt"
|
|
61
|
+
if [[ $snapshot_id == None ]]; then
|
|
62
|
+
mkfs.ext4 -q "$device"
|
|
63
|
+
fi
|
|
64
|
+
mount "$device" "$mnt"
|
|
65
|
+
|
|
66
|
+
mkdir -p "$mnt/$host"
|
|
67
|
+
|
|
68
|
+
rsync --server --daemon --config="/srv/rsync-backup/rsyncd.$host.conf" . && :
|
|
69
|
+
rsync_status=$?
|
|
70
|
+
|
|
71
|
+
umount "$mnt"
|
|
72
|
+
|
|
73
|
+
aws ec2 detach-volume --volume-id "$volume_id" &>/dev/null
|
|
74
|
+
|
|
75
|
+
if [[ $rsync_status == 0 ]]; then
|
|
76
|
+
snapshot_id=$(aws ec2 create-snapshot --volume-id "$volume_id" \
|
|
77
|
+
--description "$name-$timestamp" \
|
|
78
|
+
--tag-specifications "ResourceType=snapshot,Tags=[{Key=Name,Value=$name}]" \
|
|
79
|
+
--query SnapshotId --output text)
|
|
80
|
+
|
|
81
|
+
logfile_gz="/srv/rsync-backup/RsyncBackup-$host-$timestamp.log.gz"
|
|
82
|
+
gzip -c "/srv/rsync-backup/rsync-backup.$host.log" >"$logfile_gz"
|
|
83
|
+
|
|
84
|
+
aws s3 cp "$logfile_gz" "$s3base"
|
|
85
|
+
|
|
86
|
+
rm -f "/srv/rsync-backup/rsync-backup.$host.log" "$logfile_gz"
|
|
87
|
+
|
|
88
|
+
aws ec2 wait snapshot-completed --snapshot-ids "$snapshot_id"
|
|
89
|
+
fi
|
|
90
|
+
|
|
91
|
+
aws ec2 wait volume-available --volume-ids "$volume_id"
|
|
92
|
+
aws ec2 delete-volume --volume-id "$volume_id"
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
main "$@"
|
package/jest.config.js
ADDED
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as ec2 from "aws-cdk-lib/aws-ec2";
|
|
2
|
+
import * as s3 from "aws-cdk-lib/aws-s3";
|
|
3
|
+
import { Construct } from "constructs";
|
|
4
|
+
export interface RsyncBackupModule {
|
|
5
|
+
readonly name: string;
|
|
6
|
+
readonly sshKey: string;
|
|
7
|
+
readonly size: number;
|
|
8
|
+
}
|
|
9
|
+
export interface RsyncBackupProps {
|
|
10
|
+
readonly modules?: RsyncBackupModule[];
|
|
11
|
+
readonly instanceId?: string;
|
|
12
|
+
readonly securityGroup?: ec2.ISecurityGroup;
|
|
13
|
+
readonly vpc?: ec2.IVpc;
|
|
14
|
+
readonly keyName?: string;
|
|
15
|
+
readonly init?: ec2.CloudFormationInit;
|
|
16
|
+
readonly logsBucket?: s3.IBucket;
|
|
17
|
+
}
|
|
18
|
+
export declare class RsyncBackup extends Construct {
|
|
19
|
+
constructor(scope: Construct, id: string, props?: RsyncBackupProps);
|
|
20
|
+
}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RsyncBackup = void 0;
|
|
4
|
+
const cdk = require("aws-cdk-lib");
|
|
5
|
+
const ec2 = require("aws-cdk-lib/aws-ec2");
|
|
6
|
+
const iam = require("aws-cdk-lib/aws-iam");
|
|
7
|
+
const s3 = require("aws-cdk-lib/aws-s3");
|
|
8
|
+
const cdk_ec2_key_pair_1 = require("cdk-ec2-key-pair");
|
|
9
|
+
const constructs_1 = require("constructs");
|
|
10
|
+
const path = require("path");
|
|
11
|
+
class RsyncBackup extends constructs_1.Construct {
|
|
12
|
+
constructor(scope, id, props = {}) {
|
|
13
|
+
super(scope, id);
|
|
14
|
+
const bucket = props.logsBucket ||
|
|
15
|
+
new s3.Bucket(this, "LogsBucket", {
|
|
16
|
+
removalPolicy: cdk.RemovalPolicy.DESTROY,
|
|
17
|
+
});
|
|
18
|
+
const vpc = props.vpc || cdk.aws_ec2.Vpc.fromLookup(this, "VPC", { isDefault: true });
|
|
19
|
+
let securityGroup;
|
|
20
|
+
if (props.securityGroup) {
|
|
21
|
+
securityGroup = props.securityGroup;
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
securityGroup = new ec2.SecurityGroup(this, "SecurityGroup", {
|
|
25
|
+
vpc,
|
|
26
|
+
allowAllOutbound: true,
|
|
27
|
+
});
|
|
28
|
+
securityGroup.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(22), "Allow SSH Access");
|
|
29
|
+
}
|
|
30
|
+
const ami = new ec2.AmazonLinuxImage({
|
|
31
|
+
generation: ec2.AmazonLinuxGeneration.AMAZON_LINUX_2,
|
|
32
|
+
cpuType: ec2.AmazonLinuxCpuType.ARM_64,
|
|
33
|
+
});
|
|
34
|
+
const policy = new iam.PolicyDocument({
|
|
35
|
+
statements: [
|
|
36
|
+
new iam.PolicyStatement({
|
|
37
|
+
actions: [
|
|
38
|
+
"ec2:DescribeInstances",
|
|
39
|
+
"ec2:DescribeSnapshots",
|
|
40
|
+
"ec2:DescribeVolumes",
|
|
41
|
+
"ec2:DescribeVolumeStatus",
|
|
42
|
+
"ec2:AttachVolume",
|
|
43
|
+
"ec2:DetachVolume",
|
|
44
|
+
"ec2:CreateVolume",
|
|
45
|
+
"ec2:DeleteVolume",
|
|
46
|
+
"ec2:CreateSnapshot",
|
|
47
|
+
"ec2:CreateTags",
|
|
48
|
+
],
|
|
49
|
+
resources: ["*"],
|
|
50
|
+
}),
|
|
51
|
+
new iam.PolicyStatement({
|
|
52
|
+
actions: ["s3:PutObject", "s3:PutObjectAcl"],
|
|
53
|
+
resources: [bucket.bucketArn, bucket.bucketArn + "/*"],
|
|
54
|
+
}),
|
|
55
|
+
],
|
|
56
|
+
});
|
|
57
|
+
const role = new iam.Role(this, "InstanceRole", {
|
|
58
|
+
assumedBy: new iam.ServicePrincipal("ec2.amazonaws.com"),
|
|
59
|
+
inlinePolicies: {
|
|
60
|
+
rsyncBackup: policy,
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
let keyName;
|
|
64
|
+
let key;
|
|
65
|
+
if (props.keyName) {
|
|
66
|
+
keyName = props.keyName;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
key = new cdk_ec2_key_pair_1.KeyPair(this, "KeyPair", {
|
|
70
|
+
name: "rsync-backup",
|
|
71
|
+
});
|
|
72
|
+
keyName = key.keyPairName;
|
|
73
|
+
}
|
|
74
|
+
const initConfig = new ec2.InitConfig([
|
|
75
|
+
ec2.InitFile.fromString("/etc/environment", `S3_LOGS_BUCKET=${bucket.bucketName}`),
|
|
76
|
+
ec2.InitFile.fromAsset("/usr/local/bin/rsync-backup", path.join(__dirname, "../assets/rsync-backup.sh"), {
|
|
77
|
+
mode: "000755",
|
|
78
|
+
}),
|
|
79
|
+
ec2.InitFile.fromAsset("/srv/rsync-backup/rsyncd.inc", path.join(__dirname, "../assets/rsyncd.inc")),
|
|
80
|
+
]);
|
|
81
|
+
if (props.modules) {
|
|
82
|
+
for (const [i, m] of props.modules.entries()) {
|
|
83
|
+
if (m.size < 0 || !Number.isInteger(m.size)) {
|
|
84
|
+
throw new Error("module size must be a positive integer");
|
|
85
|
+
}
|
|
86
|
+
const device = String.fromCharCode("b".charCodeAt(0) + i);
|
|
87
|
+
initConfig.add(ec2.InitFile.fromAsset(`/srv/rsync-backup/rsyncd.${m.name}.conf`, path.join(__dirname, "../assets/rsyncd.conf")));
|
|
88
|
+
initConfig.add(ec2.InitCommand.argvCommand([
|
|
89
|
+
"/usr/bin/sed",
|
|
90
|
+
"-i",
|
|
91
|
+
`s/@host@/${m.name}/g`,
|
|
92
|
+
`/srv/rsync-backup/rsyncd.${m.name}.conf`,
|
|
93
|
+
]));
|
|
94
|
+
initConfig.add(ec2.InitCommand.shellCommand(`echo 'no-port-forwarding,no-agent-forwarding,no-X11-forwarding,command="rsync-backup ${m.name} ${m.size} /dev/sd${device}" ${m.sshKey}' >> /root/.ssh/authorized_keys`));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
initConfig.add(ec2.InitFile.fromAsset("/srv/rsync-backup/rsyncd.backup.conf", path.join(__dirname, "../assets/rsyncd.conf")));
|
|
99
|
+
initConfig.add(ec2.InitCommand.argvCommand([
|
|
100
|
+
"/usr/bin/sed",
|
|
101
|
+
"-i",
|
|
102
|
+
`s/@host@/backup/g`,
|
|
103
|
+
`/srv/rsync-backup/rsyncd.backup.conf`,
|
|
104
|
+
]));
|
|
105
|
+
initConfig.add(ec2.InitCommand.argvCommand([
|
|
106
|
+
"/usr/bin/sed",
|
|
107
|
+
"-i",
|
|
108
|
+
's|command=".*" |command="rsync-backup backup 100 /dev/sdb" |',
|
|
109
|
+
"/root/.ssh/authorized_keys",
|
|
110
|
+
]));
|
|
111
|
+
}
|
|
112
|
+
const init = (() => {
|
|
113
|
+
if (props.init) {
|
|
114
|
+
props.init.addConfig("rsyncBackup", initConfig);
|
|
115
|
+
return props.init;
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
return ec2.CloudFormationInit.fromConfig(initConfig);
|
|
119
|
+
}
|
|
120
|
+
})();
|
|
121
|
+
const instance = new ec2.Instance(this, props.instanceId || "RsyncBackup", {
|
|
122
|
+
vpc,
|
|
123
|
+
instanceType: ec2.InstanceType.of(ec2.InstanceClass.T4G, ec2.InstanceSize.NANO),
|
|
124
|
+
machineImage: ami,
|
|
125
|
+
securityGroup: securityGroup,
|
|
126
|
+
keyName: keyName,
|
|
127
|
+
role: role,
|
|
128
|
+
init: init,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
exports.RsyncBackup = RsyncBackup;
|
|
133
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBbUM7QUFDbkMsMkNBQTJDO0FBQzNDLDJDQUEyQztBQUMzQyx5Q0FBeUM7QUFDekMsdURBQTJDO0FBQzNDLDJDQUF1QztBQUN2Qyw2QkFBNkI7QUFxQjdCLE1BQWEsV0FBWSxTQUFRLHNCQUFTO0lBQ3hDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsUUFBMEIsRUFBRTtRQUNwRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLE1BQU0sTUFBTSxHQUNWLEtBQUssQ0FBQyxVQUFVO1lBQ2hCLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFO2dCQUNoQyxhQUFhLEVBQUUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxPQUFPO2FBQ3pDLENBQUMsQ0FBQztRQUVMLE1BQU0sR0FBRyxHQUNQLEtBQUssQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUU1RSxJQUFJLGFBQWlDLENBQUM7UUFDdEMsSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFO1lBQ3ZCLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDO1NBQ3JDO2FBQU07WUFDTCxhQUFhLEdBQUcsSUFBSSxHQUFHLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxlQUFlLEVBQUU7Z0JBQzNELEdBQUc7Z0JBQ0gsZ0JBQWdCLEVBQUUsSUFBSTthQUN2QixDQUFDLENBQUM7WUFFSCxhQUFhLENBQUMsY0FBYyxDQUMxQixHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUNsQixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFDaEIsa0JB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QUFLLENBQUMsSUFBSSxFQUFFO2dCQUNkLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDaEQsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDO2FBQ25CO2lCQUFNO2dCQUNMLE9BQU8sR0FBRyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUN0RDtRQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFTCxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxVQUFVLElBQUksYUFBYSxFQUFFO1lBQ3pFLEdBQUc7WUFDSCxZQUFZLEVBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQy9CLEdBQUcsQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUNyQixHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FDdEI7WUFDRCxZQUFZLEVBQUUsR0FBRztZQUNqQixhQUFhLEVBQUUsYUFBYTtZQUM1QixPQUFPLEVBQUUsT0FBTztZQUNoQixJQUFJLEVBQUUsSUFBSTtZQUNWLElBQUksRUFBRSxJQUFJO1NBQ1gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBektELGtDQXlLQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCAqIGFzIGVjMiBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgKiBhcyBzMyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCI7XG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSBcImNkay1lYzIta2V5LXBhaXJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnN5bmNCYWNrdXBNb2R1bGUge1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNzaEtleTogc3RyaW5nO1xuICByZWFkb25seSBzaXplOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnN5bmNCYWNrdXBQcm9wcyB7XG4gIHJlYWRvbmx5IG1vZHVsZXM/OiBSc3luY0JhY2t1cE1vZHVsZVtdO1xuXG4gIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmc7XG5cbiAgcmVhZG9ubHkgc2VjdXJpdHlHcm91cD86IGVjMi5JU2VjdXJpdHlHcm91cDtcbiAgcmVhZG9ubHkgdnBjPzogZWMyLklWcGM7XG4gIHJlYWRvbmx5IGtleU5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGluaXQ/OiBlYzIuQ2xvdWRGb3JtYXRpb25Jbml0O1xuXG4gIHJlYWRvbmx5IGxvZ3NCdWNrZXQ/OiBzMy5JQnVja2V0O1xufVxuXG5leHBvcnQgY2xhc3MgUnN5bmNCYWNrdXAgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUnN5bmNCYWNrdXBQcm9wcyA9IHt9KSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IGJ1Y2tldCA9XG4gICAgICBwcm9wcy5sb2dzQnVja2V0IHx8XG4gICAgICBuZXcgczMuQnVja2V0KHRoaXMsIFwiTG9nc0J1Y2tldFwiLCB7XG4gICAgICAgIHJlbW92YWxQb2xpY3k6IGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICB9KTtcblxuICAgIGNvbnN0IHZwYyA9XG4gICAgICBwcm9wcy52cGMgfHwgY2RrLmF3c19lYzIuVnBjLmZyb21Mb29rdXAodGhpcywgXCJWUENcIiwgeyBpc0RlZmF1bHQ6IHRydWUgfSk7XG5cbiAgICBsZXQgc2VjdXJpdHlHcm91cDogZWMyLklTZWN1cml0eUdyb3VwO1xuICAgIGlmIChwcm9wcy5zZWN1cml0eUdyb3VwKSB7XG4gICAgICBzZWN1cml0eUdyb3VwID0gcHJvcHMuc2VjdXJpdHlHcm91cDtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VjdXJpdHlHcm91cCA9IG5ldyBlYzIuU2VjdXJpdHlHcm91cCh0aGlzLCBcIlNlY3VyaXR5R3JvdXBcIiwge1xuICAgICAgICB2cGMsXG4gICAgICAgIGFsbG93QWxsT3V0Ym91bmQ6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgc2VjdXJpdHlHcm91cC5hZGRJbmdyZXNzUnVsZShcbiAgICAgICAgZWMyLlBlZXIuYW55SXB2NCgpLFxuICAgICAgICBlYzIuUG9ydC50Y3AoMjIpLFxuICAgICAgICBcIkFsbG93IFNTSCBBY2Nlc3NcIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbWkgPSBuZXcgZWMyLkFtYXpvbkxpbnV4SW1hZ2Uoe1xuICAgICAgZ2VuZXJhdGlvbjogZWMyLkFtYXpvbkxpbnV4R2VuZXJhdGlvbi5BTUFaT05fTElOVVhfMixcbiAgICAgIGNwdVR5cGU6IGVjMi5BbWF6b25MaW51eENwdVR5cGUuQVJNXzY0LFxuICAgIH0pO1xuXG4gICAgY29uc3QgcG9saWN5ID0gbmV3IGlhbS5Qb2xpY3lEb2N1bWVudCh7XG4gICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICBcImVjMjpEZXNjcmliZUluc3RhbmNlc1wiLFxuICAgICAgICAgICAgXCJlYzI6RGVzY3JpYmVTbmFwc2hvdHNcIixcbiAgICAgICAgICAgIFwiZWMyOkRlc2NyaWJlVm9sdW1lc1wiLFxuICAgICAgICAgICAgXCJlYzI6RGVzY3JpYmVWb2x1bWVTdGF0dXNcIixcbiAgICAgICAgICAgIFwiZWMyOkF0dGFjaFZvbHVtZVwiLFxuICAgICAgICAgICAgXCJlYzI6RGV0YWNoVm9sdW1lXCIsXG4gICAgICAgICAgICBcImVjMjpDcmVhdGVWb2x1bWVcIixcbiAgICAgICAgICAgIFwiZWMyOkRlbGV0ZVZvbHVtZVwiLFxuICAgICAgICAgICAgXCJlYzI6Q3JlYXRlU25hcHNob3RcIixcbiAgICAgICAgICAgIFwiZWMyOkNyZWF0ZVRhZ3NcIixcbiAgICAgICAgICBdLFxuICAgICAgICAgIHJlc291cmNlczogW1wiKlwiXSxcbiAgICAgICAgfSksXG4gICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBhY3Rpb25zOiBbXCJzMzpQdXRPYmplY3RcIiwgXCJzMzpQdXRPYmplY3RBY2xcIl0sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbYnVja2V0LmJ1Y2tldEFybiwgYnVja2V0LmJ1Y2tldEFybiArIFwiLypcIl0sXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJvbGUgPSBuZXcgaWFtLlJvbGUodGhpcywgXCJJbnN0YW5jZVJvbGVcIiwge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoXCJlYzIuYW1hem9uYXdzLmNvbVwiKSxcbiAgICAgIGlubGluZVBvbGljaWVzOiB7XG4gICAgICAgIHJzeW5jQmFja3VwOiBwb2xpY3ksXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgbGV0IGtleU5hbWU6IHN0cmluZztcbiAgICBsZXQga2V5OiBLZXlQYWlyIHwgdW5kZWZpbmVkO1xuICAgIGlmIChwcm9wcy5rZXlOYW1lKSB7XG4gICAgICBrZXlOYW1lID0gcHJvcHMua2V5TmFtZTtcbiAgICB9IGVsc2Uge1xuICAgICAga2V5ID0gbmV3IEtleVBhaXIodGhpcywgXCJLZXlQYWlyXCIsIHtcbiAgICAgICAgbmFtZTogXCJyc3luYy1iYWNrdXBcIixcbiAgICAgIH0pO1xuICAgICAga2V5TmFtZSA9IGtleS5rZXlQYWlyTmFtZTtcbiAgICB9XG5cbiAgICBjb25zdCBpbml0Q29uZmlnID0gbmV3IGVjMi5Jbml0Q29uZmlnKFtcbiAgICAgIGVjMi5Jbml0RmlsZS5mcm9tU3RyaW5nKFxuICAgICAgICBcIi9ldGMvZW52aXJvbm1lbnRcIixcbiAgICAgICAgYFMzX0xPR1NfQlVDS0VUPSR7YnVja2V0LmJ1Y2tldE5hbWV9YFxuICAgICAgKSxcbiAgICAgIGVjMi5Jbml0RmlsZS5mcm9tQXNzZXQoXG4gICAgICAgIFwiL3Vzci9sb2NhbC9iaW4vcnN5bmMtYmFja3VwXCIsXG4gICAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsIFwiLi4vYXNzZXRzL3JzeW5jLWJhY2t1cC5zaFwiKSxcbiAgICAgICAge1xuICAgICAgICAgIG1vZGU6IFwiMDAwNzU1XCIsXG4gICAgICAgIH1cbiAgICAgICksXG4gICAgICBlYzIuSW5pdEZpbGUuZnJvbUFzc2V0KFxuICAgICAgICBcIi9zcnYvcnN5bmMtYmFja3VwL3JzeW5jZC5pbmNcIixcbiAgICAgICAgcGF0aC5qb2luKF9fZGlybmFtZSwgXCIuLi9hc3NldHMvcnN5bmNkLmluY1wiKVxuICAgICAgKSxcbiAgICBdKTtcblxuICAgIGlmIChwcm9wcy5tb2R1bGVzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtpLCBtXSBvZiBwcm9wcy5tb2R1bGVzLmVudHJpZXMoKSkge1xuICAgICAgICBpZiAobS5zaXplIDwgMCB8fCAhTnVtYmVyLmlzSW50ZWdlcihtLnNpemUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibW9kdWxlIHNpemUgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXJcIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZXZpY2UgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKFwiYlwiLmNoYXJDb2RlQXQoMCkgKyBpKTtcblxuICAgICAgICBpbml0Q29uZmlnLmFkZChcbiAgICAgICAgICBlYzIuSW5pdEZpbGUuZnJvbUFzc2V0KFxuICAgICAgICAgICAgYC9zcnYvcnN5bmMtYmFja3VwL3JzeW5jZC4ke20ubmFtZX0uY29uZmAsXG4gICAgICAgICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uL2Fzc2V0cy9yc3luY2QuY29uZlwiKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgaW5pdENvbmZpZy5hZGQoXG4gICAgICAgICAgZWMyLkluaXRDb21tYW5kLmFyZ3ZDb21tYW5kKFtcbiAgICAgICAgICAgIFwiL3Vzci9iaW4vc2VkXCIsXG4gICAgICAgICAgICBcIi1pXCIsXG4gICAgICAgICAgICBgcy9AaG9zdEAvJHttLm5hbWV9L2dgLFxuICAgICAgICAgICAgYC9zcnYvcnN5bmMtYmFja3VwL3JzeW5jZC4ke20ubmFtZX0uY29uZmAsXG4gICAgICAgICAgXSlcbiAgICAgICAgKTtcbiAgICAgICAgaW5pdENvbmZpZy5hZGQoXG4gICAgICAgICAgZWMyLkluaXRDb21tYW5kLnNoZWxsQ29tbWFuZChcbiAgICAgICAgICAgIGBlY2hvICduby1wb3J0LWZvcndhcmRpbmcsbm8tYWdlbnQtZm9yd2FyZGluZyxuby1YMTEtZm9yd2FyZGluZyxjb21tYW5kPVwicnN5bmMtYmFja3VwICR7bS5uYW1lfSAke20uc2l6ZX0gL2Rldi9zZCR7ZGV2aWNlfVwiICR7bS5zc2hLZXl9JyA+PiAvcm9vdC8uc3NoL2F1dGhvcml6ZWRfa2V5c2BcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGluaXRDb25maWcuYWRkKFxuICAgICAgICBlYzIuSW5pdEZpbGUuZnJvbUFzc2V0KFxuICAgICAgICAgIFwiL3Nydi9yc3luYy1iYWNrdXAvcnN5bmNkLmJhY2t1cC5jb25mXCIsXG4gICAgICAgICAgcGF0aC5qb2luKF9fZGlybmFtZSwgXCIuLi9hc3NldHMvcnN5bmNkLmNvbmZcIilcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIGluaXRDb25maWcuYWRkKFxuICAgICAgICBlYzIuSW5pdENvbW1hbmQuYXJndkNvbW1hbmQoW1xuICAgICAgICAgIFwiL3Vzci9iaW4vc2VkXCIsXG4gICAgICAgICAgXCItaVwiLFxuICAgICAgICAgIGBzL0Bob3N0QC9iYWNrdXAvZ2AsXG4gICAgICAgICAgYC9zcnYvcnN5bmMtYmFja3VwL3JzeW5jZC5iYWNrdXAuY29uZmAsXG4gICAgICAgIF0pXG4gICAgICApO1xuICAgICAgaW5pdENvbmZpZy5hZGQoXG4gICAgICAgIGVjMi5Jbml0Q29tbWFuZC5hcmd2Q29tbWFuZChbXG4gICAgICAgICAgXCIvdXNyL2Jpbi9zZWRcIixcbiAgICAgICAgICBcIi1pXCIsXG4gICAgICAgICAgJ3N8Y29tbWFuZD1cIi4qXCIgfGNvbW1hbmQ9XCJyc3luYy1iYWNrdXAgYmFja3VwIDEwMCAvZGV2L3NkYlwiIHwnLFxuICAgICAgICAgIFwiL3Jvb3QvLnNzaC9hdXRob3JpemVkX2tleXNcIixcbiAgICAgICAgXSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5pdCA9ICgoKSA9PiB7XG4gICAgICBpZiAocHJvcHMuaW5pdCkge1xuICAgICAgICBwcm9wcy5pbml0LmFkZENvbmZpZyhcInJzeW5jQmFja3VwXCIsIGluaXRDb25maWcpO1xuICAgICAgICByZXR1cm4gcHJvcHMuaW5pdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBlYzIuQ2xvdWRGb3JtYXRpb25Jbml0LmZyb21Db25maWcoaW5pdENvbmZpZyk7XG4gICAgICB9XG4gICAgfSkoKTtcblxuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IGVjMi5JbnN0YW5jZSh0aGlzLCBwcm9wcy5pbnN0YW5jZUlkIHx8IFwiUnN5bmNCYWNrdXBcIiwge1xuICAgICAgdnBjLFxuICAgICAgaW5zdGFuY2VUeXBlOiBlYzIuSW5zdGFuY2VUeXBlLm9mKFxuICAgICAgICBlYzIuSW5zdGFuY2VDbGFzcy5UNEcsXG4gICAgICAgIGVjMi5JbnN0YW5jZVNpemUuTkFOT1xuICAgICAgKSxcbiAgICAgIG1hY2hpbmVJbWFnZTogYW1pLFxuICAgICAgc2VjdXJpdHlHcm91cDogc2VjdXJpdHlHcm91cCxcbiAgICAgIGtleU5hbWU6IGtleU5hbWUsXG4gICAgICByb2xlOiByb2xlLFxuICAgICAgaW5pdDogaW5pdCxcbiAgICB9KTtcbiAgfVxufVxuIl19
|
package/package.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@anyakichi/cdk-rsync-backup",
|
|
3
|
+
"description": "AWS CDK L3 construct for cloud backup system with rsync",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"author": "INAJIMA Daisuke <inajima@gmail.com>",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"build": "tsc",
|
|
8
|
+
"format": "prettier --ignore-path .gitignore -w package.json lib",
|
|
9
|
+
"test": "jest",
|
|
10
|
+
"watch": "tsc -w"
|
|
11
|
+
},
|
|
12
|
+
"types": "lib/index.d.ts",
|
|
13
|
+
"main": "lib/index.js",
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"cdk-ec2-key-pair": "^3.3.1",
|
|
16
|
+
"prettier": "^2.7.1"
|
|
17
|
+
},
|
|
18
|
+
"peerDependencies": {
|
|
19
|
+
"aws-cdk-lib": "2.42.1",
|
|
20
|
+
"constructs": "^10.0.0"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@trivago/prettier-plugin-sort-imports": "^3.3.0",
|
|
24
|
+
"@types/jest": "^27.5.2",
|
|
25
|
+
"@types/node": "10.17.27",
|
|
26
|
+
"@types/prettier": "2.6.0",
|
|
27
|
+
"aws-cdk-lib": "2.42.1",
|
|
28
|
+
"constructs": "^10.0.0",
|
|
29
|
+
"jest": "^27.5.1",
|
|
30
|
+
"prettier-plugin-fixpack": "^0.1.0",
|
|
31
|
+
"ts-jest": "^27.1.4",
|
|
32
|
+
"typescript": "~3.9.7"
|
|
33
|
+
},
|
|
34
|
+
"homepage": "https://github.com/anyakichi/cdk-rsync-backup",
|
|
35
|
+
"repository": "https://github.com/anyakichi/cdk-rsync-backup",
|
|
36
|
+
"license": "MIT"
|
|
37
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// import * as cdk from 'aws-cdk-lib';
|
|
3
|
+
// import { Template } from 'aws-cdk-lib/assertions';
|
|
4
|
+
// import * as CdkRsyncBackup from '../lib/index';
|
|
5
|
+
// example test. To run these tests, uncomment this file along with the
|
|
6
|
+
// example resource in lib/index.ts
|
|
7
|
+
test('SQS Queue Created', () => {
|
|
8
|
+
// const app = new cdk.App();
|
|
9
|
+
// const stack = new cdk.Stack(app, "TestStack");
|
|
10
|
+
// // WHEN
|
|
11
|
+
// new CdkRsyncBackup.CdkRsyncBackup(stack, 'MyTestConstruct');
|
|
12
|
+
// // THEN
|
|
13
|
+
// const template = Template.fromStack(stack);
|
|
14
|
+
// template.hasResourceProperties('AWS::SQS::Queue', {
|
|
15
|
+
// VisibilityTimeout: 300
|
|
16
|
+
// });
|
|
17
|
+
});
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLXJzeW5jLWJhY2t1cC50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2RrLXJzeW5jLWJhY2t1cC50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxzQ0FBc0M7QUFDdEMscURBQXFEO0FBQ3JELGtEQUFrRDtBQUVsRCx1RUFBdUU7QUFDdkUsbUNBQW1DO0FBQ25DLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLEVBQUU7SUFDL0IsK0JBQStCO0lBQy9CLG1EQUFtRDtJQUNuRCxZQUFZO0lBQ1osaUVBQWlFO0lBQ2pFLFlBQVk7SUFDWixnREFBZ0Q7SUFFaEQsd0RBQXdEO0lBQ3hELDZCQUE2QjtJQUM3QixRQUFRO0FBQ1IsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBpbXBvcnQgKiBhcyBjZGsgZnJvbSAnYXdzLWNkay1saWInO1xuLy8gaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hc3NlcnRpb25zJztcbi8vIGltcG9ydCAqIGFzIENka1JzeW5jQmFja3VwIGZyb20gJy4uL2xpYi9pbmRleCc7XG5cbi8vIGV4YW1wbGUgdGVzdC4gVG8gcnVuIHRoZXNlIHRlc3RzLCB1bmNvbW1lbnQgdGhpcyBmaWxlIGFsb25nIHdpdGggdGhlXG4vLyBleGFtcGxlIHJlc291cmNlIGluIGxpYi9pbmRleC50c1xudGVzdCgnU1FTIFF1ZXVlIENyZWF0ZWQnLCAoKSA9PiB7XG4vLyAgIGNvbnN0IGFwcCA9IG5ldyBjZGsuQXBwKCk7XG4vLyAgIGNvbnN0IHN0YWNrID0gbmV3IGNkay5TdGFjayhhcHAsIFwiVGVzdFN0YWNrXCIpO1xuLy8gICAvLyBXSEVOXG4vLyAgIG5ldyBDZGtSc3luY0JhY2t1cC5DZGtSc3luY0JhY2t1cChzdGFjaywgJ015VGVzdENvbnN0cnVjdCcpO1xuLy8gICAvLyBUSEVOXG4vLyAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcblxuLy8gICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6U1FTOjpRdWV1ZScsIHtcbi8vICAgICBWaXNpYmlsaXR5VGltZW91dDogMzAwXG4vLyAgIH0pO1xufSk7XG4iXX0=
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2018",
|
|
4
|
+
"module": "commonjs",
|
|
5
|
+
"lib": [
|
|
6
|
+
"es2018"
|
|
7
|
+
],
|
|
8
|
+
"declaration": true,
|
|
9
|
+
"strict": true,
|
|
10
|
+
"noImplicitAny": true,
|
|
11
|
+
"strictNullChecks": true,
|
|
12
|
+
"noImplicitThis": true,
|
|
13
|
+
"alwaysStrict": true,
|
|
14
|
+
"noUnusedLocals": false,
|
|
15
|
+
"noUnusedParameters": false,
|
|
16
|
+
"noImplicitReturns": true,
|
|
17
|
+
"noFallthroughCasesInSwitch": false,
|
|
18
|
+
"inlineSourceMap": true,
|
|
19
|
+
"inlineSources": true,
|
|
20
|
+
"experimentalDecorators": true,
|
|
21
|
+
"strictPropertyInitialization": false,
|
|
22
|
+
"typeRoots": [
|
|
23
|
+
"./node_modules/@types"
|
|
24
|
+
]
|
|
25
|
+
},
|
|
26
|
+
"exclude": [
|
|
27
|
+
"node_modules",
|
|
28
|
+
"cdk.out"
|
|
29
|
+
]
|
|
30
|
+
}
|