forked from lobo/lambda-zig
avoid checking for region until necessary
This commit is contained in:
parent
f86bafc533
commit
a8a560a480
|
@ -93,7 +93,10 @@ pub fn configureBuild(b: *std.Build, exe: *std.Build.Step.Compile, function_name
|
||||||
const iam_step = b.step("awslambda_iam", "Create/Get IAM role for function");
|
const iam_step = b.step("awslambda_iam", "Create/Get IAM role for function");
|
||||||
iam_step.dependOn(&iam.step);
|
iam_step.dependOn(&iam.step);
|
||||||
|
|
||||||
const region = b.option([]const u8, "region", "Region to use [default is autodetect from environment/config]") orelse try findRegionFromSystem(b.allocator);
|
var region = @import("lambdabuild/Region.zig"){
|
||||||
|
.allocator = b.allocator,
|
||||||
|
.specified_region = b.option([]const u8, "region", "Region to use [default is autodetect from environment/config]"),
|
||||||
|
};
|
||||||
|
|
||||||
// Deployment
|
// Deployment
|
||||||
const deploy = Deploy.create(b, .{
|
const deploy = Deploy.create(b, .{
|
||||||
|
@ -101,7 +104,7 @@ pub fn configureBuild(b: *std.Build, exe: *std.Build.Step.Compile, function_name
|
||||||
.package = package_step.packagedFileLazyPath(),
|
.package = package_step.packagedFileLazyPath(),
|
||||||
.arch = exe.root_module.resolved_target.?.result.cpu.arch,
|
.arch = exe.root_module.resolved_target.?.result.cpu.arch,
|
||||||
.iam_step = iam,
|
.iam_step = iam,
|
||||||
.region = region,
|
.region = ®ion,
|
||||||
});
|
});
|
||||||
deploy.step.dependOn(&package_step.step);
|
deploy.step.dependOn(&package_step.step);
|
||||||
|
|
||||||
|
@ -115,7 +118,7 @@ pub fn configureBuild(b: *std.Build, exe: *std.Build.Step.Compile, function_name
|
||||||
const invoke = Invoke.create(b, .{
|
const invoke = Invoke.create(b, .{
|
||||||
.name = function_name,
|
.name = function_name,
|
||||||
.payload = payload,
|
.payload = payload,
|
||||||
.region = region,
|
.region = ®ion,
|
||||||
});
|
});
|
||||||
invoke.step.dependOn(&deploy.step);
|
invoke.step.dependOn(&deploy.step);
|
||||||
const run_step = b.step("awslambda_run", "Run the app in AWS lambda");
|
const run_step = b.step("awslambda_run", "Run the app in AWS lambda");
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
|
const Region = @import("Region.zig");
|
||||||
const aws = @import("aws").aws;
|
const aws = @import("aws").aws;
|
||||||
|
|
||||||
const Deploy = @This();
|
const Deploy = @This();
|
||||||
|
@ -22,7 +23,7 @@ pub const Options = struct {
|
||||||
iam_step: *@import("Iam.zig"),
|
iam_step: *@import("Iam.zig"),
|
||||||
|
|
||||||
/// Region for deployment
|
/// Region for deployment
|
||||||
region: []const u8,
|
region: *Region,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub fn create(owner: *std.Build, options: Options) *Deploy {
|
pub fn create(owner: *std.Build, options: Options) *Deploy {
|
||||||
|
@ -92,7 +93,7 @@ fn make(step: *std.Build.Step, node: std.Progress.Node) anyerror!void {
|
||||||
const options = aws.Options{
|
const options = aws.Options{
|
||||||
.client = client,
|
.client = client,
|
||||||
.diagnostics = &diagnostics,
|
.diagnostics = &diagnostics,
|
||||||
.region = self.options.region,
|
.region = try self.options.region.region(),
|
||||||
};
|
};
|
||||||
|
|
||||||
aws.globalLogControl(.info, .warn, .info, true);
|
aws.globalLogControl(.info, .warn, .info, true);
|
||||||
|
@ -128,7 +129,7 @@ fn make(step: *std.Build.Step, node: std.Progress.Node) anyerror!void {
|
||||||
const base64_bytes = encoder.encode(base64_buf, bytes);
|
const base64_bytes = encoder.encode(base64_buf, bytes);
|
||||||
const options = aws.Options{
|
const options = aws.Options{
|
||||||
.client = client,
|
.client = client,
|
||||||
.region = self.options.region,
|
.region = try self.options.region.region(),
|
||||||
};
|
};
|
||||||
const arm64_arch = [_][]const u8{"arm64"};
|
const arm64_arch = [_][]const u8{"arm64"};
|
||||||
const x86_64_arch = [_][]const u8{"x86_64"};
|
const x86_64_arch = [_][]const u8{"x86_64"};
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
const aws = @import("aws").aws;
|
const aws = @import("aws").aws;
|
||||||
|
const Region = @import("Region.zig");
|
||||||
const Invoke = @This();
|
const Invoke = @This();
|
||||||
|
|
||||||
step: std.Build.Step,
|
step: std.Build.Step,
|
||||||
|
@ -16,7 +16,7 @@ pub const Options = struct {
|
||||||
payload: []const u8,
|
payload: []const u8,
|
||||||
|
|
||||||
/// Region for deployment
|
/// Region for deployment
|
||||||
region: []const u8,
|
region: *Region,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub fn create(owner: *std.Build, options: Options) *Invoke {
|
pub fn create(owner: *std.Build, options: Options) *Invoke {
|
||||||
|
@ -50,7 +50,7 @@ fn make(step: *std.Build.Step, node: std.Progress.Node) anyerror!void {
|
||||||
|
|
||||||
const options = aws.Options{
|
const options = aws.Options{
|
||||||
.client = client,
|
.client = client,
|
||||||
.region = self.options.region,
|
.region = try self.options.region.region(),
|
||||||
};
|
};
|
||||||
const call = try aws.Request(services.lambda.invoke).call(.{
|
const call = try aws.Request(services.lambda.invoke).call(.{
|
||||||
.function_name = self.options.name,
|
.function_name = self.options.name,
|
||||||
|
|
55
lambdabuild/Region.zig
Normal file
55
lambdabuild/Region.zig
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
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;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user