重新启动服务时,如何自动更新lambda表达式中使用的服务地址?

时间:2018-02-09 21:59:04

标签: amazon-web-services environment-variables aws-lambda amazon-cognito

我在我的应用中使用AWS Cognito进行用户管理。我已经设置了一个触发器,每次用户注册时都会触发Lambda函数。在lambda函数中,我的应用程序中的端点被调用。

问题是当我关闭然后重新启动我的应用程序时,它会获得一个新地址。

如何设置它以便我的所有功能自动更新地址以使用新的实例地址?

1 个答案:

答案 0 :(得分:1)

以下是我用于更新您描述的用例的实例的服务地址的技术:

关键是使用Route 53发布服务端点的EG主机名EG app.example.com。您的Lambda函数应该引用该URL,而不是实例公共DNS。您的实例每次初始化时都必须更新此记录。

为此,请使用实例user data script,并在实例启动时动态更新Route 53上的托管区域。例如,这是我在Ubuntu实例上使用的部分:

wget -q https://github.com/barnybug/cli53/releases/download/0.8.12/cli53-linux-amd64
mv cli53-linux-amd64 /usr/local/bin/cli53
chmod +x /usr/local/bin/cli53
INSTANCE_IP_PRIVATE=`curl -s http://169.254.169.254/latest/meta-data/local-ipv4`
cli53 rrcreate --replace \"", {"Fn::ImportValue" : {"Fn::Sub" : "dns-PrivateHostedZoneId" }},"\" \"app 300 A ${INSTANCE_IP_PRIVATE}\"

鉴于区域example.com,最后一行将使用当前IP创建/更新A记录,主机名app的{​​{1}}为300。

一些注意事项:

  1. 注意第1行,它下载并安装cli53,这是Amazon Route 53的命令行工具.cli53提供BIND格式的导入和导出以及Route 53域的简单命令行管理。 您无法使用AWS CLI轻松完成此操作 - 在一行中!这是一个支持良好的实用程序,已移植到许多平台。

  2. 该片段的最后一部分是CloudFormation语法,用于引用Route 53主机区域ID。如果您没有使用CloudFormation,请使用适合您的任何内容。

  3. 了解DNS记录传播时间和TTL时间。 DNS changes takes less than a minute, and minimum TTL is 60 seconds。在此时间范围内可能会有请求解析为旧的IP。建议使用ELB来防止此问题。或者让Lambda根据需要重试几分钟直到连接。

  4. 此代码段正在更新私有托管区域。您将使用公共托管区域。可以使用相同的技术来查询公共IP。