-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
-
26
-
27
-
28
-
29
-
30
-
31
-
32
-
33
-
34
-
35
-
36
-
37
-
38
-
39
-
40
-
41
-
42
-
43
-
44
-
45
-
46
-
47
-
48
-
49
-
50
-
51
-
52
-
53
-
54
-
55
-
56
-
57
-
58
-
59
-
60
-
61
-
62
-
63
-
64
-
65
-
66
-
67
-
68
-
69
-
70
-
71
-
72
-
73
-
74
-
75
-
76
-
77
-
78
-
79
-
80
-
81
-
82
-
83
-
84
-
85
-
86
-
87
-
88
-
89
-
90
-
91
// SPDX-FileCopyrightText: 2024 Shota FUJI <pockawoooh@gmail.com>
// SPDX-License-Identifier: AGPL-3.0-only
import * as zod from "zod";
const DIST_DIR = new URL("../../dist", import.meta.url);
const outputFileSchema = zod.object({
cloudfront_distribution_id: zod.object({
type: zod.literal("string"),
value: zod.string(),
}),
static_file_bucket_name: zod.object({
type: zod.literal("string"),
value: zod.string(),
}),
});
interface TerraformOutput {
bucketName: string;
cfDistributionID: string;
}
async function getTerraformOutput(): Promise<TerraformOutput> {
const output = Bun.spawnSync(["terraform", "output", "-json"], {
stdin: "inherit",
});
const stdout = JSON.parse(await new Response(output.stdout).text());
const result = outputFileSchema.safeParse(stdout);
if (!result.success) {
throw result.error;
}
return {
bucketName: result.data.static_file_bucket_name.value,
cfDistributionID: result.data.cloudfront_distribution_id.value,
};
}
async function deploy(opts: TerraformOutput): Promise<void> {
const s3Sync = Bun.spawnSync(
["aws", "s3", "sync", "--delete", DIST_DIR.pathname, `s3://${opts.bucketName}`],
{
stdin: "inherit",
stdout: "inherit",
stderr: "inherit",
},
);
if (!s3Sync.success) {
throw new Error("aws s3 sync コマンドが異常終了しました");
}
const cfInvalidation = Bun.spawnSync(
[
"aws",
"cloudfront",
"create-invalidation",
"--distribution-id",
opts.cfDistributionID,
"--paths",
"/*",
],
{
stdin: "inherit",
stdout: "inherit",
stderr: "inherit",
},
);
if (!cfInvalidation.success) {
throw new Error("aws cloudfront create-invalidation コマンドが異常終了しました");
}
}
async function main() {
const output = await getTerraformOutput();
await deploy(output);
}
if (import.meta.main) {
try {
main();
} catch (error) {
console.error(error);
process.exit(1);
}
}