@infodb/lctl 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.
Files changed (43) hide show
  1. package/README.md +245 -0
  2. package/bin/cli.js +3 -0
  3. package/dist/commands/delete.d.ts +7 -0
  4. package/dist/commands/delete.d.ts.map +1 -0
  5. package/dist/commands/delete.js +23 -0
  6. package/dist/commands/delete.js.map +1 -0
  7. package/dist/commands/deploy.d.ts +11 -0
  8. package/dist/commands/deploy.d.ts.map +1 -0
  9. package/dist/commands/deploy.js +98 -0
  10. package/dist/commands/deploy.js.map +1 -0
  11. package/dist/commands/export.d.ts +12 -0
  12. package/dist/commands/export.d.ts.map +1 -0
  13. package/dist/commands/export.js +50 -0
  14. package/dist/commands/export.js.map +1 -0
  15. package/dist/commands/info.d.ts +7 -0
  16. package/dist/commands/info.d.ts.map +1 -0
  17. package/dist/commands/info.js +48 -0
  18. package/dist/commands/info.js.map +1 -0
  19. package/dist/index.d.ts +3 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +73 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/utils/aws-cli.d.ts +35 -0
  24. package/dist/utils/aws-cli.d.ts.map +1 -0
  25. package/dist/utils/aws-cli.js +196 -0
  26. package/dist/utils/aws-cli.js.map +1 -0
  27. package/dist/utils/config.d.ts +41 -0
  28. package/dist/utils/config.d.ts.map +1 -0
  29. package/dist/utils/config.js +119 -0
  30. package/dist/utils/config.js.map +1 -0
  31. package/dist/utils/logger.d.ts +11 -0
  32. package/dist/utils/logger.d.ts.map +1 -0
  33. package/dist/utils/logger.js +42 -0
  34. package/dist/utils/logger.js.map +1 -0
  35. package/dist/utils/script-generator.d.ts +19 -0
  36. package/dist/utils/script-generator.d.ts.map +1 -0
  37. package/dist/utils/script-generator.js +205 -0
  38. package/dist/utils/script-generator.js.map +1 -0
  39. package/dist/utils/zip.d.ts +9 -0
  40. package/dist/utils/zip.d.ts.map +1 -0
  41. package/dist/utils/zip.js +122 -0
  42. package/dist/utils/zip.js.map +1 -0
  43. package/package.json +42 -0
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ScriptGenerator = void 0;
7
+ const fs_1 = require("fs");
8
+ const path_1 = __importDefault(require("path"));
9
+ class ScriptGenerator {
10
+ constructor(logger) {
11
+ this.logger = logger;
12
+ }
13
+ generateDeployScript(functionName, config) {
14
+ const script = `#!/bin/bash
15
+ set -eu
16
+
17
+ # Generated by lctl - Lambda Control Tool
18
+ # Function: ${functionName}
19
+ # Generated at: ${new Date().toISOString()}
20
+
21
+ ${this.generateEnvironmentSection(config)}${this.generateZipSection(config)}${this.generateEnvironmentVariablesSection(config)}${this.generateLayersSection(config)}# Lambda関数の存在を確認
22
+ if aws lambda get-function --function-name ${functionName} &> /dev/null; then
23
+ echo "Updating existing Lambda function: ${functionName}"
24
+ aws lambda update-function-code --function-name ${functionName} --zip-file fileb://lambda.zip | jq .
25
+
26
+ # 設定の更新
27
+ aws lambda update-function-configuration --function-name ${functionName} \\
28
+ --runtime ${config.runtime} \\
29
+ --handler ${config.handler} \\
30
+ --role ${config.role} \\
31
+ --timeout ${config.timeout || 3} \\
32
+ --memory-size ${config.memory || 128} \\
33
+ --architectures ${config.architecture || 'x86_64'}${this.generateEnvironmentVariablesFlag(config)}${this.generateLayersFlag(config)} | jq .
34
+
35
+ ${this.generateAdditionalConfigurationCommands(functionName, config)}
36
+
37
+ rm lambda.zip
38
+ exit 0
39
+ fi
40
+
41
+ echo "Creating new Lambda function: ${functionName}"
42
+ aws lambda create-function --function-name ${functionName} \\
43
+ --zip-file fileb://lambda.zip \\
44
+ --handler ${config.handler} \\
45
+ --runtime ${config.runtime} \\
46
+ --architectures ${config.architecture || 'x86_64'} \\
47
+ --timeout ${config.timeout || 3} \\
48
+ --memory-size ${config.memory || 128} \\
49
+ --role ${config.role}${this.generateEnvironmentVariablesFlag(config)}${this.generateLayersFlag(config)}${this.generateDescriptionFlag(config)} | jq .
50
+
51
+ ${this.generateAdditionalConfigurationCommands(functionName, config)}
52
+
53
+ ${this.generateLogGroupSection(functionName, config)}
54
+
55
+ rm lambda.zip
56
+
57
+ echo "✅ Lambda function ${functionName} deployed successfully!"
58
+ `;
59
+ return script;
60
+ }
61
+ generateEnvironmentSection(config) {
62
+ return '';
63
+ }
64
+ generateZipSection(config) {
65
+ let section = '# Create deployment package\n';
66
+ if (config.files && config.files.length > 0) {
67
+ // Custom file list
68
+ section += 'echo "Creating deployment package..."\n';
69
+ section += 'rm -f lambda.zip\n';
70
+ for (const file of config.files) {
71
+ if (file.includes('*')) {
72
+ // Glob pattern - use find for bash compatibility
73
+ section += `find . -path "${file}" -type f | zip -@ lambda.zip\n`;
74
+ }
75
+ else {
76
+ section += `zip -r lambda.zip "${file}"\n`;
77
+ }
78
+ }
79
+ }
80
+ else {
81
+ // Default: zip current directory with excludes from config
82
+ section += 'echo "Creating deployment package from current directory..."\n';
83
+ const excludes = config.zip_excludes || ['*.git*', 'node_modules/*', '*.zip', 'dist/*', '.DS_Store'];
84
+ const excludeArgs = excludes.map(exclude => `"${exclude}"`).join(' ');
85
+ section += `zip -r lambda.zip . -x ${excludeArgs}\n`;
86
+ }
87
+ section += '\n';
88
+ return section;
89
+ }
90
+ generateEnvironmentVariablesSection(config) {
91
+ if (!config.environment || Object.keys(config.environment).length === 0) {
92
+ return '';
93
+ }
94
+ let section = '# Environment Variables\n';
95
+ section += 'ENVIRON="Variables={"\n';
96
+ const envVars = Object.entries(config.environment);
97
+ envVars.forEach(([key, value], index) => {
98
+ section += `ENVIRON+="${key}=${value}`;
99
+ if (index < envVars.length - 1) {
100
+ section += ',';
101
+ }
102
+ section += '"\n';
103
+ });
104
+ section += 'ENVIRON+="}"\n\n';
105
+ return section;
106
+ }
107
+ generateLayersSection(config) {
108
+ if (!config.layers || config.layers.length === 0) {
109
+ return '';
110
+ }
111
+ let section = '# Layers\n';
112
+ section += `LAYERS="${config.layers.join(' ')}"\n\n`;
113
+ return section;
114
+ }
115
+ generateEnvironmentVariablesFlag(config) {
116
+ if (!config.environment || Object.keys(config.environment).length === 0) {
117
+ return '';
118
+ }
119
+ return ' \\\n --environment "$ENVIRON"';
120
+ }
121
+ generateLayersFlag(config) {
122
+ if (!config.layers || config.layers.length === 0) {
123
+ return '';
124
+ }
125
+ return ' \\\n --layers $LAYERS';
126
+ }
127
+ generateDescriptionFlag(config) {
128
+ if (!config.description) {
129
+ return '';
130
+ }
131
+ return ` \\\n --description "${config.description}"`;
132
+ }
133
+ generateAdditionalConfigurationCommands(functionName, config) {
134
+ let commands = '';
135
+ // Reserved concurrency
136
+ if (config.reserved_concurrency !== undefined) {
137
+ commands += `\n# Set reserved concurrency\n`;
138
+ commands += `aws lambda put-reserved-concurrency-capacity --function-name ${functionName} --reserved-concurrency-capacity ${config.reserved_concurrency} | jq .\n`;
139
+ }
140
+ // VPC configuration
141
+ if (config.vpc) {
142
+ commands += `\n# Update VPC configuration\n`;
143
+ commands += `aws lambda update-function-configuration --function-name ${functionName} \\
144
+ --vpc-config "SubnetIds=${config.vpc.subnets.join(',')},SecurityGroupIds=${config.vpc.security_groups.join(',')}" | jq .\n`;
145
+ }
146
+ // Dead letter queue
147
+ if (config.dead_letter_queue) {
148
+ commands += `\n# Set dead letter queue\n`;
149
+ commands += `aws lambda update-function-configuration --function-name ${functionName} \\
150
+ --dead-letter-config "TargetArn=${config.dead_letter_queue.target_arn}" | jq .\n`;
151
+ }
152
+ // Ephemeral storage
153
+ if (config.ephemeral_storage) {
154
+ commands += `\n# Set ephemeral storage\n`;
155
+ commands += `aws lambda update-function-configuration --function-name ${functionName} \\
156
+ --ephemeral-storage "Size=${config.ephemeral_storage}" | jq .\n`;
157
+ }
158
+ // Tags
159
+ if (config.tags && Object.keys(config.tags).length > 0) {
160
+ commands += `\n# Set tags\n`;
161
+ const tags = Object.entries(config.tags)
162
+ .map(([key, value]) => `${key}=${value}`)
163
+ .join(',');
164
+ commands += `aws lambda tag-resource --resource "\$(aws lambda get-function --function-name ${functionName} --query 'Configuration.FunctionArn' --output text)" --tags ${tags} | jq .\n`;
165
+ }
166
+ return commands;
167
+ }
168
+ generateLogGroupSection(functionName, config) {
169
+ let section = '';
170
+ // Only create log group if auto_create_log_group is true (default)
171
+ if (config.auto_create_log_group !== false) {
172
+ section += `
173
+ # ロググループが存在しなければ作成する
174
+ if ! aws logs describe-log-groups \\
175
+ --log-group-name-prefix /aws/lambda/${functionName} \\
176
+ --query "logGroups[?logGroupName=='/aws/lambda/${functionName}'].logGroupName" \\
177
+ --output text | grep -q "^/aws/lambda/${functionName}$"; then
178
+ echo "Creating log group for ${functionName}"
179
+ aws logs create-log-group --log-group-name /aws/lambda/${functionName} | jq .
180
+ fi
181
+
182
+ # ログ保持期間を設定
183
+ aws logs put-retention-policy --log-group-name /aws/lambda/${functionName} --retention-in-days ${config.log_retention_days || 7} | jq .
184
+ `;
185
+ }
186
+ return section;
187
+ }
188
+ async saveScript(outputPath, script) {
189
+ const scriptPath = path_1.default.resolve(outputPath);
190
+ await fs_1.promises.writeFile(scriptPath, script, { mode: 0o755 });
191
+ this.logger.verbose(`Deploy script saved: ${scriptPath}`);
192
+ return scriptPath;
193
+ }
194
+ async cleanupScript(scriptPath) {
195
+ try {
196
+ await fs_1.promises.unlink(scriptPath);
197
+ this.logger.verbose(`Cleaned up script: ${scriptPath}`);
198
+ }
199
+ catch (error) {
200
+ this.logger.verbose(`Failed to clean up script: ${scriptPath}`);
201
+ }
202
+ }
203
+ }
204
+ exports.ScriptGenerator = ScriptGenerator;
205
+ //# sourceMappingURL=script-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"script-generator.js","sourceRoot":"","sources":["../../src/utils/script-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Logger } from './logger';
2
+ export declare class ZipManager {
3
+ private logger;
4
+ constructor(logger: Logger);
5
+ createZip(functionName: string, files?: string[]): Promise<string>;
6
+ private addFilesToArchive;
7
+ cleanup(zipPath: string): Promise<void>;
8
+ }
9
+ //# sourceMappingURL=zip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip.d.ts","sourceRoot":"","sources":["../../src/utils/zip.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGlC,qBAAa,UAAU;IACT,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAE5B,SAAS,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,EAAU,GAAG,OAAO,CAAC,MAAM,CAAC;YAiCjE,iBAAiB;IAuCzB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAQ9C"}
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.ZipManager = void 0;
40
+ const fs = __importStar(require("fs/promises"));
41
+ const path = __importStar(require("path"));
42
+ const archiver_1 = __importDefault(require("archiver"));
43
+ const glob_1 = require("glob");
44
+ const fs_1 = require("fs");
45
+ class ZipManager {
46
+ constructor(logger) {
47
+ this.logger = logger;
48
+ }
49
+ async createZip(functionName, files = ['.']) {
50
+ const zipPath = path.join(process.cwd(), `${functionName}-deploy.zip`);
51
+ this.logger.verbose(`Creating ZIP file: ${zipPath}`);
52
+ const output = (0, fs_1.createWriteStream)(zipPath);
53
+ const archive = (0, archiver_1.default)('zip', { zlib: { level: 9 } });
54
+ return new Promise(async (resolve, reject) => {
55
+ output.on('close', () => {
56
+ this.logger.verbose(`ZIP file created: ${archive.pointer()} bytes`);
57
+ resolve(zipPath);
58
+ });
59
+ archive.on('error', (err) => {
60
+ reject(err);
61
+ });
62
+ archive.pipe(output);
63
+ try {
64
+ // Add files to archive
65
+ for (const filePattern of files) {
66
+ await this.addFilesToArchive(archive, filePattern);
67
+ }
68
+ await archive.finalize();
69
+ }
70
+ catch (error) {
71
+ reject(error);
72
+ }
73
+ });
74
+ }
75
+ async addFilesToArchive(archive, filePattern) {
76
+ const isGlobPattern = filePattern.includes('*') || filePattern.includes('?');
77
+ if (isGlobPattern) {
78
+ // Handle glob patterns
79
+ const matches = await (0, glob_1.glob)(filePattern, {
80
+ cwd: process.cwd(),
81
+ ignore: ['node_modules/**', '.git/**', '*.zip', 'dist/**']
82
+ });
83
+ for (const match of matches) {
84
+ const fullPath = path.join(process.cwd(), match);
85
+ const stat = await fs.stat(fullPath);
86
+ if (stat.isFile()) {
87
+ archive.file(fullPath, { name: match });
88
+ this.logger.verbose(`Added file: ${match}`);
89
+ }
90
+ }
91
+ }
92
+ else {
93
+ // Handle direct file/directory paths
94
+ const fullPath = path.join(process.cwd(), filePattern);
95
+ try {
96
+ const stat = await fs.stat(fullPath);
97
+ if (stat.isFile()) {
98
+ archive.file(fullPath, { name: filePattern });
99
+ this.logger.verbose(`Added file: ${filePattern}`);
100
+ }
101
+ else if (stat.isDirectory()) {
102
+ archive.directory(fullPath, filePattern === '.' ? false : filePattern);
103
+ this.logger.verbose(`Added directory: ${filePattern}`);
104
+ }
105
+ }
106
+ catch (error) {
107
+ this.logger.warning(`File not found: ${filePattern}`);
108
+ }
109
+ }
110
+ }
111
+ async cleanup(zipPath) {
112
+ try {
113
+ await fs.unlink(zipPath);
114
+ this.logger.verbose(`Cleaned up ZIP file: ${zipPath}`);
115
+ }
116
+ catch (error) {
117
+ this.logger.verbose(`Failed to clean up ZIP file: ${zipPath}`);
118
+ }
119
+ }
120
+ }
121
+ exports.ZipManager = ZipManager;
122
+ //# sourceMappingURL=zip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip.js","sourceRoot":"","sources":["../../src/utils/zip.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@infodb/lctl",
3
+ "version": "0.1.0",
4
+ "description": "AWS Lambda Control Tool - Simple CLI for managing Lambda functions",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "lctl": "./bin/cli.js"
8
+ },
9
+ "keywords": [
10
+ "aws",
11
+ "lambda",
12
+ "cli",
13
+ "deployment",
14
+ "serverless"
15
+ ],
16
+ "author": "",
17
+ "license": "MIT",
18
+ "dependencies": {
19
+ "commander": "^11.1.0",
20
+ "yaml": "^2.3.4",
21
+ "glob": "^10.3.10",
22
+ "archiver": "^6.0.1",
23
+ "chalk": "^5.3.0"
24
+ },
25
+ "devDependencies": {
26
+ "@types/node": "^20.10.5",
27
+ "@types/archiver": "^6.0.2",
28
+ "typescript": "^5.3.3"
29
+ },
30
+ "files": [
31
+ "dist/**/*",
32
+ "bin/**/*"
33
+ ],
34
+ "publishConfig": {
35
+ "access": "public"
36
+ },
37
+ "scripts": {
38
+ "build": "tsc",
39
+ "dev": "tsc --watch",
40
+ "start": "node dist/index.js"
41
+ }
42
+ }