Amazon Lambda - 别名特定的环境变量

时间:2017-02-05 16:20:32

标签: amazon-web-services aws-lambda

我正在使用AWS Lambda并且可以使用Alias功能指向我们拥有的多个代码促销阶段(例如dev,qa,prod等)。我已将别名设置为与stage相同的名称。大多数这些功能都是从S3或SNS触发的,每个阶段都有不同的实例。

如何设置基于别名的环境变量,以便该函数可以获取特定信息。基本函数(通常是dev)中的env vars设置被转移到所有不适合部署的别名。

我知道如何在API网关中使用阶段变量,但目前的用途不是通过网关。

任何帮助将不胜感激,Thx

4 个答案:

答案 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参数存储而不是环境变量来查找变量。