如何通过AWS SAM重命名AWS Lambda函数名称且不更改其Function URL?
我正在使用以下AWS SAM模板:
Resources: PaymentFunction: Type: 'AWS::Serverless::Function' Properties: FunctionName: payment_function CodeUri: PaymentFunction/ Description: 'A lambda function to do a payment' ... ... ... FunctionUrlConfig: AuthType: NONE Cors: AllowOrigins: - "*" AllowHeaders: - "*" AllowMethods: - "*" Outputs: PaymentFunctionUrl: Value: Fn::GetAtt: PaymentFunctionUrl.FunctionUrl
当我使用aws sam deploy命令部署该函数时,会得到如下格式的Function URL:https://{random_string}.lambda-url.{aws_region}.on.aws/。每当我更改LogicalResourceId(即PaymentFunction)或实际函数名称(即payment_function)时,都会生成新的{random_string},也就是新的Function URL。请问是否可以在不更改Function URL的前提下重命名函数名称?
好问题!这其实涉及到AWS SAM管理资源的逻辑以及Lambda Function URL的绑定机制,我来给你分情况说明解决方案:
1. 仅修改物理函数名称(FunctionName属性)——完全可以保留URL
如果只是想把函数的物理名称(比如从payment_function改成new_payment_function),但保持模板里的LogicalResourceId(也就是PaymentFunction)不变,那么SAM会执行资源更新操作,而不是删除旧资源再创建新资源。
Lambda Function URL是直接绑定到Lambda函数资源本身的,只要这个资源没有被删除重建,URL就会保持不变。你只需要修改模板里的FunctionName字段,然后重新运行aws sam deploy即可,部署完成后Function URL不会有任何变化。
2. 修改LogicalResourceId——无法直接保留原生URL,需用替代方案
如果你要修改模板里的LogicalResourceId(比如把PaymentFunction改成NewPaymentFunction),SAM会将原有的PaymentFunction资源标记为删除,然后创建一个全新的Lambda函数资源。这种情况下,原生的Function URL必然会变化,因为新资源是完全独立的。
如果必须修改LogicalResourceId同时希望对外的访问地址不变,推荐使用自定义域名来映射Function URL:
- 你可以在AWS控制台或通过SAM模板配置Lambda Function URL的自定义域名,将一个固定的域名(比如
payment.yourdomain.com)指向当前的Function URL。 - 后续无论你怎么修改函数的LogicalResourceId或物理名称,只要将新的Function URL重新映射到这个自定义域名,用户依然可以通过固定的自定义域名访问服务,无需关心原生Lambda URL的变化。
额外补救提示
如果已经不小心修改了LogicalResourceId导致URL变更,有两种可行的补救方式:
- 改回原来的
LogicalResourceId,重新部署,这样会恢复原来的Function URL; - 配置自定义域名并切换到该域名作为对外访问地址,后续就不用依赖原生的随机URL了。
内容的提问来源于stack exchange,提问作者Vikku




