放大获取 lambda 中的托管 URL 作为环境变量

Posted

技术标签:

【中文标题】放大获取 lambda 中的托管 URL 作为环境变量【英文标题】:Amplify get Hosting URL in lambda as environment variable 【发布时间】:2020-04-02 19:39:20 【问题描述】:

我需要使用放大 cli 添加的 Cloudfront 分发的 URL 作为环境变量。 状态:

我发现了如何在我的函数配置下的文件“api-cloudformation-template.json”中添加模板变量。 “hosting/S3AndCloudFront/template.json”的期望输出变量是CloudFrontSecureURL。 所以我在 lambda 配置文件中添加了行,如下所示:

 
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "Lambda resource stack creation using Amplify CLI",
    "Parameters": 
        ...
        "hostingS3AndCloudFrontHostingBucketName":  // working example
            "Type": "String",
            "Default": "hostingS3AndCloudFrontHostingBucketName"
        ,
        "hostingS3AndCloudFrontCloudFrontSecureURL":  // my example
            "Type": "String",
            "Default": "hostingS3AndCloudFrontCloudFrontSecureURL"
        ,
    ,
    "Resources": 
        "LambdaFunction": 
            "Type": "AWS::Lambda::Function",
            "Metadata": 
                "aws:asset:path": "./src",
                "aws:asset:property": "Code"
            ,
            "Properties": 
                ...
                "Environment": 
                    "Variables": 
                        ...
                        "HOSTING_S3ANDCLOUDFRONT_HOSTINGBUCKETNAME": 
                            "Ref": "hostingS3AndCloudFrontHostingBucketName"
                        ,
                        "HOSTING_S3ANDCLOUDFRONT_CLOUDFRONTSECUREURL": 
                            "Ref": "hostingS3AndCloudFrontCloudFrontSecureURL"
                        
                    
                ,

            
        
    ....
    ,
    ....

发布功能后,我在process.env.HOSTING_S3ANDCLOUDFRONT_CLOUDFRONTSECUREURL 中得到hostingS3AndCloudFrontCloudFrontSecureURL(默认值)。

【问题讨论】:

您能否发布您正在关注的教程,您正在尝试将“cloudfront”网址作为环境变量传递给 lambda,但您没有得到它,因为在通过放大部署,对吗? 【参考方案1】:

尝试使用模板的Outputs 部分以及Fn::ImportValue 函数文档HERE

CloudFront 堆栈:


   ...
   "Outputs" : 
     "CloudfrontDomainOutput" : 
       "Description" : "The cloudfront domain",
       "Value" :  
           "Fn::GetAtt": [
                           "hostingS3AndCloudFrontCloudFrontSecureURL",
                           "DomainName"
                          ]
       ,
       "Export" : 
         "Name" : "Fn::Sub": "$AWS::StackName-hostingS3AndCloudFrontCloudFrontSecureURL" 
       
    


Lambda 堆栈




  ...
   "Environment": 
       "Variables": 
               "HOSTING_S3ANDCLOUDFRONT_HOSTINGBUCKETNAME": 
                   "Ref": "hostingS3AndCloudFrontHostingBucketName"
                ,
                "HOSTING_S3ANDCLOUDFRONT_CLOUDFRONTSECUREURL": 
                      "Fn::ImportValue" : "Fn::Sub" : "$CloudFront_Stack_Name-hostingS3AndCloudFrontCloudFrontSecureURL"
                
         
     

【讨论】:

这行不通。因为hostingS3AndCloudFrontCloudFrontSecureURL 是一个参数。我们使用ref 引用参数。你说什么 @ArunK 你说得对,谢谢你指出这一点,我已经更新了我的回复,你能做一个跨堆栈引用吗? 语法看起来不错,要使其正常工作,cloudfront 必须是使用 cloudformation 创建的,并且应该导出 url。

以上是关于放大获取 lambda 中的托管 URL 作为环境变量的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个 lambda 函数来更新放大的新记录?

放大不拉取远程 Lambda 更改

AWS Lambda nodejs 函数中的事件对象为空

使用托管对象中的集合作为获取结果控制器的数据

如何从AWS Lambda检索数据并将其显示在AWS S3托管的静态网站上?

从 Lambda 中的 S3 通知事件获取非 ASCII 文件名