在Elixir的runtime.exs中配置AWS ECS环境变量遇异常
以下是针对问题的具体排查和修复步骤:
1. 确认运行时的config_env()值
你的runtime.exs代码仅在config_env()为:prod或:stage时才会读取环境变量。如果容器内的运行环境不属于这两个,代码会直接跳过环境变量读取逻辑,导致最终返回默认值"Devs"。
可以在runtime.exs中添加临时输出,验证当前的环境标识:
IO.puts("Current config_env: #{inspect(config_env())}") if config_env() in [:prod, :stage] do environment = System.get_env("ENVIRONMENT") || "Devs" config :lxp, :aws_config, environment: environment end
启动容器后查看日志,确认是否进入了预期的条件分支。
2. 验证ECS容器内的环境变量是否存在
首先确认ECS任务定义中是否正确配置了ENVIRONMENT环境变量(注意大小写,你的代码读取的是大写变量)。其次可以进入运行中的容器,执行以下命令直接查看变量值:
printenv ENVIRONMENT
如果输出为空或不是预期值,说明环境变量未正确注入容器,需要检查ECS任务定义的配置。
3. 修复配置读取的安全写法
当前get_environment函数的写法存在潜在问题:如果:aws_config配置项未被加载(比如config_env()不满足条件),直接取[:environment]会触发KeyError。改成更安全的写法:
defmodule Lxp.AwsConfig do def get_environment do Application.get_env(:lxp, :aws_config, []) |> Keyword.get(:environment, "Devs") end end
这种写法会在配置不存在时返回空列表,再通过Keyword.get安全获取值并设置默认。
4. 确认runtime.exs的加载逻辑
确保你的Elixir发布包(比如通过mix release构建的包)正确使用runtime.exs加载运行时配置。如果发布过程中把配置提前编译进了包内,会导致runtime.exs无法在容器启动时读取环境变量。可以检查发布配置,确认runtime.exs被正确包含在发布流程中。
5. 本地模拟环境测试
在本地设置环境变量后启动项目,验证代码逻辑是否正常:
ENVIRONMENT=prod mix phx.server
然后在终端或代码中调用Lxp.AwsConfig.get_environment(),如果能返回"prod",说明代码逻辑本身没有问题,问题出在ECS容器的环境配置上。
内容的提问来源于stack exchange,提问作者backin

