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

Amazon web services Amazon Lambda-特定于别名的环境变量,amazon-web-services,aws-lambda,Amazon Web Services,Aws Lambda,我使用的是AWS Lambda,可以使用Alias功能指向我们拥有的多个代码升级阶段(例如开发、qa、prod等)。我已将别名设置为与stages相同的名称。这些函数中的大多数都是从S3或SNS触发的,每个阶段都有不同的实例 如何设置基于别名的环境变量,以便函数可以获取特定信息。基本函数(通常是dev)中的env vars设置会转移到所有不适用于部署的别名 我知道如何在API网关中使用阶段变量,但当前的使用不是通过网关 任何帮助都将不胜感激,Thx我不相信有办法实现您的目标。您需要发布三个版本的

我使用的是AWS Lambda,可以使用Alias功能指向我们拥有的多个代码升级阶段(例如开发、qa、prod等)。我已将别名设置为与stages相同的名称。这些函数中的大多数都是从S3或SNS触发的,每个阶段都有不同的实例

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

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


任何帮助都将不胜感激,Thx

我不相信有办法实现您的目标。您需要发布三个版本的Lambda函数,每个版本都有正确的环境变量,并将每个别名指向函数的正确版本


在将别名指向版本之前,您可以使用描述字段来帮助描述版本,以使更改更易于理解。

我还发现有趣的是,这不是别名计划的一部分,但是您的代码中有可用的上下文-context.InvokedFunctionArn

我认为您的想法是,例如,您可以调用一个S3 bucket,并且有一个前缀TEST、DEV或PROD(基于context invokedfunction,您知道哪个别名)。基于此上下文和基于ARN的安全性,您可以使用bucket policy/IAM限制您的测试ARN只能访问测试s3前缀文件。这解决了环境之间的安全问题

注意:我不同意这个模型,并且认为环境变量应该在别名中,如果别名中没有指定,则返回到版本中


尽管这是可行的,但前缀等附加条件的复杂性在很多情况下都会被错误配置——使用单独的bucket似乎更安全,并且更符合无服务器应用程序模型文档

编辑我将这个答案留在这里,因为它可能会帮助一些人,但请注意,我发现了
aspnetcorestupmode。FirstRequest
导致冷启动时间延长了几秒钟


我向lambdaintrypoint添加了一些代码,以在启动时获取别名,这意味着您可以使用它加载特定于环境的配置:

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>();
    }
}
公共类lambdaintrypoint:Amazon.Lambda.AspNetCoreServer.APIGatewayProxyFunction
{
私有ILambdaContext LambdaContext;
公共lambdaintrypoint()
:base(aspnetcorestupmode.FirstRequest)
{
}
[LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.Json-serializer))]

public override async Task

lambda上下文已调用函数\u arn
–用于调用函数的Amazon资源名(arn)。指示调用程序是否指定了版本号或别名


然后,您可以使用别名通过Systems Manager参数存储来查找变量,而不是环境变量。

谢谢您的回复。我只是想确保我没有遗漏任何内容。我完全按照您建议的方式使用它,但问题是保持代码同步,因为我们还没有任何自动化。这将是一个非常好的解决方案AWS Lambda imho的补充。有趣的是,版本控制和别名Lambda上的AWS文档的主要示例用例为每个环境都有一个别名,并从一个环境升级到另一个环境,但缺少特定于环境的变量。在需要引入环境变量时,别名和版本控制就完全分离了。这可能多年来有所改变,但AWS现在明确建议使用单独的帐户作为管理环境的方式:但如果要求使用一个帐户,则需要将每个版本的环境变量设置构建到部署过程中,就像其他评论所暗示的那样。这是我正在考虑的做法,但这是错误的看起来有点混乱。我想如果没有其他方法的话……我现在遇到了同样的问题,我们在Amazon Connect中使用Lambdas,我们需要开始使用别名来表示不同环境之间的关系。对于我的用例,我将在代码中使用配置文件来定义环境变量,作为部署包的一部分。F或者任何安全信息,我将利用Secrets Manager来存储令牌/密钥/凭据。有一些关于这方面的非常好的信息,我将在构建此信息时参考,并且