From e70b65260c3db5babd879723e255f0ef20dc8834 Mon Sep 17 00:00:00 2001 From: Emil Lerch Date: Mon, 2 Feb 2026 11:05:20 -0800 Subject: [PATCH] upgrade to zig 0.15 / rewrite build tooling as standalone CLI This migrates from zig 0.13 to 0.15.2. In addition to dealing with breaking changes in the build system and standard library APIs, the architecture was changed substantially. We now build a standalone CLI, and use that to execute the commands. This avoids sandboxing issues related to TLS and enables easier testing. The commit also includes a simple zip implementation (store only, single file) which avoids the platform restriction (i.e. this build can now theoretically work on Windows). --- .mise.toml | 5 + .pre-commit-config.yaml | 36 +++++ README.md | 105 +++++++------- build.zig | 120 ++++++++++++---- build.zig.zon | 19 +-- lambdabuild.zig | 256 ++++++++++++++-------------------- lambdabuild/Deploy.zig | 165 ---------------------- lambdabuild/Iam.zig | 146 -------------------- lambdabuild/Invoke.zig | 90 ------------ lambdabuild/Package.zig | 158 --------------------- lambdabuild/Region.zig | 55 -------- lambdabuild/function.zip | Bin 224301 -> 0 bytes src/lambda.zig | 200 +++++++++++++++++---------- tools/build/build.zig | 49 +++++++ tools/build/build.zig.zon | 16 +++ tools/build/src/deploy.zig | 251 ++++++++++++++++++++++++++++++++++ tools/build/src/iam.zig | 148 ++++++++++++++++++++ tools/build/src/invoke.zig | 105 ++++++++++++++ tools/build/src/main.zig | 135 ++++++++++++++++++ tools/build/src/package.zig | 265 ++++++++++++++++++++++++++++++++++++ 20 files changed, 1397 insertions(+), 927 deletions(-) create mode 100644 .mise.toml create mode 100644 .pre-commit-config.yaml delete mode 100644 lambdabuild/Deploy.zig delete mode 100644 lambdabuild/Iam.zig delete mode 100644 lambdabuild/Invoke.zig delete mode 100644 lambdabuild/Package.zig delete mode 100644 lambdabuild/Region.zig delete mode 100644 lambdabuild/function.zip create mode 100644 tools/build/build.zig create mode 100644 tools/build/build.zig.zon create mode 100644 tools/build/src/deploy.zig create mode 100644 tools/build/src/iam.zig create mode 100644 tools/build/src/invoke.zig create mode 100644 tools/build/src/main.zig create mode 100644 tools/build/src/package.zig diff --git a/.mise.toml b/.mise.toml new file mode 100644 index 0000000..5ef8ebd --- /dev/null +++ b/.mise.toml @@ -0,0 +1,5 @@ +[tools] +pre-commit = "4.2.0" +zig = "0.15.2" +zls = "0.15.1" +"ubi:DonIsaac/zlint" = "0.7.6" diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..bdda06f --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,36 @@ +# See https://pre-commit.com for more information +# See https://pre-commit.com/hooks.html for more hooks +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v3.2.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + - id: check-added-large-files + - repo: https://github.com/batmac/pre-commit-zig + rev: v0.3.0 + hooks: + - id: zig-fmt + - repo: local + hooks: + - id: zlint + name: Run zlint + entry: zlint + args: ["--deny-warnings", "--fix"] + language: system + types: [zig] + - repo: https://github.com/batmac/pre-commit-zig + rev: v0.3.0 + hooks: + - id: zig-build + - repo: local + hooks: + - id: test + name: Run zig build test + entry: zig + # args: ["build", "coverage", "-Dcoverage-threshold=80"] + args: ["build", "test"] + language: system + types: [file] + pass_filenames: false diff --git a/README.md b/README.md index dd4429f..a8e502a 100644 --- a/README.md +++ b/README.md @@ -1,70 +1,77 @@ lambda-zig: A Custom Runtime for AWS Lambda =========================================== -This is a sample custom runtime built in zig (0.13). Simple projects will execute -in <1ms, with a cold start init time of approximately 11ms. +This is a custom runtime built in Zig (0.15). Simple projects will +execute in <1ms, with a cold start init time of approximately 11ms. -Some custom build steps have been added to build.zig, which will only currently appear if compiling from a linux operating system: +Custom build steps are available for packaging and deploying Lambda functions: -* `zig build awslambda_iam`: Deploy and record a default IAM role for the lambda function -* `zig build awslambda_package`: Package the lambda function for upload -* `zig build awslambda_deploy`: Deploy the lambda function -* `zig build awslambda_run`: Run the lambda function +* `zig build awslambda_package`: Package the Lambda function into a zip file +* `zig build awslambda_iam`: Create or verify IAM role for the Lambda function +* `zig build awslambda_deploy`: Deploy the Lambda function to AWS +* `zig build awslambda_run`: Invoke the deployed Lambda function -Custom options: +Build options: -* **function-name**: set the name of the AWS Lambda function -* **payload**: Use this to set the payload of the function when run using `zig build awslambda_run` -* **region**: Use this to set the region for the function deployment/run -* **function-role**: Name of the role to use for the function. The system will - look up the arn from this name, and create if it does not exist -* **function-arn**: Role arn to use with the function. This must exist +* **function-name**: Name of the AWS Lambda function +* **payload**: JSON payload for function invocation (used with awslambda_run) +* **region**: AWS region for deployment and invocation +* **profile**: AWS profile to use for credentials +* **role-name**: IAM role name for the function (default: lambda_basic_execution) -The AWS Lambda function can be compiled as a linux x86_64 or linux aarch64 -executable. The build script will set the architecture appropriately +The Lambda function can be compiled for x86_64 or aarch64. The build system +automatically configures the Lambda architecture based on the target. -Caveats: +A sample project using this runtime can be found at +https://git.lerch.org/lobo/lambda-zig-sample -* Building on Windows will not yet work, as the package step still uses - system commands due to the need to create a zip file, and the current lack - of zip file creation capabilities in the standard library (you can read, but - not write, zip files with the standard library). A TODO exists with more - information should you wish to file a PR. - -A sample project using this runtime can be found at https://git.lerch.org/lobo/lambda-zig-sample - -Using the zig package manager +Using the Zig Package Manager ----------------------------- -The zig package manager [works just fine](https://github.com/ziglang/zig/issues/14279) -in build.zig, which works well for use of this runtime. +To add Lambda package/deployment steps to another project: -To add lambda package/deployment steps to another project: +1. Fetch the dependency: -1. `zig build init-exe` -2. Add a `build.zig.zon` similar to the below -3. Add a line to build.zig to add necessary build options, etc. Not the build function - return type should be changed from `void` to `!void` - -`build.zig`: - -```zig -try @import("lambda-zig").lambdaBuildOptions(b, exe); +```sh +zig fetch --save git+https://git.lerch.org/lobo/lambda-zig ``` -`build.zig.zon`: +2. Update your `build.zig`: ```zig -.{ - .name = "lambda-zig", - .version = "0.1.0", - .dependencies = .{ - .@"lambda-zig" = .{ - .url = "https://git.lerch.org/lobo/lambda-zig/archive/fa13a08c4d91034a9b19d85f8c4c0af4cedaa67e.tar.gz", - .hash = "122037c357f834ffddf7b3a514f55edd5a4d7a3cde138a4021b6ac51be8fd2926000", - }, - }, +const std = @import("std"); +const lambda_zig = @import("lambda_zig"); + +pub fn build(b: *std.Build) !void { + const target = b.standardTargetOptions(.{}); + const optimize = b.standardOptimizeOption(.{}); + + // Get lambda-zig dependency + const lambda_zig_dep = b.dependency("lambda_zig", .{ + .target = target, + .optimize = optimize, + }); + + const exe_module = b.createModule(.{ + .root_source_file = b.path("src/main.zig"), + .target = target, + .optimize = optimize, + }); + + // Add lambda runtime to your module + exe_module.addImport("aws_lambda_runtime", lambda_zig_dep.module("lambda_runtime")); + + const exe = b.addExecutable(.{ + .name = "bootstrap", + .root_module = exe_module, + }); + + b.installArtifact(exe); + + // Add Lambda build steps + try lambda_zig.configureBuild(b, lambda_zig_dep, exe); } ``` -That's it! Now you should have the 4 custom build steps +Note: The build function return type must be `!void` or catch/deal with errors +to support the Lambda build integration. diff --git a/build.zig b/build.zig index 4aba367..e05aba9 100644 --- a/build.zig +++ b/build.zig @@ -1,4 +1,5 @@ const std = @import("std"); +const builtin = @import("builtin"); // Although this function looks imperative, note that its job is to // declaratively construct a build graph that will be executed by an external @@ -15,15 +16,20 @@ pub fn build(b: *std.Build) !void { // set a preferred release mode, allowing the user to decide how to optimize. const optimize = b.standardOptimizeOption(.{}); - const lib = b.addStaticLibrary(.{ - .name = "lambda-zig", - // In this case the main source file is merely a path, however, in more - // complicated build scripts, this could be a generated file. + // Create a module for lambda.zig + const lambda_module = b.createModule(.{ .root_source_file = b.path("src/lambda.zig"), .target = target, .optimize = optimize, }); + const lib = b.addLibrary(.{ + .name = "lambda-zig", + .linkage = .static, + .root_module = lambda_module, + }); + + // Export the module for other packages to use _ = b.addModule("lambda_runtime", .{ .root_source_file = b.path("src/lambda.zig"), .target = target, @@ -37,12 +43,17 @@ pub fn build(b: *std.Build) !void { // Creates a step for unit testing. This only builds the test executable // but does not run it. - const main_tests = b.addTest(.{ + const test_module = b.createModule(.{ .root_source_file = b.path("src/lambda.zig"), .target = target, .optimize = optimize, }); + const main_tests = b.addTest(.{ + .name = "test", + .root_module = test_module, + }); + const run_main_tests = b.addRunArtifact(main_tests); // This creates a build step. It will be visible in the `zig build --help` menu, @@ -51,38 +62,95 @@ pub fn build(b: *std.Build) !void { const test_step = b.step("test", "Run library tests"); test_step.dependOn(&run_main_tests.step); - const exe = b.addExecutable(.{ - .name = "custom", + // Create executable module + const exe_module = b.createModule(.{ .root_source_file = b.path("src/sample-main.zig"), .target = target, .optimize = optimize, }); + const exe = b.addExecutable(.{ + .name = "custom", + .root_module = exe_module, + }); + b.installArtifact(exe); - try lambdaBuildOptions(b, exe); + try configureBuildInternal(b, exe); } -/// lambdaBuildOptions will add three build options to the build (if compiling -/// the code on a Linux host): +/// Internal version of configureBuild for lambda-zig's own build. /// -/// * package: Packages the function for deployment to Lambda -/// (dependencies are the zip executable and a shell) -/// * iam: Gets an IAM role for the Lambda function, and creates it if it does not exist -/// (dependencies are the AWS CLI, grep and a shell) -/// * deploy: Deploys the lambda function to a live AWS environment -/// (dependencies are the AWS CLI, and a shell) -/// * remoterun: Runs the lambda function in a live AWS environment -/// (dependencies are the AWS CLI, and a shell) +/// Both this and configureBuild do the same thing, but resolve the lambda_build +/// dependency differently: /// -/// remoterun depends on deploy -/// deploy depends on iam and package +/// - Here: we call `b.dependency("lambda_build", ...)` directly since `b` is +/// lambda-zig's own Build context, which has lambda_build in its build.zig.zon /// -/// iam and package do not have any dependencies -pub fn lambdaBuildOptions(b: *std.Build, exe: *std.Build.Step.Compile) !void { - const function_name = b.option([]const u8, "function-name", "Function name for Lambda [zig-fn]") orelse "zig-fn"; - try @import("lambdabuild.zig").configureBuild(b, exe, function_name); +/// - configureBuild: consumers pass in their lambda_zig dependency, and we use +/// `lambda_zig_dep.builder.dependency("lambda_build", ...)` to resolve it from +/// lambda-zig's build.zig.zon rather than the consumer's +/// +/// This avoids requiring consumers to declare lambda_build as a transitive +/// dependency in their own build.zig.zon. +fn configureBuildInternal(b: *std.Build, exe: *std.Build.Step.Compile) !void { + // When called from lambda-zig's own build, use local dependency + const lambda_build_dep = b.dependency("lambda_build", .{ + .target = b.graph.host, + .optimize = .ReleaseSafe, + }); + try @import("lambdabuild.zig").configureBuild(b, lambda_build_dep, exe); } -pub fn configureBuild(b: *std.Build, exe: *std.Build.Step.Compile, function_name: []const u8) !void { - try @import("lambdabuild.zig").configureBuild(b, exe, function_name); +/// Configure Lambda build steps for a Zig project. +/// +/// This function adds build steps and options for packaging and deploying +/// Lambda functions to AWS. The `lambda_zig_dep` parameter must be the +/// dependency object obtained from `b.dependency("lambda_zig", ...)`. +/// +/// ## Build Steps +/// +/// The following build steps are added: +/// +/// - `awslambda_package`: Package the executable into a Lambda deployment zip +/// - `awslambda_iam`: Create or verify the IAM role for the Lambda function +/// - `awslambda_deploy`: Deploy the function to AWS Lambda (depends on package) +/// - `awslambda_run`: Invoke the deployed function (depends on deploy) +/// +/// ## Build Options +/// +/// The following options are added to the build: +/// +/// - `-Dfunction-name=[string]`: Name of the Lambda function (default: "zig-fn") +/// - `-Dregion=[string]`: AWS region for deployment and invocation +/// - `-Dprofile=[string]`: AWS profile to use for credentials +/// - `-Drole-name=[string]`: IAM role name (default: "lambda_basic_execution") +/// - `-Dpayload=[string]`: JSON payload for invocation (default: "{}") +/// +/// ## Example +/// +/// ```zig +/// const lambda_zig = @import("lambda_zig"); +/// +/// pub fn build(b: *std.Build) !void { +/// const target = b.standardTargetOptions(.{}); +/// const optimize = b.standardOptimizeOption(.{}); +/// +/// const lambda_zig_dep = b.dependency("lambda_zig", .{ +/// .target = target, +/// .optimize = optimize, +/// }); +/// +/// const exe = b.addExecutable(.{ ... }); +/// b.installArtifact(exe); +/// +/// try lambda_zig.configureBuild(b, lambda_zig_dep, exe); +/// } +/// ``` +pub fn configureBuild(b: *std.Build, lambda_zig_dep: *std.Build.Dependency, exe: *std.Build.Step.Compile) !void { + // Get lambda_build from the lambda_zig dependency's Build context + const lambda_build_dep = lambda_zig_dep.builder.dependency("lambda_build", .{ + .target = b.graph.host, + .optimize = .ReleaseSafe, + }); + try @import("lambdabuild.zig").configureBuild(b, lambda_build_dep, exe); } diff --git a/build.zig.zon b/build.zig.zon index 81d44b2..51c1e07 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -1,20 +1,15 @@ .{ - .name = "lambda-zig", + .name = .lambda_zig, // This is a [Semantic Version](https://semver.org/). // In a future version of Zig it will be used for package deduplication. - .version = "0.0.0", - - // This field is optional. - // This is currently advisory only; Zig does not yet do anything - // with this value. + .version = "0.1.0", + .fingerprint = 0xae58341fff376efc, + .minimum_zig_version = "0.15.2", .dependencies = .{ - .aws = .{ - .url = "https://git.lerch.org/api/packages/lobo/generic/aws-sdk-with-models/908c9d2d429b1f38c835363db566aa17bf1742fd/908c9d2d429b1f38c835363db566aa17bf1742fd-with-models.tar.gz", - .hash = "122022770a177afb2ee46632f88ad5468a5dea8df22170d1dea5163890b0a881399d", + .lambda_build = .{ + .path = "tools/build", }, }, - .minimum_zig_version = "0.12.0", - // Specifies the set of files and directories that are included in this package. // Only files and directories listed here are included in the `hash` that // is computed for this package. @@ -26,7 +21,7 @@ "build.zig.zon", "lambdabuild.zig", "src", - "lambdabuild", + "tools", "LICENSE", "README.md", }, diff --git a/lambdabuild.zig b/lambdabuild.zig index d21a967..03b1e4f 100644 --- a/lambdabuild.zig +++ b/lambdabuild.zig @@ -1,168 +1,112 @@ +//! Lambda Build Integration for Zig Build System +//! +//! This module provides build steps for packaging and deploying Lambda functions. +//! It builds the lambda-build CLI tool and invokes it for each operation. + const std = @import("std"); -const builtin = @import("builtin"); -const Package = @import("lambdabuild/Package.zig"); -const Iam = @import("lambdabuild/Iam.zig"); -const Deploy = @import("lambdabuild/Deploy.zig"); -const Invoke = @import("lambdabuild/Invoke.zig"); -fn fileExists(file_name: []const u8) bool { - const file = std.fs.openFileAbsolute(file_name, .{}) catch return false; - defer file.close(); - return true; -} -fn addArgs(allocator: std.mem.Allocator, original: []const u8, args: [][]const u8) ![]const u8 { - var rc = original; - for (args) |arg| { - rc = try std.mem.concat(allocator, u8, &.{ rc, " ", arg }); - } - return rc; -} - -/// lambdaBuildSteps will add four build steps to the build (if compiling -/// the code on a Linux host): +/// Configure Lambda build steps for a Zig project. /// -/// * awslambda_package: Packages the function for deployment to Lambda -/// (dependencies are the zip executable and a shell) -/// * awslambda_iam: Gets an IAM role for the Lambda function, and creates it if it does not exist -/// (dependencies are the AWS CLI, grep and a shell) -/// * awslambda_deploy: Deploys the lambda function to a live AWS environment -/// (dependencies are the AWS CLI, and a shell) -/// * awslambda_run: Runs the lambda function in a live AWS environment -/// (dependencies are the AWS CLI, and a shell) -/// -/// awslambda_run depends on deploy -/// awslambda_deploy depends on iam and package -/// -/// iam and package do not have any dependencies -pub fn configureBuild(b: *std.Build, exe: *std.Build.Step.Compile, function_name: []const u8) !void { - // The rest of this function is currently reliant on the use of Linux - // system being used to build the lambda function - // - // It is likely that much of this will work on other Unix-like OSs, but - // we will work this out later - // - // TODO: support other host OSs - if (builtin.os.tag != .linux) return; +/// Adds the following build steps: +/// - awslambda_package: Package the function into a zip file +/// - awslambda_iam: Create/verify IAM role +/// - awslambda_deploy: Deploy the function to AWS +/// - awslambda_run: Invoke the deployed function +pub fn configureBuild( + b: *std.Build, + lambda_build_dep: *std.Build.Dependency, + exe: *std.Build.Step.Compile, +) !void { + // Get the lambda-build CLI artifact from the dependency + const cli = lambda_build_dep.artifact("lambda-build"); - @import("aws").aws.globalLogControl(.info, .warn, .info, false); - const package_step = Package.create(b, .{ .exe = exe }); - - const step = b.step("awslambda_package", "Package the function"); - step.dependOn(&package_step.step); - package_step.step.dependOn(b.getInstallStep()); - - // Doing this will require that the aws dependency be added to the downstream - // build.zig.zon - // const lambdabuild = b.addExecutable(.{ - // .name = "lambdabuild", - // .root_source_file = .{ - // // we use cwd_relative here because we need to compile this relative - // // to whatever directory this file happens to be. That is likely - // // in a cache directory, not the base of the build. - // .cwd_relative = try std.fs.path.join(b.allocator, &[_][]const u8{ - // std.fs.path.dirname(@src().file).?, - // "lambdabuild/src/main.zig", - // }), - // }, - // .target = b.host, - // }); - // const aws_dep = b.dependency("aws", .{ - // .target = b.host, - // .optimize = lambdabuild.root_module.optimize orelse .Debug, - // }); - // const aws_module = aws_dep.module("aws"); - // lambdabuild.root_module.addImport("aws", aws_module); - // - - const iam_role_name = b.option( + // Get configuration options + const function_name = b.option([]const u8, "function-name", "Function name for Lambda") orelse "zig-fn"; + const region = b.option([]const u8, "region", "AWS region") orelse null; + const profile = b.option([]const u8, "profile", "AWS profile") orelse null; + const role_name = b.option( []const u8, - "function-role", - "IAM role name for function (will create if it does not exist) [lambda_basic_execution]", - ) orelse "lambda_basic_execution_blah2"; - - const iam_role_arn = b.option( + "role-name", + "IAM role name (default: lambda_basic_execution)", + ) orelse "lambda_basic_execution"; + const payload = b.option( []const u8, - "function-arn", - "Preexisting IAM role arn for function", - ); + "payload", + "Lambda invocation payload", + ) orelse "{}"; - const iam = Iam.create(b, .{ - .role_name = iam_role_name, - .role_arn = iam_role_arn, - }); - const iam_step = b.step("awslambda_iam", "Create/Get IAM role for function"); - iam_step.dependOn(&iam.step); - - const region = try b.allocator.create(@import("lambdabuild/Region.zig")); - region.* = .{ - .allocator = b.allocator, - .specified_region = b.option([]const u8, "region", "Region to use [default is autodetect from environment/config]"), + // Determine architecture for Lambda + const target_arch = exe.root_module.resolved_target.?.result.cpu.arch; + const arch_str = blk: { + switch (target_arch) { + .aarch64 => break :blk "aarch64", + .x86_64 => break :blk "x86_64", + else => { + std.log.warn("Unsupported architecture for Lambda: {}, defaulting to x86_64", .{target_arch}); + break :blk "x86_64"; + }, + } }; - // Deployment - const deploy = Deploy.create(b, .{ - .name = function_name, - .arch = exe.root_module.resolved_target.?.result.cpu.arch, - .iam_step = iam, - .package_step = package_step, - .region = region, + // Package step - output goes to cache based on input hash + const package_cmd = b.addRunArtifact(cli); + package_cmd.step.name = try std.fmt.allocPrint(b.allocator, "{s} package", .{cli.name}); + package_cmd.addArgs(&.{ "package", "--exe" }); + package_cmd.addFileArg(exe.getEmittedBin()); + package_cmd.addArgs(&.{"--output"}); + const zip_output = package_cmd.addOutputFileArg("function.zip"); + package_cmd.step.dependOn(&exe.step); + + const package_step = b.step("awslambda_package", "Package the Lambda function"); + package_step.dependOn(&package_cmd.step); + + // IAM step + const iam_cmd = b.addRunArtifact(cli); + iam_cmd.step.name = try std.fmt.allocPrint(b.allocator, "{s} iam", .{cli.name}); + if (profile) |p| iam_cmd.addArgs(&.{ "--profile", p }); + if (region) |r| iam_cmd.addArgs(&.{ "--region", r }); + iam_cmd.addArgs(&.{ "iam", "--role-name", role_name }); + + const iam_step = b.step("awslambda_iam", "Create/verify IAM role for Lambda"); + iam_step.dependOn(&iam_cmd.step); + + // Deploy step (depends on package) + const deploy_cmd = b.addRunArtifact(cli); + deploy_cmd.step.name = try std.fmt.allocPrint(b.allocator, "{s} deploy", .{cli.name}); + if (profile) |p| deploy_cmd.addArgs(&.{ "--profile", p }); + if (region) |r| deploy_cmd.addArgs(&.{ "--region", r }); + deploy_cmd.addArgs(&.{ + "deploy", + "--function-name", + function_name, + "--zip-file", }); - - const deploy_step = b.step("awslambda_deploy", "Deploy the function"); - deploy_step.dependOn(&deploy.step); - - const payload = b.option([]const u8, "payload", "Lambda payload [{\"foo\":\"bar\", \"baz\": \"qux\"}]") orelse - \\ {"foo": "bar", "baz": "qux"}" - ; - - const invoke = Invoke.create(b, .{ - .name = function_name, - .payload = payload, - .region = region, + deploy_cmd.addFileArg(zip_output); + deploy_cmd.addArgs(&.{ + "--role-name", + role_name, + "--arch", + arch_str, }); - invoke.step.dependOn(&deploy.step); - const run_step = b.step("awslambda_run", "Run the app in AWS lambda"); - run_step.dependOn(&invoke.step); -} - -// AWS_CONFIG_FILE (default is ~/.aws/config -// AWS_DEFAULT_REGION -fn findRegionFromSystem(allocator: std.mem.Allocator) ![]const u8 { - const env_map = try std.process.getEnvMap(allocator); - if (env_map.get("AWS_DEFAULT_REGION")) |r| return r; - const config_file_path = env_map.get("AWS_CONFIG_FILE") orelse - try std.fs.path.join(allocator, &[_][]const u8{ - env_map.get("HOME") orelse env_map.get("USERPROFILE").?, - ".aws", - "config", - }); - const config_file = try std.fs.openFileAbsolute(config_file_path, .{}); - defer config_file.close(); - const config_bytes = try config_file.readToEndAlloc(allocator, 1024 * 1024); - const profile = env_map.get("AWS_PROFILE") orelse "default"; - var line_iterator = std.mem.split(u8, config_bytes, "\n"); - var in_profile = false; - while (line_iterator.next()) |line| { - const trimmed = std.mem.trim(u8, line, " \t\r"); - if (trimmed.len == 0 or trimmed[0] == '#') continue; - if (!in_profile) { - if (trimmed[0] == '[' and trimmed[trimmed.len - 1] == ']') { - // this is a profile directive! - // std.debug.print("profile: {s}, in file: {s}\n", .{ profile, trimmed[1 .. trimmed.len - 1] }); - if (std.mem.eql(u8, profile, trimmed[1 .. trimmed.len - 1])) { - in_profile = true; - } - } - continue; // we're only looking for a profile at this point - } - // look for our region directive - if (trimmed[0] == '[' and trimmed[trimmed.len - 1] == ']') - return error.RegionNotFound; // we've hit another profile without getting our region - if (!std.mem.startsWith(u8, trimmed, "region")) continue; - var equalityiterator = std.mem.split(u8, trimmed, "="); - _ = equalityiterator.next() orelse return error.RegionNotFound; - const raw_val = equalityiterator.next() orelse return error.RegionNotFound; - return try allocator.dupe(u8, std.mem.trimLeft(u8, raw_val, " \t")); - } - return error.RegionNotFound; + deploy_cmd.step.dependOn(&package_cmd.step); + + const deploy_step = b.step("awslambda_deploy", "Deploy the Lambda function"); + deploy_step.dependOn(&deploy_cmd.step); + + // Invoke/run step (depends on deploy) + const invoke_cmd = b.addRunArtifact(cli); + invoke_cmd.step.name = try std.fmt.allocPrint(b.allocator, "{s} invoke", .{cli.name}); + if (profile) |p| invoke_cmd.addArgs(&.{ "--profile", p }); + if (region) |r| invoke_cmd.addArgs(&.{ "--region", r }); + invoke_cmd.addArgs(&.{ + "invoke", + "--function-name", + function_name, + "--payload", + payload, + }); + invoke_cmd.step.dependOn(&deploy_cmd.step); + + const run_step = b.step("awslambda_run", "Invoke the deployed Lambda function"); + run_step.dependOn(&invoke_cmd.step); } diff --git a/lambdabuild/Deploy.zig b/lambdabuild/Deploy.zig deleted file mode 100644 index 35d888c..0000000 --- a/lambdabuild/Deploy.zig +++ /dev/null @@ -1,165 +0,0 @@ -const std = @import("std"); -const Region = @import("Region.zig"); -const aws = @import("aws").aws; - -const Deploy = @This(); - -step: std.Build.Step, -options: Options, - -const base_id: std.Build.Step.Id = .custom; - -pub const Options = struct { - /// Function name to be used for the function - name: []const u8, - - /// Architecture for Lambda function - arch: std.Target.Cpu.Arch, - - /// Iam step. This will be a dependency of the deployment - iam_step: *@import("Iam.zig"), - - /// Packaging step. This will be a dependency of the deployment - package_step: *@import("Package.zig"), - - /// Region for deployment - region: *Region, -}; - -pub fn create(owner: *std.Build, options: Options) *Deploy { - const name = owner.dupe(options.name); - const step_name = owner.fmt("{s} {s}{s}", .{ - "aws lambda", - "deploy ", - name, - }); - const self = owner.allocator.create(Deploy) catch @panic("OOM"); - self.* = .{ - .step = std.Build.Step.init(.{ - .id = base_id, - .name = step_name, - .owner = owner, - .makeFn = make, - }), - .options = options, - }; - - self.step.dependOn(&options.iam_step.step); - self.step.dependOn(&options.package_step.step); - return self; -} - -/// gets the last time we deployed this function from the name in cache. -/// If not in cache, null is returned. Note that cache is not account specific, -/// so if you're banging around multiple accounts, you'll want to use different -/// local zig caches for each -fn getlastDeployedTime(step: *std.Build.Step, name: []const u8) !?[]const u8 { - try step.owner.cache_root.handle.makePath("iam"); - // we should be able to use the role name, as only the following characters - // are allowed: _+=,.@-. - const cache_file = try std.fmt.allocPrint( - step.owner.allocator, - "deploy{s}{s}", - .{ std.fs.path.sep_str, name }, - ); - const buff = try step.owner.allocator.alloc(u8, 64); - const time = step.owner.cache_root.handle.readFile(cache_file, buff) catch return null; - return time; -} - -fn make(step: *std.Build.Step, node: std.Progress.Node) anyerror!void { - _ = node; - const self: *Deploy = @fieldParentPtr("step", step); - - if (self.options.arch != .aarch64 and self.options.arch != .x86_64) - return step.fail("AWS Lambda can only deploy aarch64 and x86_64 functions ({} not allowed)", .{self.options.arch}); - - const last_packaged_sha256 = blk: { - // file should always be there, but we shouldn't break if the cache doesn't exist - const last_deployed_id_file = std.fs.openFileAbsolute(try self.options.package_step.shasumFilePath(), .{}) catch break :blk null; - defer last_deployed_id_file.close(); - break :blk try last_deployed_id_file.readToEndAlloc(step.owner.allocator, 2048); - }; - - var client = aws.Client.init(self.step.owner.allocator, .{}); - defer client.deinit(); - const services = aws.Services(.{.lambda}){}; - const function = blk: { - var diagnostics = aws.Diagnostics{ - .http_code = undefined, - .response_body = undefined, - .allocator = self.step.owner.allocator, - }; - const options = aws.Options{ - .client = client, - .diagnostics = &diagnostics, - .region = try self.options.region.region(), - }; - - aws.globalLogControl(.info, .warn, .info, true); - defer aws.globalLogControl(.info, .warn, .info, false); - const call = aws.Request(services.lambda.get_function).call(.{ - .function_name = self.options.name, - }, options) catch |e| { - // There seems an issue here, but realistically, we have an arena - // so there's no leak leaving this out - defer diagnostics.deinit(); - if (diagnostics.http_code == 404) break :blk null; - return step.fail( - "Unknown error {} from Lambda GetFunction. HTTP code {}, message: {s}", - .{ e, diagnostics.http_code, diagnostics.response_body }, - ); - }; - defer call.deinit(); - - break :blk .{ - .last_modified = try step.owner.allocator.dupe(u8, call.response.configuration.?.last_modified.?), - .revision_id = try step.owner.allocator.dupe(u8, call.response.configuration.?.revision_id.?), - .sha256 = try step.owner.allocator.dupe(u8, call.response.configuration.?.code_sha256.?), - }; - }; - - if (last_packaged_sha256) |s| - if (function) |f| - if (std.mem.eql(u8, s, f.sha256)) { - step.result_cached = true; - return; - }; - - const encoder = std.base64.standard.Encoder; - const file = try std.fs.openFileAbsolute(self.options.package_step.packagedFileLazyPath().getPath2(step.owner, step), .{}); - defer file.close(); - const bytes = try file.readToEndAlloc(step.owner.allocator, 100 * 1024 * 1024); - const base64_buf = try step.owner.allocator.alloc(u8, encoder.calcSize(bytes.len)); - const base64_bytes = encoder.encode(base64_buf, bytes); - const options = aws.Options{ - .client = client, - .region = try self.options.region.region(), - }; - const arm64_arch = [_][]const u8{"arm64"}; - const x86_64_arch = [_][]const u8{"x86_64"}; - const architectures = (if (self.options.arch == .aarch64) arm64_arch else x86_64_arch); - const arches: [][]const u8 = @constCast(architectures[0..]); - if (function) |f| { - // TODO: make sure our zipfile newer than the lambda function - const update_call = try aws.Request(services.lambda.update_function_code).call(.{ - .function_name = self.options.name, - .architectures = arches, - .revision_id = f.revision_id, - .zip_file = base64_bytes, - }, options); - defer update_call.deinit(); - } else { - // New function - we need to create from scratch - const create_call = try aws.Request(services.lambda.create_function).call(.{ - .function_name = self.options.name, - .architectures = arches, - .code = .{ .zip_file = base64_bytes }, - .handler = "not_applicable", - .package_type = "Zip", - .runtime = "provided.al2", - .role = self.options.iam_step.resolved_arn, - }, options); - defer create_call.deinit(); - } -} diff --git a/lambdabuild/Iam.zig b/lambdabuild/Iam.zig deleted file mode 100644 index facc21d..0000000 --- a/lambdabuild/Iam.zig +++ /dev/null @@ -1,146 +0,0 @@ -const std = @import("std"); -const aws = @import("aws").aws; - -const Iam = @This(); - -step: std.Build.Step, -options: Options, -/// resolved_arn will be set only after make is run -resolved_arn: []const u8 = undefined, - -arn_buf: [2048]u8 = undefined, // https://docs.aws.amazon.com/IAM/latest/APIReference/API_Role.html has 2k limit -const base_id: std.Build.Step.Id = .custom; - -pub const Options = struct { - name: []const u8 = "", - role_name: []const u8, - role_arn: ?[]const u8, -}; - -pub fn create(owner: *std.Build, options: Options) *Iam { - const name = owner.dupe(options.name); - const step_name = owner.fmt("{s} {s}{s}", .{ - "aws lambda", - "iam", - name, - }); - const self = owner.allocator.create(Iam) catch @panic("OOM"); - self.* = .{ - .step = std.Build.Step.init(.{ - .id = base_id, - .name = step_name, - .owner = owner, - .makeFn = make, - }), - .options = options, - }; - - return self; -} - -/// gets an IamArn from the name in cache. If not in cache, null is returned -/// Note that cache is not account specific, so if you're banging around multiple -/// accounts, you'll want to use different local zig caches for each -pub fn getIamArnFromName(step: *std.Build.Step, name: []const u8) !?[]const u8 { - try step.owner.cache_root.handle.makePath("iam"); - // we should be able to use the role name, as only the following characters - // are allowed: _+=,.@-. - const iam_file = try std.fmt.allocPrint( - step.owner.allocator, - "iam{s}{s}", - .{ std.fs.path.sep_str, name }, - ); - const buff = try step.owner.allocator.alloc(u8, 64); - const arn = step.owner.cache_root.handle.readFile(iam_file, buff) catch return null; - return arn; -} - -fn make(step: *std.Build.Step, node: std.Progress.Node) anyerror!void { - _ = node; - const self: *Iam = @fieldParentPtr("step", step); - - if (try getIamArnFromName(step, self.options.role_name)) |a| { - step.result_cached = true; - @memcpy(self.arn_buf[0..a.len], a); - self.resolved_arn = self.arn_buf[0..a.len]; - return; // exists in cache - nothing to do - } - - var client = aws.Client.init(self.step.owner.allocator, .{}); - defer client.deinit(); - const services = aws.Services(.{.iam}){}; - - var arn = blk: { - var diagnostics = aws.Diagnostics{ - .http_code = undefined, - .response_body = undefined, - .allocator = self.step.owner.allocator, - }; - const options = aws.Options{ - .client = client, - .diagnostics = &diagnostics, - }; - - const call = aws.Request(services.iam.get_role).call(.{ - .role_name = self.options.role_name, // TODO: if we have a role_arn, we should use it and skip - }, options) catch |e| { - defer diagnostics.deinit(); - if (diagnostics.http_code == 404) break :blk null; - return step.fail( - "Unknown error {} from IAM GetRole. HTTP code {}, message: {s}", - .{ e, diagnostics.http_code, diagnostics.response_body }, - ); - }; - defer call.deinit(); - - break :blk try step.owner.allocator.dupe(u8, call.response.role.arn); - }; - // Now ARN will either be null (does not exist), or a value - - if (arn == null) { - // we need to create the role before proceeding - const options = aws.Options{ - .client = client, - }; - - const create_call = try aws.Request(services.iam.create_role).call(.{ - .role_name = self.options.role_name, - .assume_role_policy_document = - \\{ - \\ "Version": "2012-10-17", - \\ "Statement": [ - \\ { - \\ "Sid": "", - \\ "Effect": "Allow", - \\ "Principal": { - \\ "Service": "lambda.amazonaws.com" - \\ }, - \\ "Action": "sts:AssumeRole" - \\ } - \\ ] - \\} - , - }, options); - defer create_call.deinit(); - arn = try step.owner.allocator.dupe(u8, create_call.response.role.arn); - const attach_call = try aws.Request(services.iam.attach_role_policy).call(.{ - .policy_arn = "arn:aws:iam::aws:policy/AWSLambdaExecute", - .role_name = self.options.role_name, - }, options); - defer attach_call.deinit(); - } - - @memcpy(self.arn_buf[0..arn.?.len], arn.?); - self.resolved_arn = self.arn_buf[0..arn.?.len]; - - // NOTE: This must match getIamArnFromName - const iam_file = try std.fmt.allocPrint( - step.owner.allocator, - "iam{s}{s}", - .{ std.fs.path.sep_str, self.options.role_name }, - ); - try step.owner.cache_root.handle.writeFile(.{ - .sub_path = iam_file, - .data = arn.?, - }); -} diff --git a/lambdabuild/Invoke.zig b/lambdabuild/Invoke.zig deleted file mode 100644 index 775d630..0000000 --- a/lambdabuild/Invoke.zig +++ /dev/null @@ -1,90 +0,0 @@ -const std = @import("std"); -const aws = @import("aws").aws; -const Region = @import("Region.zig"); -const Invoke = @This(); - -step: std.Build.Step, -options: Options, - -const base_id: std.Build.Step.Id = .custom; - -pub const Options = struct { - /// Function name to invoke - name: []const u8, - - /// Payload to send to the function - payload: []const u8, - - /// Region for deployment - region: *Region, -}; - -pub fn create(owner: *std.Build, options: Options) *Invoke { - const name = owner.dupe(options.name); - const step_name = owner.fmt("{s} {s}{s}", .{ - "aws lambda", - "invoke", - name, - }); - const self = owner.allocator.create(Invoke) catch @panic("OOM"); - self.* = .{ - .step = std.Build.Step.init(.{ - .id = base_id, - .name = step_name, - .owner = owner, - .makeFn = make, - }), - .options = options, - }; - - return self; -} - -fn make(step: *std.Build.Step, node: std.Progress.Node) anyerror!void { - _ = node; - const self: *Invoke = @fieldParentPtr("step", step); - - var client = aws.Client.init(self.step.owner.allocator, .{}); - defer client.deinit(); - const services = aws.Services(.{.lambda}){}; - - const options = aws.Options{ - .client = client, - .region = try self.options.region.region(), - }; - var inx: usize = 10; // 200ms * 10 - while (inx > 0) : (inx -= 1) { - var diagnostics = aws.Diagnostics{ - .http_code = undefined, - .response_body = undefined, - .allocator = self.step.owner.allocator, - }; - const call = aws.Request(services.lambda.get_function).call(.{ - .function_name = self.options.name, - }, options) catch |e| { - // There seems an issue here, but realistically, we have an arena - // so there's no leak leaving this out - defer diagnostics.deinit(); - if (diagnostics.http_code == 404) continue; // function was just created...it's ok - return step.fail( - "Unknown error {} from Lambda GetFunction. HTTP code {}, message: {s}", - .{ e, diagnostics.http_code, diagnostics.response_body }, - ); - }; - defer call.deinit(); - if (!std.mem.eql(u8, "InProgress", call.response.configuration.?.last_update_status.?)) - break; // We're ready to invoke! - const ms: usize = if (inx == 5) 500 else 50; - std.time.sleep(ms * std.time.ns_per_ms); - } - if (inx == 0) - return step.fail("Timed out waiting for lambda to update function", .{}); - const call = try aws.Request(services.lambda.invoke).call(.{ - .function_name = self.options.name, - .payload = self.options.payload, - .log_type = "Tail", - .invocation_type = "RequestResponse", - }, options); - defer call.deinit(); - std.debug.print("{?s}\n", .{call.response.payload}); -} diff --git a/lambdabuild/Package.zig b/lambdabuild/Package.zig deleted file mode 100644 index dcc50bd..0000000 --- a/lambdabuild/Package.zig +++ /dev/null @@ -1,158 +0,0 @@ -const std = @import("std"); - -const Package = @This(); - -step: std.Build.Step, -options: Options, - -/// This is set as part of the make phase, and is the location in the cache -/// for the lambda package. The package will also be copied to the output -/// directory, but this location makes for a good cache key for deployments -zipfile_cache_dest: ?[]const u8 = null, - -zipfile_dest: ?[]const u8 = null, - -const base_id: std.Build.Step.Id = .install_file; - -pub const Options = struct { - name: []const u8 = "", - exe: *std.Build.Step.Compile, - zipfile_name: []const u8 = "function.zip", -}; - -pub fn create(owner: *std.Build, options: Options) *Package { - const name = owner.dupe(options.name); - const step_name = owner.fmt("{s} {s}{s}", .{ - "aws lambda", - "package", - name, - }); - const package = owner.allocator.create(Package) catch @panic("OOM"); - package.* = .{ - .step = std.Build.Step.init(.{ - .id = base_id, - .name = step_name, - .owner = owner, - .makeFn = make, - }), - .options = options, - }; - - return package; -} -pub fn shasumFilePath(self: Package) ![]const u8 { - return try std.fmt.allocPrint( - self.step.owner.allocator, - "{s}{s}{s}", - .{ std.fs.path.dirname(self.zipfile_cache_dest.?).?, std.fs.path.sep_str, "sha256sum.txt" }, - ); -} -pub fn packagedFilePath(self: Package) []const u8 { - return self.step.owner.getInstallPath(.prefix, self.options.zipfile_name); -} -pub fn packagedFileLazyPath(self: Package) std.Build.LazyPath { - return .{ .src_path = .{ - .owner = self.step.owner, - .sub_path = self.step.owner.getInstallPath(.prefix, self.options.zipfile_name), - } }; -} - -fn make(step: *std.Build.Step, node: std.Progress.Node) anyerror!void { - _ = node; - const self: *Package = @fieldParentPtr("step", step); - // get a hash of the bootstrap and whatever other files we put into the zip - // file (because a zip is not really reproducible). That hash becomes the - // cache directory, similar to the way rest of zig works - // - // Otherwise, create the package in our cache indexed by hash, and copy - // our bootstrap, zip things up and install the file into zig-out - const bootstrap = bootstrapLocation(self.*) catch |e| { - if (@errorReturnTrace()) |trace| { - std.debug.dumpStackTrace(trace.*); - } - return step.fail("Could not copy output to bootstrap: {}", .{e}); - }; - const bootstrap_dirname = std.fs.path.dirname(bootstrap).?; - const zipfile_src = try std.fs.path.join(step.owner.allocator, &[_][]const u8{ bootstrap_dirname, self.options.zipfile_name }); - self.zipfile_cache_dest = zipfile_src; - self.zipfile_dest = self.step.owner.getInstallPath(.prefix, self.options.zipfile_name); - if (std.fs.copyFileAbsolute(zipfile_src, self.zipfile_dest.?, .{})) |_| { - // we're good here. The zip file exists in cache and has been copied - step.result_cached = true; - } else |_| { - // error, but this is actually the normal case. We will zip the file - // using system zip and store that in cache with the output file for later - // use - - // TODO: For Windows, tar.exe can actually do zip files. - // tar -a -cf function.zip file1 [file2...] - // - // See: https://superuser.com/questions/201371/create-zip-folder-from-the-command-line-windows#comment2725283_898508 - var child = std.process.Child.init(&[_][]const u8{ - "zip", - "-qj9X", - zipfile_src, - bootstrap, - }, self.step.owner.allocator); - child.stdout_behavior = .Ignore; - child.stdin_behavior = .Ignore; // we'll allow stderr through - switch (try child.spawnAndWait()) { - .Exited => |rc| if (rc != 0) return step.fail("Non-zero exit code {} from zip", .{rc}), - .Signal, .Stopped, .Unknown => return step.fail("Abnormal termination from zip step", .{}), - } - - try std.fs.copyFileAbsolute(zipfile_src, self.zipfile_dest.?, .{}); // It better be there now - - // One last thing. We want to get a Sha256 sum of the zip file, and - // store it in cache. This will help the deployment process compare - // to what's out in AWS, since revision id is apparently trash for these - // purposes - const zipfile = try std.fs.openFileAbsolute(zipfile_src, .{}); - defer zipfile.close(); - const zip_bytes = try zipfile.readToEndAlloc(step.owner.allocator, 100 * 1024 * 1024); - var hash: [std.crypto.hash.sha2.Sha256.digest_length]u8 = undefined; - std.crypto.hash.sha2.Sha256.hash(zip_bytes, &hash, .{}); - const base64 = std.base64.standard.Encoder; - var encoded: [base64.calcSize(std.crypto.hash.sha2.Sha256.digest_length)]u8 = undefined; - const shaoutput = try std.fs.createFileAbsolute(try self.shasumFilePath(), .{}); - defer shaoutput.close(); - try shaoutput.writeAll(base64.encode(encoded[0..], hash[0..])); - } -} - -fn bootstrapLocation(package: Package) ![]const u8 { - const output = package.step.owner.getInstallPath(.bin, package.options.exe.out_filename); - // We will always copy the output file, mainly because we also need the hash... - // if (std.mem.eql(u8, "bootstrap", package.options.exe.out_filename)) - // return output; // easy path - - // Not so easy...read the file, get a hash of contents, see if it's in cache - const output_file = try std.fs.openFileAbsolute(output, .{}); - defer output_file.close(); - const output_bytes = try output_file.readToEndAlloc(package.step.owner.allocator, 100 * 1024 * 1024); // 100MB file - // std.Build.Cache.Hasher - // std.Buidl.Cache.hasher_init - var hasher = std.Build.Cache.HashHelper{}; // We'll reuse the same file hasher from cache - hasher.addBytes(output_bytes); - const hash = std.fmt.bytesToHex(hasher.hasher.finalResult(), .lower); - const dest_path = try package.step.owner.cache_root.join( - package.step.owner.allocator, - &[_][]const u8{ "p", hash[0..], "bootstrap" }, - ); - const dest_file = std.fs.openFileAbsolute(dest_path, .{}) catch null; - if (dest_file) |d| { - d.close(); - return dest_path; - } - const pkg_path = try package.step.owner.cache_root.join( - package.step.owner.allocator, - &[_][]const u8{"p"}, - ); - // Destination file does not exist. Write the bootstrap (after creating the directory) - std.fs.makeDirAbsolute(pkg_path) catch {}; - std.fs.makeDirAbsolute(std.fs.path.dirname(dest_path).?) catch {}; - const write_file = try std.fs.createFileAbsolute(dest_path, .{}); - defer write_file.close(); - try write_file.writeAll(output_bytes); - return dest_path; -} diff --git a/lambdabuild/Region.zig b/lambdabuild/Region.zig deleted file mode 100644 index 2e2ccef..0000000 --- a/lambdabuild/Region.zig +++ /dev/null @@ -1,55 +0,0 @@ -const std = @import("std"); - -specified_region: ?[]const u8, -allocator: std.mem.Allocator, -/// internal state, please do not use -_calculated_region: ?[]const u8 = null, -const Region = @This(); -pub fn region(self: *Region) ![]const u8 { - if (self.specified_region) |r| return r; // user specified - if (self._calculated_region) |r| return r; // cached - self._calculated_region = try findRegionFromSystem(self.allocator); - return self._calculated_region.?; -} - -// AWS_CONFIG_FILE (default is ~/.aws/config -// AWS_DEFAULT_REGION -fn findRegionFromSystem(allocator: std.mem.Allocator) ![]const u8 { - const env_map = try std.process.getEnvMap(allocator); - if (env_map.get("AWS_DEFAULT_REGION")) |r| return r; - const config_file_path = env_map.get("AWS_CONFIG_FILE") orelse - try std.fs.path.join(allocator, &[_][]const u8{ - env_map.get("HOME") orelse env_map.get("USERPROFILE").?, - ".aws", - "config", - }); - const config_file = try std.fs.openFileAbsolute(config_file_path, .{}); - defer config_file.close(); - const config_bytes = try config_file.readToEndAlloc(allocator, 1024 * 1024); - const profile = env_map.get("AWS_PROFILE") orelse "default"; - var line_iterator = std.mem.split(u8, config_bytes, "\n"); - var in_profile = false; - while (line_iterator.next()) |line| { - const trimmed = std.mem.trim(u8, line, " \t\r"); - if (trimmed.len == 0 or trimmed[0] == '#') continue; - if (!in_profile) { - if (trimmed[0] == '[' and trimmed[trimmed.len - 1] == ']') { - // this is a profile directive! - // std.debug.print("profile: {s}, in file: {s}\n", .{ profile, trimmed[1 .. trimmed.len - 1] }); - if (std.mem.eql(u8, profile, trimmed[1 .. trimmed.len - 1])) { - in_profile = true; - } - } - continue; // we're only looking for a profile at this point - } - // look for our region directive - if (trimmed[0] == '[' and trimmed[trimmed.len - 1] == ']') - return error.RegionNotFound; // we've hit another profile without getting our region - if (!std.mem.startsWith(u8, trimmed, "region")) continue; - var equalityiterator = std.mem.split(u8, trimmed, "="); - _ = equalityiterator.next() orelse return error.RegionNotFound; - const raw_val = equalityiterator.next() orelse return error.RegionNotFound; - return try allocator.dupe(u8, std.mem.trimLeft(u8, raw_val, " \t")); - } - return error.RegionNotFound; -} diff --git a/lambdabuild/function.zip b/lambdabuild/function.zip deleted file mode 100644 index 9975889bfe387bb86c844f0286683a5110141e8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224301 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͢DURHv873< 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 diff --git a/src/lambda.zig b/src/lambda.zig index 1272997..8fdf1d7 100644 --- a/src/lambda.zig +++ b/src/lambda.zig @@ -130,28 +130,51 @@ const Event = struct { // non-ssl), this shouldn't be a big issue var cl = std.http.Client{ .allocator = self.allocator }; defer cl.deinit(); - const res = cl.fetch(.{ - .method = .POST, - .payload = content_fmt, - .location = .{ .uri = err_uri }, + + var req = cl.request(.POST, err_uri, .{ .extra_headers = &.{ .{ .name = "Lambda-Runtime-Function-Error-Type", .value = "HandlerReturned", }, }, - }) catch |post_err| { // Well, at this point all we can do is shout at the void - log.err("Error posting response (start) for request id {s}: {}", .{ self.request_id, post_err }); + }) catch |req_err| { + log.err("Error creating request for request id {s}: {}", .{ self.request_id, req_err }); std.posix.exit(1); }; - // TODO: Determine why this post is not returning - if (res.status != .ok) { + defer req.deinit(); + + req.transfer_encoding = .{ .content_length = content_fmt.len }; + var body_writer = req.sendBodyUnflushed(&.{}) catch |send_err| { + log.err("Error sending body for request id {s}: {}", .{ self.request_id, send_err }); + std.posix.exit(1); + }; + body_writer.writer.writeAll(content_fmt) catch |write_err| { + log.err("Error writing body for request id {s}: {}", .{ self.request_id, write_err }); + std.posix.exit(1); + }; + body_writer.end() catch |end_err| { + log.err("Error ending body for request id {s}: {}", .{ self.request_id, end_err }); + std.posix.exit(1); + }; + req.connection.?.flush() catch |flush_err| { + log.err("Error flushing for request id {s}: {}", .{ self.request_id, flush_err }); + std.posix.exit(1); + }; + + var redirect_buffer: [1024]u8 = undefined; + const response = req.receiveHead(&redirect_buffer) catch |recv_err| { + log.err("Error receiving response for request id {s}: {}", .{ self.request_id, recv_err }); + std.posix.exit(1); + }; + + if (response.head.status != .ok) { // Documentation says something about "exit immediately". The // Lambda infrastrucutre restarts, so it's unclear if that's necessary. // It seems as though a continue should be fine, and slightly faster log.err("Post fail: {} {s}", .{ - @intFromEnum(res.status), - res.status.phrase() orelse "", + @intFromEnum(response.head.status), + response.head.reason, }); std.posix.exit(1); } @@ -165,20 +188,31 @@ const Event = struct { .{ prefix, lambda_runtime_uri, postfix, self.request_id }, ); defer self.allocator.free(response_url); + const response_uri = try std.Uri.parse(response_url); + var cl = std.http.Client{ .allocator = self.allocator }; defer cl.deinit(); + // Lambda does different things, depending on the runtime. Go 1.x takes // any return value but escapes double quotes. Custom runtimes can // do whatever they want. node I believe wraps as a json object. We're // going to leave the return value up to the handler, and they can // use a seperate API for normalization so we're explicit. As a result, // we can just post event_response completely raw here - const res = try cl.fetch(.{ - .method = .POST, - .payload = event_response, - .location = .{ .url = response_url }, - }); - if (res.status != .ok) return error.UnexpectedStatusFromPostResponse; + + var req = try cl.request(.POST, response_uri, .{}); + defer req.deinit(); + + req.transfer_encoding = .{ .content_length = event_response.len }; + var body_writer = try req.sendBodyUnflushed(&.{}); + try body_writer.writer.writeAll(event_response); + try body_writer.end(); + try req.connection.?.flush(); + + var redirect_buffer: [1024]u8 = undefined; + const response = try req.receiveHead(&redirect_buffer); + + if (response.head.status != .ok) return error.UnexpectedStatusFromPostResponse; } }; @@ -189,30 +223,32 @@ fn getEvent(allocator: std.mem.Allocator, event_data_uri: std.Uri) !?Event { // non-ssl), this shouldn't be a big issue var cl = std.http.Client{ .allocator = allocator }; defer cl.deinit(); - var response_bytes = std.ArrayList(u8).init(allocator); - defer response_bytes.deinit(); - var server_header_buffer: [16 * 1024]u8 = undefined; + // Lambda freezes the process at this line of code. During warm start, // the process will unfreeze and data will be sent in response to client.get - var res = try cl.fetch(.{ - .server_header_buffer = &server_header_buffer, - .location = .{ .uri = event_data_uri }, - .response_storage = .{ .dynamic = &response_bytes }, - }); - if (res.status != .ok) { + var req = try cl.request(.GET, event_data_uri, .{}); + defer req.deinit(); + + try req.sendBodiless(); + + var redirect_buffer: [0]u8 = undefined; + var response = try req.receiveHead(&redirect_buffer); + + if (response.head.status != .ok) { // Documentation says something about "exit immediately". The // Lambda infrastrucutre restarts, so it's unclear if that's necessary. // It seems as though a continue should be fine, and slightly faster // std.os.exit(1); log.err("Lambda server event response returned bad error code: {} {s}", .{ - @intFromEnum(res.status), - res.status.phrase() orelse "", + @intFromEnum(response.head.status), + response.head.reason, }); return error.EventResponseNotOkResponse; } + // Extract request ID from response headers var request_id: ?[]const u8 = null; - var header_it = std.http.HeaderIterator.init(server_header_buffer[0..]); + var header_it = response.head.iterateHeaders(); while (header_it.next()) |h| { if (std.ascii.eqlIgnoreCase(h.name, "Lambda-Runtime-Aws-Request-Id")) request_id = h.value; @@ -234,9 +270,30 @@ fn getEvent(allocator: std.mem.Allocator, event_data_uri: std.Uri) !?Event { const req_id = request_id.?; log.debug("got lambda request with id {s}", .{req_id}); + // Read response body using a transfer buffer + var transfer_buffer: [64 * 1024]u8 = undefined; + const body_reader = response.reader(&transfer_buffer); + + // Read all data into an allocated buffer + // We use content_length if available, otherwise read chunks + const content_len = response.head.content_length orelse (10 * 1024 * 1024); // 10MB max if not specified + var event_data = try allocator.alloc(u8, content_len); + errdefer allocator.free(event_data); + + var total_read: usize = 0; + while (total_read < content_len) { + const remaining = event_data[total_read..]; + const bytes_read = body_reader.readSliceShort(remaining) catch |err| switch (err) { + error.ReadFailed => return error.ReadFailed, + }; + if (bytes_read == 0) break; + total_read += bytes_read; + } + event_data = try allocator.realloc(event_data, total_read); + return Event.init( allocator, - try response_bytes.toOwnedSlice(), + event_data, try allocator.dupe(u8, req_id), ); } @@ -281,15 +338,6 @@ fn threadMain(allocator: std.mem.Allocator) !void { // when it's time to shut down while (server_remaining_requests > 0) { server_remaining_requests -= 1; - // defer { - // if (!arena.reset(.{ .retain_capacity = {} })) { - // // reallocation failed, arena is degraded - // log.warn("Arena reset failed and is degraded. Resetting arena", .{}); - // arena.deinit(); - // arena = std.heap.ArenaAllocator.init(allocator); - // aa = arena.allocator(); - // } - // } processRequest(aa, &http_server) catch |e| { log.err("Unexpected error processing request: {any}", .{e}); @@ -312,42 +360,54 @@ fn processRequest(allocator: std.mem.Allocator, server: *std.net.Server) !void { server_ready = false; var read_buffer: [1024 * 16]u8 = undefined; - var http_server = std.http.Server.init(connection, &read_buffer); + var write_buffer: [1024 * 16]u8 = undefined; + var stream_reader = std.net.Stream.Reader.init(connection.stream, &read_buffer); + var stream_writer = std.net.Stream.Writer.init(connection.stream, &write_buffer); - if (http_server.state == .ready) { - var request = http_server.receiveHead() catch |err| switch (err) { - error.HttpConnectionClosing => return, - else => { - std.log.err("closing http connection: {s}", .{@errorName(err)}); - std.log.debug("Error occurred from this request: \n{s}", .{read_buffer[0..http_server.read_buffer_len]}); - return; - }, - }; - server_request_aka_lambda_response = try (try request.reader()).readAllAlloc(allocator, std.math.maxInt(usize)); - var respond_options = std.http.Server.Request.RespondOptions{}; - const response_bytes = serve(allocator, request, &respond_options) catch |e| brk: { - respond_options.status = .internal_server_error; - // TODO: more about this particular request - log.err("Unexpected error from executor processing request: {any}", .{e}); - if (@errorReturnTrace()) |trace| { - std.debug.dumpStackTrace(trace.*); + var http_server = std.http.Server.init(stream_reader.interface(), &stream_writer.interface); + + const request = http_server.receiveHead() catch |err| switch (err) { + error.HttpConnectionClosing => return, + else => { + std.log.err("closing http connection: {s}", .{@errorName(err)}); + return; + }, + }; + + // Read request body if present + if (request.head.content_length) |content_len| { + if (content_len > 0) { + var body_transfer_buffer: [64 * 1024]u8 = undefined; + const body_reader = http_server.reader.bodyReader(&body_transfer_buffer, request.head.transfer_encoding, request.head.content_length); + var body_data = try allocator.alloc(u8, content_len); + errdefer allocator.free(body_data); + var total_read: usize = 0; + while (total_read < content_len) { + const remaining = body_data[total_read..]; + const bytes_read = body_reader.readSliceShort(remaining) catch break; + if (bytes_read == 0) break; + total_read += bytes_read; } - break :brk "Unexpected error generating request to lambda"; - }; - try request.respond(response_bytes, respond_options); - log.debug( - "tid {d} (server): sent response: {s}", - .{ std.Thread.getCurrentId(), response_bytes }, - ); + server_request_aka_lambda_response = try allocator.realloc(body_data, total_read); + } } + + // Build and send response + const response_bytes = serve(); + var respond_request = request; + try respond_request.respond(response_bytes, .{ + .extra_headers = &.{ + .{ .name = "Lambda-Runtime-Aws-Request-Id", .value = "69" }, + }, + }); + + log.debug( + "tid {d} (server): sent response: {s}", + .{ std.Thread.getCurrentId(), response_bytes }, + ); } -fn serve(allocator: std.mem.Allocator, request: std.http.Server.Request, respond_options: *std.http.Server.Request.RespondOptions) ![]const u8 { - _ = allocator; - _ = request; - respond_options.extra_headers = &.{ - .{ .name = "Lambda-Runtime-Aws-Request-Id", .value = "69" }, - }; +fn serve() []const u8 { return server_response; } @@ -391,7 +451,7 @@ pub fn test_lambda_request(allocator: std.mem.Allocator, request: []const u8, re // when subsequent tests fail const server_thread = try startServer(aa); // start the server, get it ready while (!server_ready) - std.time.sleep(100); + std.Thread.sleep(100); log.debug("tid {d} (main): server reports ready", .{std.Thread.getCurrentId()}); // we aren't testing the server, diff --git a/tools/build/build.zig b/tools/build/build.zig new file mode 100644 index 0000000..820be88 --- /dev/null +++ b/tools/build/build.zig @@ -0,0 +1,49 @@ +const std = @import("std"); + +pub fn build(b: *std.Build) void { + const target = b.standardTargetOptions(.{}); + const optimize = b.standardOptimizeOption(.{}); + + // Create the main module for the CLI + const main_module = b.createModule(.{ + .root_source_file = b.path("src/main.zig"), + .target = target, + .optimize = optimize, + }); + + // Add aws dependency to the module + const aws_dep = b.dependency("aws", .{ .target = target, .optimize = optimize }); + main_module.addImport("aws", aws_dep.module("aws")); + + const exe = b.addExecutable(.{ + .name = "lambda-build", + .root_module = main_module, + }); + + b.installArtifact(exe); + + // Run step for testing: zig build run -- package --exe /path/to/exe --output /path/to/out.zip + const run_cmd = b.addRunArtifact(exe); + run_cmd.step.dependOn(b.getInstallStep()); + if (b.args) |args| + run_cmd.addArgs(args); + + const run_step = b.step("run", "Run the CLI"); + run_step.dependOn(&run_cmd.step); + + // Test step + const test_module = b.createModule(.{ + .root_source_file = b.path("src/main.zig"), + .target = target, + .optimize = optimize, + }); + test_module.addImport("aws", aws_dep.module("aws")); + + const unit_tests = b.addTest(.{ + .root_module = test_module, + }); + + const run_unit_tests = b.addRunArtifact(unit_tests); + const test_step = b.step("test", "Run unit tests"); + test_step.dependOn(&run_unit_tests.step); +} diff --git a/tools/build/build.zig.zon b/tools/build/build.zig.zon new file mode 100644 index 0000000..797a956 --- /dev/null +++ b/tools/build/build.zig.zon @@ -0,0 +1,16 @@ +.{ + .name = .lambda_build, + .version = "0.1.0", + .fingerprint = 0x6e61de08e7e51114, + .dependencies = .{ + .aws = .{ + .url = "git+https://git.lerch.org/lobo/aws-sdk-for-zig.git#6e34e83933aaa1120b7d0049f458608fdd6fa27b", + .hash = "aws-0.0.1-SbsFcCs2CgChIYNjD8lAnGZTOk0_96-db5kDawRnzImA", + }, + }, + .paths = .{ + "build.zig", + "build.zig.zon", + "src", + }, +} diff --git a/tools/build/src/deploy.zig b/tools/build/src/deploy.zig new file mode 100644 index 0000000..5740d9d --- /dev/null +++ b/tools/build/src/deploy.zig @@ -0,0 +1,251 @@ +//! Deploy command - deploys a Lambda function to AWS. +//! +//! Creates a new function or updates an existing one. + +const std = @import("std"); +const aws = @import("aws"); +const iam_cmd = @import("iam.zig"); +const RunOptions = @import("main.zig").RunOptions; + +pub fn run(args: []const []const u8, options: RunOptions) !void { + var function_name: ?[]const u8 = null; + var zip_file: ?[]const u8 = null; + var role_arn: ?[]const u8 = null; + var role_name: []const u8 = "lambda_basic_execution"; + var arch: ?[]const u8 = null; + + var i: usize = 0; + while (i < args.len) : (i += 1) { + const arg = args[i]; + if (std.mem.eql(u8, arg, "--function-name")) { + i += 1; + if (i >= args.len) return error.MissingFunctionName; + function_name = args[i]; + } else if (std.mem.eql(u8, arg, "--zip-file")) { + i += 1; + if (i >= args.len) return error.MissingZipFile; + zip_file = args[i]; + } else if (std.mem.eql(u8, arg, "--role-arn")) { + i += 1; + if (i >= args.len) return error.MissingRoleArn; + role_arn = args[i]; + } else if (std.mem.eql(u8, arg, "--role-name")) { + i += 1; + if (i >= args.len) return error.MissingRoleName; + role_name = args[i]; + } else if (std.mem.eql(u8, arg, "--arch")) { + i += 1; + if (i >= args.len) return error.MissingArch; + arch = args[i]; + } else if (std.mem.eql(u8, arg, "--help") or std.mem.eql(u8, arg, "-h")) { + printHelp(options.stdout); + try options.stdout.flush(); + return; + } else { + try options.stderr.print("Unknown option: {s}\n", .{arg}); + try options.stderr.flush(); + return error.UnknownOption; + } + } + + if (function_name == null) { + try options.stderr.print("Error: --function-name is required\n", .{}); + printHelp(options.stderr); + try options.stderr.flush(); + return error.MissingFunctionName; + } + + if (zip_file == null) { + try options.stderr.print("Error: --zip-file is required\n", .{}); + printHelp(options.stderr); + try options.stderr.flush(); + return error.MissingZipFile; + } + + try deployFunction(.{ + .function_name = function_name.?, + .zip_file = zip_file.?, + .role_arn = role_arn, + .role_name = role_name, + .arch = arch, + }, options); +} + +fn printHelp(writer: *std.Io.Writer) void { + writer.print( + \\Usage: lambda-build deploy [options] + \\ + \\Deploy a Lambda function to AWS. + \\ + \\Options: + \\ --function-name Name of the Lambda function (required) + \\ --zip-file Path to the deployment zip (required) + \\ --role-arn IAM role ARN (optional - creates role if omitted) + \\ --role-name IAM role name if creating (default: lambda_basic_execution) + \\ --arch Architecture: x86_64 or aarch64 (default: x86_64) + \\ --help, -h Show this help message + \\ + \\If the function exists, its code is updated. Otherwise, a new function + \\is created with the provided configuration. + \\ + , .{}) catch {}; +} + +const DeployOptions = struct { + function_name: []const u8, + zip_file: []const u8, + role_arn: ?[]const u8, + role_name: []const u8, + arch: ?[]const u8, +}; + +fn deployFunction(deploy_opts: DeployOptions, options: RunOptions) !void { + // Validate architecture + const arch_str = deploy_opts.arch orelse "x86_64"; + if (!std.mem.eql(u8, arch_str, "x86_64") and !std.mem.eql(u8, arch_str, "aarch64") and !std.mem.eql(u8, arch_str, "arm64")) { + return error.InvalidArchitecture; + } + + // Note: Profile is expected to be set via AWS_PROFILE env var before invoking this tool + // (e.g., via aws-vault exec) + + // Get or create IAM role if not provided + const role_arn = if (deploy_opts.role_arn) |r| + try options.allocator.dupe(u8, r) + else + try iam_cmd.getOrCreateRole(deploy_opts.role_name, options); + + defer options.allocator.free(role_arn); + + // Read the zip file and encode as base64 + const zip_file = try std.fs.cwd().openFile(deploy_opts.zip_file, .{}); + defer zip_file.close(); + var read_buffer: [4096]u8 = undefined; + var file_reader = zip_file.reader(&read_buffer); + const zip_data = try file_reader.interface.allocRemaining(options.allocator, std.Io.Limit.limited(50 * 1024 * 1024)); + defer options.allocator.free(zip_data); + + const base64_data = try std.fmt.allocPrint(options.allocator, "{b64}", .{zip_data}); + defer options.allocator.free(base64_data); + + var client = aws.Client.init(options.allocator, .{}); + defer client.deinit(); + + const services = aws.Services(.{.lambda}){}; + + const region = options.region orelse "us-east-1"; + + const aws_options = aws.Options{ + .client = client, + .region = region, + }; + + // Convert arch string to Lambda format + const lambda_arch = if (std.mem.eql(u8, arch_str, "aarch64") or std.mem.eql(u8, arch_str, "arm64")) + "arm64" + else + "x86_64"; + + const architectures: []const []const u8 = &.{lambda_arch}; + + // Try to create the function first - if it already exists, we'll update it + std.log.info("Attempting to create function: {s}", .{deploy_opts.function_name}); + + var create_diagnostics = aws.Diagnostics{ + .http_code = undefined, + .response_body = undefined, + .allocator = options.allocator, + }; + + const create_options = aws.Options{ + .client = client, + .region = region, + .diagnostics = &create_diagnostics, + }; + + const create_result = aws.Request(services.lambda.create_function).call(.{ + .function_name = deploy_opts.function_name, + .architectures = @constCast(architectures), + .code = .{ .zip_file = base64_data }, + .handler = "bootstrap", + .package_type = "Zip", + .runtime = "provided.al2023", + .role = role_arn, + }, create_options) catch |err| { + defer create_diagnostics.deinit(); + std.log.info("CreateFunction returned: error={}, HTTP code={}", .{ err, create_diagnostics.http_code }); + + // Function already exists (409 Conflict) - update it instead + if (create_diagnostics.http_code == 409) { + std.log.info("Function already exists, updating: {s}", .{deploy_opts.function_name}); + + const update_result = try aws.Request(services.lambda.update_function_code).call(.{ + .function_name = deploy_opts.function_name, + .architectures = @constCast(architectures), + .zip_file = base64_data, + }, aws_options); + defer update_result.deinit(); + + try options.stdout.print("Updated function: {s}\n", .{deploy_opts.function_name}); + if (update_result.response.function_arn) |arn| { + try options.stdout.print("ARN: {s}\n", .{arn}); + } + try options.stdout.flush(); + + // Wait for function to be ready before returning + try waitForFunctionReady(deploy_opts.function_name, aws_options); + return; + } + + std.log.err("Lambda CreateFunction failed: {} (HTTP {})", .{ err, create_diagnostics.http_code }); + return error.LambdaCreateFunctionFailed; + }; + defer create_result.deinit(); + + try options.stdout.print("Created function: {s}\n", .{deploy_opts.function_name}); + if (create_result.response.function_arn) |arn| { + try options.stdout.print("ARN: {s}\n", .{arn}); + } + try options.stdout.flush(); + + // Wait for function to be ready before returning + try waitForFunctionReady(deploy_opts.function_name, aws_options); +} + +fn waitForFunctionReady(function_name: []const u8, aws_options: aws.Options) !void { + const services = aws.Services(.{.lambda}){}; + + var retries: usize = 30; // Up to ~6 seconds total + while (retries > 0) : (retries -= 1) { + const result = aws.Request(services.lambda.get_function).call(.{ + .function_name = function_name, + }, aws_options) catch |err| { + // Function should exist at this point, but retry on transient errors + std.log.warn("GetFunction failed during wait: {}", .{err}); + std.Thread.sleep(200 * std.time.ns_per_ms); + continue; + }; + defer result.deinit(); + + // Check if function is ready + if (result.response.configuration) |config| { + if (config.last_update_status) |status| { + if (std.mem.eql(u8, status, "Successful")) { + std.log.info("Function is ready", .{}); + return; + } else if (std.mem.eql(u8, status, "Failed")) { + return error.FunctionUpdateFailed; + } + // "InProgress" - keep waiting + } else { + return; // No status means it's ready + } + } else { + return; // No configuration means we can't check, assume ready + } + + std.Thread.sleep(200 * std.time.ns_per_ms); + } + + return error.FunctionNotReady; +} diff --git a/tools/build/src/iam.zig b/tools/build/src/iam.zig new file mode 100644 index 0000000..3e94610 --- /dev/null +++ b/tools/build/src/iam.zig @@ -0,0 +1,148 @@ +//! IAM command - creates or retrieves an IAM role for Lambda execution. + +const std = @import("std"); +const aws = @import("aws"); +const RunOptions = @import("main.zig").RunOptions; + +pub fn run(args: []const []const u8, options: RunOptions) !void { + var role_name: ?[]const u8 = null; + + var i: usize = 0; + while (i < args.len) : (i += 1) { + const arg = args[i]; + if (std.mem.eql(u8, arg, "--role-name")) { + i += 1; + if (i >= args.len) return error.MissingRoleName; + role_name = args[i]; + } else if (std.mem.eql(u8, arg, "--help") or std.mem.eql(u8, arg, "-h")) { + printHelp(options.stdout); + try options.stdout.flush(); + return; + } else { + try options.stderr.print("Unknown option: {s}\n", .{arg}); + try options.stderr.flush(); + return error.UnknownOption; + } + } + + if (role_name == null) { + try options.stderr.print("Error: --role-name is required\n", .{}); + printHelp(options.stderr); + try options.stderr.flush(); + return error.MissingRoleName; + } + + const arn = try getOrCreateRole(role_name.?, options); + defer options.allocator.free(arn); + + try options.stdout.print("{s}\n", .{arn}); + try options.stdout.flush(); +} + +fn printHelp(writer: *std.Io.Writer) void { + writer.print( + \\Usage: lambda-build iam [options] + \\ + \\Create or retrieve an IAM role for Lambda execution. + \\ + \\Options: + \\ --role-name Name of the IAM role (required) + \\ --help, -h Show this help message + \\ + \\If the role exists, its ARN is returned. If not, a new role is created + \\with the AWSLambdaExecute policy attached. + \\ + , .{}) catch {}; +} + +/// Get or create an IAM role for Lambda execution +/// Returns the role ARN +pub fn getOrCreateRole(role_name: []const u8, options: RunOptions) ![]const u8 { + // Note: Profile is expected to be set via AWS_PROFILE env var before invoking this tool + // (e.g., via aws-vault exec) + + var client = aws.Client.init(options.allocator, .{}); + defer client.deinit(); + + // Try to get existing role + const services = aws.Services(.{.iam}){}; + + var diagnostics = aws.Diagnostics{ + .http_code = undefined, + .response_body = undefined, + .allocator = options.allocator, + }; + + const region = options.region orelse "us-east-1"; // IAM is global, but needs a region for signing + _ = region; + + const aws_options = aws.Options{ + .client = client, + .diagnostics = &diagnostics, + }; + + const get_result = aws.Request(services.iam.get_role).call(.{ + .role_name = role_name, + }, aws_options) catch |err| { + defer diagnostics.deinit(); + if (diagnostics.http_code == 404) { + // Role doesn't exist, create it + return try createRole(options.allocator, role_name, client); + } + std.log.err("IAM GetRole failed: {} (HTTP {})", .{ err, diagnostics.http_code }); + return error.IamGetRoleFailed; + }; + defer get_result.deinit(); + + // Role exists, return ARN + return try options.allocator.dupe(u8, get_result.response.role.arn); +} + +fn createRole(allocator: std.mem.Allocator, role_name: []const u8, client: aws.Client) ![]const u8 { + const services = aws.Services(.{.iam}){}; + + const aws_options = aws.Options{ + .client = client, + }; + + const assume_role_policy = + \\{ + \\ "Version": "2012-10-17", + \\ "Statement": [ + \\ { + \\ "Sid": "", + \\ "Effect": "Allow", + \\ "Principal": { + \\ "Service": "lambda.amazonaws.com" + \\ }, + \\ "Action": "sts:AssumeRole" + \\ } + \\ ] + \\} + ; + + std.log.info("Creating IAM role: {s}", .{role_name}); + + const create_result = try aws.Request(services.iam.create_role).call(.{ + .role_name = role_name, + .assume_role_policy_document = assume_role_policy, + }, aws_options); + defer create_result.deinit(); + + const arn = try allocator.dupe(u8, create_result.response.role.arn); + + // Attach the Lambda execution policy + std.log.info("Attaching AWSLambdaExecute policy", .{}); + + const attach_result = try aws.Request(services.iam.attach_role_policy).call(.{ + .policy_arn = "arn:aws:iam::aws:policy/AWSLambdaExecute", + .role_name = role_name, + }, aws_options); + defer attach_result.deinit(); + + // IAM role creation can take a moment to propagate + std.log.info("Role created: {s}", .{arn}); + std.log.info("Note: New roles may take a few seconds to propagate", .{}); + + return arn; +} diff --git a/tools/build/src/invoke.zig b/tools/build/src/invoke.zig new file mode 100644 index 0000000..84ecf2f --- /dev/null +++ b/tools/build/src/invoke.zig @@ -0,0 +1,105 @@ +//! Invoke command - invokes a Lambda function. + +const std = @import("std"); +const aws = @import("aws"); +const RunOptions = @import("main.zig").RunOptions; + +pub fn run(args: []const []const u8, options: RunOptions) !void { + var function_name: ?[]const u8 = null; + var payload: []const u8 = "{}"; + + var i: usize = 0; + while (i < args.len) : (i += 1) { + const arg = args[i]; + if (std.mem.eql(u8, arg, "--function-name")) { + i += 1; + if (i >= args.len) return error.MissingFunctionName; + function_name = args[i]; + } else if (std.mem.eql(u8, arg, "--payload")) { + i += 1; + if (i >= args.len) return error.MissingPayload; + payload = args[i]; + } else if (std.mem.eql(u8, arg, "--help") or std.mem.eql(u8, arg, "-h")) { + printHelp(options.stdout); + try options.stdout.flush(); + return; + } else { + try options.stderr.print("Unknown option: {s}\n", .{arg}); + try options.stderr.flush(); + return error.UnknownOption; + } + } + + if (function_name == null) { + try options.stderr.print("Error: --function-name is required\n", .{}); + printHelp(options.stderr); + try options.stderr.flush(); + return error.MissingFunctionName; + } + + try invokeFunction(function_name.?, payload, options); +} + +fn printHelp(writer: *std.Io.Writer) void { + writer.print( + \\Usage: lambda-build invoke [options] + \\ + \\Invoke a Lambda function. + \\ + \\Options: + \\ --function-name Name of the Lambda function (required) + \\ --payload JSON payload to send (default: empty object) + \\ --help, -h Show this help message + \\ + \\The function response is printed to stdout. + \\ + , .{}) catch {}; +} + +fn invokeFunction(function_name: []const u8, payload: []const u8, options: RunOptions) !void { + // Note: Profile is expected to be set via AWS_PROFILE env var before invoking this tool + // (e.g., via aws-vault exec) + + var client = aws.Client.init(options.allocator, .{}); + defer client.deinit(); + + const services = aws.Services(.{.lambda}){}; + const region = options.region orelse "us-east-1"; + + const aws_options = aws.Options{ + .client = client, + .region = region, + }; + + std.log.info("Invoking function: {s}", .{function_name}); + + const result = try aws.Request(services.lambda.invoke).call(.{ + .function_name = function_name, + .payload = payload, + .log_type = "Tail", + .invocation_type = "RequestResponse", + }, aws_options); + defer result.deinit(); + + // Print response payload + if (result.response.payload) |response_payload| { + try options.stdout.print("{s}\n", .{response_payload}); + } + + // Print function error if any + if (result.response.function_error) |func_error| { + try options.stdout.print("Function error: {s}\n", .{func_error}); + } + + // Print logs if available (base64 decoded) + if (result.response.log_result) |log_result| { + const decoder = std.base64.standard.Decoder; + const decoded_len = try decoder.calcSizeForSlice(log_result); + const decoded = try options.allocator.alloc(u8, decoded_len); + defer options.allocator.free(decoded); + try decoder.decode(decoded, log_result); + try options.stdout.print("\n--- Logs ---\n{s}\n", .{decoded}); + } + + try options.stdout.flush(); +} diff --git a/tools/build/src/main.zig b/tools/build/src/main.zig new file mode 100644 index 0000000..247cd2d --- /dev/null +++ b/tools/build/src/main.zig @@ -0,0 +1,135 @@ +//! Lambda Build CLI +//! +//! A command-line tool for packaging, deploying, and invoking AWS Lambda functions. +//! +//! Usage: lambda-build [options] +//! +//! Commands: +//! package Create deployment zip from executable +//! iam Create/verify IAM role for Lambda +//! deploy Deploy function to AWS Lambda +//! invoke Invoke the deployed function + +const std = @import("std"); +const package = @import("package.zig"); +const iam_cmd = @import("iam.zig"); +const deploy_cmd = @import("deploy.zig"); +const invoke_cmd = @import("invoke.zig"); + +/// Options passed to all commands +pub const RunOptions = struct { + allocator: std.mem.Allocator, + stdout: *std.Io.Writer, + stderr: *std.Io.Writer, + region: ?[]const u8 = null, + profile: ?[]const u8 = null, +}; + +pub fn main() !u8 { + var gpa = std.heap.GeneralPurposeAllocator(.{}){}; + defer _ = gpa.deinit(); + const allocator = gpa.allocator(); + + var stdout_buffer: [4096]u8 = undefined; + var stderr_buffer: [4096]u8 = undefined; + var stdout_writer = std.fs.File.stdout().writer(&stdout_buffer); + var stderr_writer = std.fs.File.stderr().writer(&stderr_buffer); + + var options = RunOptions{ + .allocator = allocator, + .stdout = &stdout_writer.interface, + .stderr = &stderr_writer.interface, + }; + + run(&options) catch |err| { + options.stderr.print("Error: {}\n", .{err}) catch {}; + options.stderr.flush() catch {}; + return 1; + }; + try options.stderr.flush(); + try options.stdout.flush(); + return 0; +} + +fn run(options: *RunOptions) !void { + const args = try std.process.argsAlloc(options.allocator); + defer std.process.argsFree(options.allocator, args); + + if (args.len < 2) { + printUsage(options.stderr); + try options.stderr.flush(); + return error.MissingCommand; + } + + // Parse global options and find command + var cmd_start: usize = 1; + + while (cmd_start < args.len) { + const arg = args[cmd_start]; + if (std.mem.eql(u8, arg, "--region")) { + cmd_start += 1; + if (cmd_start >= args.len) return error.MissingRegionValue; + options.region = args[cmd_start]; + cmd_start += 1; + } else if (std.mem.eql(u8, arg, "--profile")) { + cmd_start += 1; + if (cmd_start >= args.len) return error.MissingProfileValue; + options.profile = args[cmd_start]; + cmd_start += 1; + } else if (std.mem.startsWith(u8, arg, "--")) { + // Unknown global option - might be command-specific, let command handle it + break; + } else { + // Found command + break; + } + } + + if (cmd_start >= args.len) { + printUsage(options.stderr); + try options.stderr.flush(); + return error.MissingCommand; + } + + const command = args[cmd_start]; + const cmd_args = args[cmd_start + 1 ..]; + + if (std.mem.eql(u8, command, "package")) { + try package.run(cmd_args, options.*); + } else if (std.mem.eql(u8, command, "iam")) { + try iam_cmd.run(cmd_args, options.*); + } else if (std.mem.eql(u8, command, "deploy")) { + try deploy_cmd.run(cmd_args, options.*); + } else if (std.mem.eql(u8, command, "invoke")) { + try invoke_cmd.run(cmd_args, options.*); + } else if (std.mem.eql(u8, command, "--help") or std.mem.eql(u8, command, "-h")) { + printUsage(options.stdout); + try options.stdout.flush(); + } else { + options.stderr.print("Unknown command: {s}\n\n", .{command}) catch {}; + printUsage(options.stderr); + try options.stderr.flush(); + return error.UnknownCommand; + } +} + +fn printUsage(writer: *std.Io.Writer) void { + writer.print( + \\Usage: lambda-build [global-options] [options] + \\ + \\Lambda deployment CLI tool + \\ + \\Global Options: + \\ --region AWS region (default: from AWS config) + \\ --profile AWS profile to use + \\ + \\Commands: + \\ package Create deployment zip from executable + \\ iam Create/verify IAM role for Lambda + \\ deploy Deploy function to AWS Lambda + \\ invoke Invoke the deployed function + \\ + \\Run 'lambda-build --help' for command-specific options. + \\ + , .{}) catch {}; +} diff --git a/tools/build/src/package.zig b/tools/build/src/package.zig new file mode 100644 index 0000000..9cad4a1 --- /dev/null +++ b/tools/build/src/package.zig @@ -0,0 +1,265 @@ +//! Package command - creates a Lambda deployment zip from an executable. +//! +//! The zip file contains a single file named "bootstrap" (Lambda's expected name +//! for custom runtime executables). +//! +//! Note: Uses "store" (uncompressed) format because Zig 0.15's std.compress.flate.Compress +//! has incomplete implementation (drain function panics with TODO). When the compression +//! implementation is completed, this should use deflate level 6. + +const std = @import("std"); +const zip = std.zip; +const RunOptions = @import("main.zig").RunOptions; + +pub fn run(args: []const []const u8, options: RunOptions) !void { + var exe_path: ?[]const u8 = null; + var output_path: ?[]const u8 = null; + + var i: usize = 0; + while (i < args.len) : (i += 1) { + const arg = args[i]; + if (std.mem.eql(u8, arg, "--exe")) { + i += 1; + if (i >= args.len) return error.MissingExePath; + exe_path = args[i]; + } else if (std.mem.eql(u8, arg, "--output") or std.mem.eql(u8, arg, "-o")) { + i += 1; + if (i >= args.len) return error.MissingOutputPath; + output_path = args[i]; + } else if (std.mem.eql(u8, arg, "--help") or std.mem.eql(u8, arg, "-h")) { + printHelp(options.stdout); + try options.stdout.flush(); + return; + } else { + try options.stderr.print("Unknown option: {s}\n", .{arg}); + try options.stderr.flush(); + return error.UnknownOption; + } + } + + if (exe_path == null) { + try options.stderr.print("Error: --exe is required\n", .{}); + printHelp(options.stderr); + try options.stderr.flush(); + return error.MissingExePath; + } + + if (output_path == null) { + try options.stderr.print("Error: --output is required\n", .{}); + printHelp(options.stderr); + try options.stderr.flush(); + return error.MissingOutputPath; + } + + try createLambdaZip(options.allocator, exe_path.?, output_path.?); + + try options.stdout.print("Created {s}\n", .{output_path.?}); +} + +fn printHelp(writer: *std.Io.Writer) void { + writer.print( + \\Usage: lambda-build package [options] + \\ + \\Create a Lambda deployment zip from an executable. + \\ + \\Options: + \\ --exe Path to the executable (required) + \\ --output, -o Output zip file path (required) + \\ --help, -h Show this help message + \\ + \\The executable will be packaged as 'bootstrap' in the zip file, + \\which is the expected name for Lambda custom runtimes. + \\ + , .{}) catch {}; +} + +/// Helper to write a little-endian u16 +fn writeU16LE(file: std.fs.File, value: u16) !void { + const bytes = std.mem.toBytes(std.mem.nativeToLittle(u16, value)); + try file.writeAll(&bytes); +} + +/// Helper to write a little-endian u32 +fn writeU32LE(file: std.fs.File, value: u32) !void { + const bytes = std.mem.toBytes(std.mem.nativeToLittle(u32, value)); + try file.writeAll(&bytes); +} + +/// Create a Lambda deployment zip file containing a single "bootstrap" executable. +/// Currently uses "store" (uncompressed) format because Zig 0.15's std.compress.flate.Compress +/// has incomplete implementation. +/// TODO: Add deflate compression (level 6) when the Compress implementation is completed. +fn createLambdaZip(allocator: std.mem.Allocator, exe_path: []const u8, output_path: []const u8) !void { + // Read the executable + const exe_file = try std.fs.cwd().openFile(exe_path, .{}); + defer exe_file.close(); + + const exe_stat = try exe_file.stat(); + const exe_size: u32 = @intCast(exe_stat.size); + + // Allocate buffer and read file contents + const exe_data = try allocator.alloc(u8, exe_size); + defer allocator.free(exe_data); + const bytes_read = try exe_file.readAll(exe_data); + if (bytes_read != exe_size) return error.IncompleteRead; + + // Calculate CRC32 of uncompressed data + const crc = std.hash.crc.Crc32IsoHdlc.hash(exe_data); + + // Create the output file + const out_file = try std.fs.cwd().createFile(output_path, .{}); + defer out_file.close(); + + const filename = "bootstrap"; + const filename_len: u16 = @intCast(filename.len); + + // Reproducible zip files: use fixed timestamp + // September 26, 1995 at midnight (00:00:00) + // DOS time format: bits 0-4: seconds/2, bits 5-10: minute, bits 11-15: hour + // DOS date format: bits 0-4: day, bits 5-8: month, bits 9-15: year-1980 + // + // Note: We use a fixed timestamp for reproducible builds. + // + // If current time is needed in the future: + // const now = std.time.timestamp(); + // const epoch_secs: std.time.epoch.EpochSeconds = .{ .secs = @intCast(now) }; + // const day_secs = epoch_secs.getDaySeconds(); + // const year_day = epoch_secs.getEpochDay().calculateYearDay(); + // const mod_time: u16 = @as(u16, day_secs.getHoursIntoDay()) << 11 | + // @as(u16, day_secs.getMinutesIntoHour()) << 5 | + // @as(u16, day_secs.getSecondsIntoMinute() / 2); + // const month_day = year_day.calculateMonthDay(); + // const mod_date: u16 = @as(u16, year_day.year -% 1980) << 9 | + // @as(u16, @intFromEnum(month_day.month)) << 5 | + // @as(u16, month_day.day_index + 1); + + // 1995-09-26 midnight for reproducible builds + const mod_time: u16 = 0x0000; // 00:00:00 + const mod_date: u16 = (15 << 9) | (9 << 5) | 26; // 1995-09-26 (year 15 = 1995-1980) + + // Local file header + try out_file.writeAll(&zip.local_file_header_sig); + try writeU16LE(out_file, 10); // version needed (1.0 for store) + try writeU16LE(out_file, 0); // general purpose flags + try writeU16LE(out_file, @intFromEnum(zip.CompressionMethod.store)); // store (no compression) + try writeU16LE(out_file, mod_time); + try writeU16LE(out_file, mod_date); + try writeU32LE(out_file, crc); + try writeU32LE(out_file, exe_size); // compressed size = uncompressed for store + try writeU32LE(out_file, exe_size); // uncompressed size + try writeU16LE(out_file, filename_len); + try writeU16LE(out_file, 0); // extra field length + try out_file.writeAll(filename); + + // File data (uncompressed) + const local_header_end = 30 + filename_len; + try out_file.writeAll(exe_data); + + // Central directory file header + const cd_offset = local_header_end + exe_size; + try out_file.writeAll(&zip.central_file_header_sig); + try writeU16LE(out_file, 0x031e); // version made by (Unix, 3.0) + try writeU16LE(out_file, 10); // version needed (1.0 for store) + try writeU16LE(out_file, 0); // general purpose flags + try writeU16LE(out_file, @intFromEnum(zip.CompressionMethod.store)); // store + try writeU16LE(out_file, mod_time); + try writeU16LE(out_file, mod_date); + try writeU32LE(out_file, crc); + try writeU32LE(out_file, exe_size); // compressed size + try writeU32LE(out_file, exe_size); // uncompressed size + try writeU16LE(out_file, filename_len); + try writeU16LE(out_file, 0); // extra field length + try writeU16LE(out_file, 0); // file comment length + try writeU16LE(out_file, 0); // disk number start + try writeU16LE(out_file, 0); // internal file attributes + try writeU32LE(out_file, 0o100755 << 16); // external file attributes (Unix executable) + try writeU32LE(out_file, 0); // relative offset of local header + + try out_file.writeAll(filename); + + // End of central directory record + const cd_size: u32 = 46 + filename_len; + try out_file.writeAll(&zip.end_record_sig); + try writeU16LE(out_file, 0); // disk number + try writeU16LE(out_file, 0); // disk number with CD + try writeU16LE(out_file, 1); // number of entries on disk + try writeU16LE(out_file, 1); // total number of entries + try writeU32LE(out_file, cd_size); // size of central directory + try writeU32LE(out_file, cd_offset); // offset of central directory + try writeU16LE(out_file, 0); // comment length +} + +test "create zip with test data" { + const allocator = std.testing.allocator; + + // Create a temporary test file + var tmp_dir = std.testing.tmpDir(.{}); + defer tmp_dir.cleanup(); + + const test_content = "#!/bin/sh\necho hello"; + const test_exe = try tmp_dir.dir.createFile("test_exe", .{}); + try test_exe.writeAll(test_content); + test_exe.close(); + + const exe_path = try tmp_dir.dir.realpathAlloc(allocator, "test_exe"); + defer allocator.free(exe_path); + + const output_path = try tmp_dir.dir.realpathAlloc(allocator, "."); + defer allocator.free(output_path); + + const full_output = try std.fs.path.join(allocator, &.{ output_path, "test.zip" }); + defer allocator.free(full_output); + + try createLambdaZip(allocator, exe_path, full_output); + + // Verify the zip file can be read by std.zip + const zip_file = try std.fs.cwd().openFile(full_output, .{}); + defer zip_file.close(); + + var read_buffer: [4096]u8 = undefined; + var file_reader = zip_file.reader(&read_buffer); + + var iter = try zip.Iterator.init(&file_reader); + + // Should have exactly one entry + const entry = try iter.next(); + try std.testing.expect(entry != null); + + const e = entry.?; + + // Verify filename length is 9 ("bootstrap") + try std.testing.expectEqual(@as(u32, 9), e.filename_len); + + // Verify compression method is store + try std.testing.expectEqual(zip.CompressionMethod.store, e.compression_method); + + // Verify sizes match test content + try std.testing.expectEqual(@as(u64, test_content.len), e.uncompressed_size); + try std.testing.expectEqual(@as(u64, test_content.len), e.compressed_size); + + // Verify CRC32 matches + const expected_crc = std.hash.crc.Crc32IsoHdlc.hash(test_content); + try std.testing.expectEqual(expected_crc, e.crc32); + + // Verify no more entries + const next_entry = try iter.next(); + try std.testing.expect(next_entry == null); + + // Extract and verify contents + var extract_dir = std.testing.tmpDir(.{}); + defer extract_dir.cleanup(); + + // Reset file reader position + try file_reader.seekTo(0); + + var filename_buf: [std.fs.max_path_bytes]u8 = undefined; + try e.extract(&file_reader, .{}, &filename_buf, extract_dir.dir); + + // Read extracted file and verify contents + const extracted = try extract_dir.dir.openFile("bootstrap", .{}); + defer extracted.close(); + + var extracted_content: [1024]u8 = undefined; + const bytes_read = try extracted.readAll(&extracted_content); + try std.testing.expectEqualStrings(test_content, extracted_content[0..bytes_read]); +}