我正在使用AWS Lambda并且可以使用Alias功能指向我们拥有的多个代码促销阶段(例如dev,qa,prod等)。我已将别名设置为与stage相同的名称。大多数这些功能都是从S3或SNS触发的,每个阶段都有不同的实例。
如何设置基于别名的环境变量,以便该函数可以获取特定信息。基本函数(通常是dev)中的env vars设置被转移到所有不适合部署的别名。
我知道如何在API网关中使用阶段变量,但目前的用途不是通过网关。
任何帮助将不胜感激,Thx
答案 0 :(得分:7)
我不相信有办法实现你想要的目标。您需要使用正确的环境变量发布Lambda函数的三个版本,并将每个别名指向函数的正确版本。
在将别名指向它们之前,您可以使用说明字段来帮助描述版本,以使更改更容易理解。
答案 1 :(得分:4)
我也觉得有趣的是,这不是别名计划的一部分,但是你的代码中确实有上下文 - Context.InvokedFunctionArn
我认为MINDSET是你可以调用例如S3存储桶并且具有TEST或DEV或PROD的前缀(基于上下文InvokedFunctionArn,你知道哪个别名)。鉴于此上下文和基于ARN的安全性,您可以使用存储桶策略/ IAM来限制您的TEST ARN只能达到TEST s3前缀文件。这解决了环境之间的安全问题。
注意:我不同意这个模型,并认为环境变量应该是别名,如果没有在别名中指定,则回归到版本中的内容。
虽然这有效,但是前缀等附加条件的复杂性很多时候会被错误配置 - 拥有一个单独的存储桶似乎更安全,并且更好地匹配无服务器应用程序模型文档。
答案 2 :(得分:0)
编辑,我将在此处保留此答案,因为它可能对某些人有帮助,但请注意,我发现AspNetCoreStartupMode.FirstRequest
导致冷启动时间延长了几秒钟。
我向LambdaEntryPoint添加了一些代码以在启动时获取别名,这意味着您可以使用它来加载特定于环境的配置:
public class LambdaEntryPoint : Amazon.Lambda.AspNetCoreServer.APIGatewayProxyFunction
{
private ILambdaContext LambdaContext;
public LambdaEntryPoint()
: base(AspNetCoreStartupMode.FirstRequest)
{
}
[LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]
public override async Task<APIGatewayProxyResponse> FunctionHandlerAsync(APIGatewayProxyRequest request, ILambdaContext lambdaContext)
{
LambdaContext = lambdaContext;
return await base.FunctionHandlerAsync(request, lambdaContext);
}
protected override void Init(IWebHostBuilder builder)
{
var alias = LambdaContext?.InvokedFunctionArn.Substring(LambdaContext.InvokedFunctionArn.LastIndexOf(":") + 1);
// Do stuff based on the environment
builder
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.AddJsonFile($"appsettings.{alias}.json", optional: true, reloadOnChange: true);
})
.UseStartup<Startup>();
}
}
我在这里添加了要点:https://gist.github.com/secretorange/710375bc62bbc1f32e05822f55d4e8d3
答案 3 :(得分:0)
lambda上下文具有invoked_function_arn
–用于调用该函数的Amazon资源名称(ARN)。指示调用者是否指定了版本号或别名。
然后您可以使用别名通过Systems Manager参数存储而不是环境变量来查找变量。