【问题标题】:Amazon Lambda - Alias specific environment variablesAmazon Lambda - 别名特定的环境变量
【发布时间】:2017-06-22 14:27:49
【问题描述】:

我正在使用 AWS Lambda,并且可以使用 Alias 功能来指向我们拥有的多个代码提升阶段(例如 dev、qa、prod 等)。我已经设置了与阶段同名的别名。这些函数中的大多数都是从 S3 或 SNS 触发的,每个阶段都有不同的实例。

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

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

任何帮助将不胜感激,谢谢

【问题讨论】:

  • 我目前遇到了同样的问题,我们在 Amazon Connect 中使用 Lambda,我们需要开始使用别名来表示不同的环境。对于我的用例,我将使用代码中的配置文件将环境变量定义为部署包的一部分。对于任何安全信息,我将利用 Secrets Manager 来存储令牌/密钥/凭证。 This article 有一些非常好的信息,我会在构建它时参考,你

标签: amazon-web-services aws-lambda


【解决方案1】:

lambda 上下文具有 invoked_function_arn – 用于调用函数的 Amazon 资源名称 (ARN)。指示调用者是否指定了版本号或别名。

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

【讨论】:

    【解决方案2】:

    编辑我将把这个答案留在这里,因为它可能对某些人有所帮助,但请注意,我发现 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】:

      我也觉得有趣的是,这不是别名计划的一部分,但是您的代码中确实有可用的上下文 - Context.InvokedFunctionArn

      我认为 MINDSET 是您可以调用例如 S3 存储桶并具有 TEST 或 DEV 或 PROD 前缀(基于上下文 InvokedFunctionArn 您知道哪个别名)。鉴于此上下文和基于 ARN 的安全性,您可以使用存储桶策略/IAM 来限制您的 TEST ARN 只能访问 TEST s3 前缀文件。这解决了环境之间的安全问题。

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

      虽然这可行,但前缀等额外条件的复杂性很多时候会被错误配置 - 拥有一个单独的存储桶似乎更安全,并且更好地匹配无服务器应用程序模型文档。

      【讨论】:

      • 这是我想做的,但看起来有点乱。我想如果没有其他办法......
      【解决方案4】:

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

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

      【讨论】:

      • 感谢您的回复。只是想确保我在这里没有遗漏任何东西。我完全按照您的建议进行操作,但问题是要保持代码同步,因为我们还没有任何自动化功能。这将是对 AWS Lambda 恕我直言的非常好的补充。
      • 关于版本控制和别名 lambda 的 AWS 文档如何将其主要示例用例作为每个环境的别名并从一个环境升级到另一个环境,但缺少环境特定变量,这很有趣。需要引入环境变量的那一刻,别名和版本控制完全崩溃了。
      • 这可能多年来已经改变,但 AWS 现在明确建议使用单独的帐户作为管理环境的方式:aws.amazon.com/blogs/compute/… 但如果要求使用一个帐户,则需要构建环境变量像其他 cmets 建议的那样,将每个版本设置到您的部署过程中
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-17
      • 2018-01-17
      • 2014-08-28
      • 2018-10-29
      • 2023-03-28
      • 2014-11-13
      相关资源
      最近更新 更多