aws lambda使用_使用AWS Lambda,S3和AWS CloudFront进行动态内容缓存

aws lambda使用

快速提供内容对于任何网站或应用程序具有更好的客户体验都是必不可少的。 如果您将网站或应用程序托管在AWS Cloud中,那么无论从何处访问应用程序,都可以以较低的延迟快速提供内容。 AWS提供了CloudFront服务,用于将内容缓存在每个用户地理位置本地的边缘位置。

在此示例中,我们将向您展示如何使用AWS Lambda函数检索和转换图像,如何在CloudFront边缘位置本地缓存以及如何在原始服务器中更新缓存的图像时使这些缓存无效。 该方法可以应用于任何其他类型的内容。

1.什么是Amazon CloudFront?

Amazon CloudFront是AWS(Amazon Web Services)提供的内容交付网络(CDN)Web服务,它允许通过全球范围内的多个边缘位置访问内容。 Amazon CloudFront当前提供149个边缘位置和11个区域边缘缓存 。

2.什么是AWS Lambda?

AWS Lambda是一个事件驱动的无服务器计算平台,该平台运行代码而无需置备或管理服务器。 AWS Lambda根据事件触发器执行代码(功能)。 例如,一个简单的用例是,每次将图像上传到S3存储桶时,都可以触发Lambda函数来转换和调整图像大小。 AWS Lambda函数也可以通过AWS API Gateway内置的API执行。

3.什么是Amazon S3?

AWS S3(简单存储服务)是一种低成本,安全,耐用,高可用性和水平可扩展的对象存储服务,可以在其中存储,访问和轻松备份数据。 您可以从任何地方存储任何数量的信息。

4.从Origin Server获取图像并将其存储在S3中

假设您有一个媒体服务器,该服务器托管您的网站所需的所有图像,并假定该服务器能够在更新现有图像或添加新图像时触发通知。 使用AWS Lambda,可以对这些图像进行检索,转换,调整大小并将其存储到S3存储桶中。

动态内容缓存-从原始服务器获取图像
图1:使用Lambda从Origin Server获取图像

上面的图1显示了AWS Lambda函数,该函数从Media服务器检索原始图像,进行转换并将其发布到S3存储桶。 它还会侦听Message Queue以获取Media Server发布的图像更新,并在S3中刷新图像。

5.使用Amazon CloudFront缓存内容

Amazon CloudFront可以通过边缘缓存加快内容交付速度。 当用户访问您的网站或应用程序并请求内容时,请求将被路由到最近的CloudFront边缘位置。 仅对于第一个用户,在检索内容时会有延迟,并且相同内容的所有后续用户将能够快速检索内容,因为内容将被缓存在边缘位置。

以下是用户对内容的请求发生的过程:

  • CloudFront在其缓存中检查所请求的对象。 如果在缓存中找到请求的对象,则将其返回。
  • 如果在CloudFront缓存中找不到请求的对象,
    • 该请求将被重定向到配置的原始服务器
    • CloudFront将从Origin Server返回的对象缓存在最近的边缘位置,然后返回给用户。

可以将CloudFront中的对象缓存为已配置的TTL(生存时间),一旦TTL过期,该对象将不再可用于从缓存中提供服务,如图2所示。

动态内容缓存-缓存图像内容
图2:使用CloudFront缓存图像内容

6.如何在AWS控制台上配置CloudFront

要配置CloudFront,必须先创建CloudFront分配。 选择“ Web分发”进行内容分发,然后选择“ RMTP”分发进行流媒体文件。 对于这种情况,让我们选择Web分发。

6.1创建CloudFront分配

登录到AWS控制台->选择CloudFront服务->创建分配->选择Web分配->入门

要将S3用作原始服务器,请为原始域名选择已创建的S3存储桶。 对于“ 原始路径”,输入存储对象的目录路径。 要将自定义HTTP Server用作源服务器,请为“ 源域名”输入自定义源服务器的DNS名称,为“ 源路径 ”输入上下文路径。

要将S3用作原始服务器,请为原始域名选择已创建的S3存储桶。 对于“ 原始路径”,输入存储对象的目录路径。 要将自定义HTTP Server用作原始服务器,请为Origin Domain Name输入自定义原始服务器的DNS名称,并为Origin Path输入上下文路径,如图3所示。

动态内容缓存-创建CloudFront分发
图3:从AWS控制台创建CloudFront分配

6.2缓存行为设置

如果只允许HTTPS访问,则启用将HTTP重定向到HTTPS。对象缓存中,如果选择了“使用原始缓存标头”,则CloudFront将使用原始服务器响应中的缓存控制标头( max-age ),除非还返回了“ s-max-age ”,在这种情况下为s-max-使用年龄

如果选择Customize (针对Object Caching ),则可以配置Minimum TTL,Maximum TTL和Default TTL,如图4所示。

  • 最小TTL是在CloudFront将请求转发到Origin Server之前,对象停留在缓存中的时间(以秒为单位)。 即使Origin Server的Cache-Control标头的值较低,对象也会被缓存最少的时间。
  • 最大TTL是在CloudFront将请求转发到Origin Server之前,对象停留在缓存中的时间(以秒为单位)。 最大TTL仅在原始服务器返回缓存控制标头时才有效。 即使Origin Server的Cache-Control标头具有更高的值,对象的缓存时间也不会超过此时间。
  • 仅当Origin Server不返回任何缓存控制标头时,默认TTL才有效。
动态内容缓存-缓存行为设置
图4: CloudFront分发上的缓存行为设置

6.3查询参数白名单

当您不想按所有查询参数缓存图像或内容,而仅按少数查询参数缓存时,可以将CloudFront配置为仅通过查询字符串白名单按选定的查询参数缓存,如图5所示,因此只有那些查询参数会包含在缓存键中。 仍然将所有查询参数转发到原始服务器。

动态内容缓存-白名单查询参数
图5 :CloudFront中的白名单查询参数

创建一个Alias记录以使用CloudFront分布Url映射Route53 CNAME记录,因此对Alias的请求将映射到CloudFront分布,然后再映射到原点。

7.使CloudFront中的缓存对象无效

一旦将对象缓存在CloudFront中,它们将保留在缓存中,直到缓存TTL过期为止。 如果在原始服务器中更新了一个对象,CloudFront不会知道这一点,但是会继续从其缓存中为过时的对象提供服务。 为了避免提供过时的数据对象,CloudFront允许通过不同方式使对象缓存无效。

在AWS文档中 ,您一次可以对每个分发进行多达3,000个文件的失效请求,每个失效请求可以包括多达3000个URL。 请注意,在启动CloudFront缓存失效后,CloudFront需要几分钟的时间才能从所有边缘位置删除对象。 即可能需要一些时间才能获得无效的结果。 失效所需的时间取决于失效请求中包含的对象URL的数量。

7.1通过AWS控制台使对象无效

以下是使来自AWS Console的缓存对象无效的步骤。

  • 登录到AWS管理控制台并打开CloudFront控制台
  • 选择您要使文件无效的分发。
  • 选择分发设置,然后选择无效选项卡。
  • 选择创建无效并输入无效路径,例如“ originserver / image / IMG54330080 *”。 该通配符路径将删除为imageId“ IMG54330080

7.2使用CLI(命令行界面)使对象无效

以下命令为给定分发ID的CloudFront分发创建无效。 命令语法:

aws cloudfront create-invalidation --DistributionId --paths

例:

aws cloudfront create-invalidation --distribution-id K14EK9G5DZUEWO  --paths /originserver/image/IMG54330080*

{"Location": "https://cloudfront.amazonaws.com/2019-01-25/distribution/K14EK9G5DZUEWO/invalidation/IUNZX941WYQR8","Invalidation": {"Id": "IUNZX941WYQR8","Status": "InProgress","CreateTime": "2019-01-17T17:07:57.636Z","InvalidationBatch": {"Paths": {"Quantity": 1,"Items": ["/originserver/image/IMG54330080*"]},"CallerReference": "cli-324234242-463845"}}}

7.3通过AWS开发工具包使对象无效

以下Java代码段用于通过Amazon SDK使对象无效。

AWSCredentials awsCredentials = new DefaultAWSCredentialsProviderChain().getCredentials();AmazonCloudFrontClient client = new AmazonCloudFrontClient(awsCredentials);Paths invalidation_paths = new Paths().withItems("/originserver/image/IMG54330080*", "/image/path/imageA.jpg").withQuantity(1);InvalidationBatch invalidation_batch = new InvalidationBatch(invalidation_paths, "Asset_Image_Cache");CreateInvalidationRequest invalidation = new CreateInvalidationRequest("distributionID", invalidation_batch);CreateInvalidationResult ret = client.createInvalidation(invalidation);System.out.println("Invalidation result: " + ret.toString());

如果您将CloudFront配置为将查询参数转发到Origin Server,则在使文件无效时必须包含查询参数,因为CacheKey是使用创建缓存时包含的查询参数创建的。 例如

http://cdn.originserver.com/image/IMG54330080?category=headshot&type=high-resolution&width=220&height=330&aspectRatio=3.5

或者,您可以在无效网址中使用通配符*。 请注意,在这种情况下,所有具有与URL(带通配符)匹配的CacheKeys的缓存条目都将失效。 例如

http://cdn.originserver.com/image/IMG54330080*

当新对象/更新对象上载到S3时,AWS Lambda函数还可用于使CloudFront对象无效。

如图6所示,将更新的对象上载到S3时,它将触发Lambda函数,该函数会使CloudFront缓存中的对象无效。

动态内容缓存-使CloudFront对象无效
图6 :通过Lambda函数使CloudFront对象无效

8.总结

AWS CloudFront是一项功能强大的内容缓存服务,可为您的网站或应用程序的用户快速提供内容,而无需担心网站或应用程序的托管位置以及用户从何处访问您的应用程序。 将此服务与Lambda,S3等其他AWS服务一起使用可帮助创建动态缓存,因此可以将近实时数据快速提供给用户。 如果需要,还可以使CloudFront对象缓存无效。

翻译自: https://www.javacodegeeks.com/2019/02/dynamic-content-caching-with-aws-lambda-s3-and-aws-cloudfront.html

aws lambda使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332554.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android+阴影+xml,Android 阴影视图 ShadowViewHelper

软件介绍ShadowViewHelper 是 Android 的阴影布局。xml:android:id"id/activity_main_shadow_view_b"android:layout_width"wrap_content" android:layout_height"wrap_content"android:layout_gravity"center"android:layout_marginT…

docker-compose观察实时日志_基于 Flink SQL CDC 的实时数据同步方案

整理:陈政羽(Flink 社区志愿者) Flink 1.11 引入了 Flink SQL CDC,CDC 能给我们数据和业务间能带来什么变化?本文由 Apache Flink PMC,阿里巴巴技术专家伍翀 (云邪)分享,内容将从传统的数据同步方案,基于 F…

android dialog 字体,android – 为AlertDialog的MultiSelectItems设置自定义字体(字体)

AlertDialog.Builder使用AlertController.AlertParams构建对话框.我检查了AlertDialog.Builder #create()调用AlertController.AlertParams #application()如果设置了项目,则创建ListView并分配适配器(AlertParams#createListView()).我基于createListView源创建了自定义适配器…

困难是成功路上的垫脚石_Java是开发的垫脚石。 学习吧!

困难是成功路上的垫脚石Java是全世界使用最广泛的编程语言之一 。 尽管也有很多其他编程语言,但是没有什么可以比Java更好的了。 Java是用于开发移动应用程序,游戏,Web应用程序,桌面应用程序和许多其他令人兴奋的事物的出色语言之…

python 3.6.5 shell_Linux 安装 Python3.6.5

1. 安装依赖环境 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel 2. 下载 Python 3.6.5 wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz 3. 创建安装…

你真的会用Mac中的Finder吗?

参加:https://zhuanlan.zhihu.com/p/144139903

用c语言实现mfc系统,MFC实现学生选课系统

本文实例为大家分享了MFC实现学生选课系统的具体代码,供大家参考,具体内容如下先上效果图:主要功能:输入学号,从数据库中查找学号,若找到相匹配的学号,则显示数据库中姓名、学历、导师&#xff…

spring 构造函数注入_Spring构造函数依赖注入示例

spring 构造函数注入欢迎使用Spring构造函数依赖注入示例指南。 基于构造器的依赖注入是Spring 依赖注入的一种 。 依赖注入的另一种类型是Setter注入和字段注入。 有关Spring依赖注入的更多信息: Spring二传手注射的例子 Spring田间注入 依赖注入–构造函数与现…

python用pip安装numpy mac_Mac下python安装numpy,pandas,matplotlib

numpy是数据分析的库,我的目的是分析股票的数据,Pandas 有两种自己独有的基本数据结构Series (一维)和 DataFrame(二维),它们让数据操作更简单了。它也是 Python 的一个库,所以&…

IntelliJ IDEA for Mac工件包(artifact)中 Web facet resources 的模块名称有误,如何修改?

在工件管理界面中,如果某个工件包中 Web facet resources 的模块名称有误,如下图所示: 你可以在项目根目录下的 .idea/artifacts 目录下找到以工件名称命名的 xml 文件,找到其中含有 facet 属性的 element 标签,更正…

html dom 修改,HTML DOM - 修改

创建新的 HTML 元素如需向 HTML DOM 添加新元素,您首先必须创建该元素(元素节点),然后把它追加到已有的元素上。实例This is a paragraph.This is another paragraph.var paradocument.createElement("p");var nodedocument.createTextNode(&q…

python数据处理常用函数_Python常用数据处理函数

java多线程处理 package com.copyFile; import java.io.BufferedReader;import java.io.File;import java.io.FileReader;im ... [Android] RelativeLayout, LinearLayout,FrameLayout Android RelativeLayout 属性 // 相对于给定ID控…

redis nosql_NoSql数据库:Cassandra,Mongo,Redis数据库比较

redis nosql1.什么是NoSql数据库? NoSql(不仅是Sql)数据库是可水平扩展,持久存储半结构或非结构化数据并具有灵活模式的非关系数据库。 这些数据库支持多种数据模型,例如键值,文档,列族&#xf…

SVN更新数据和提交数据的几个疑问

有以下几个问题: 1.我检出一份副本到本地,修改了几个文件,然后我提交到SVN服务器中,此时服务器是如何更新有关的数据的呢?是不是把原来旧的文件数据删除了,保存最新提交的数据呢? 2.假设我修改…

html转pdf后 框会消失,html或其它文件转pdf弹出打开保存框

第一步:下载wkhtmktopdf软件,安装在指定的目录,如:C:\htmlToPdf\wkhtmltopdf,第二步:把安装好的wkhtmltopdf文件目录加到环境变量Path路径中,public void convertFile(){HttpURLConnection con …

SVN常见问题解答

参加:https://subversion.apache.org/faq.zh.html

用python画一只可爱的皮卡丘_用python画一只可爱的皮卡丘实例

效果图#!/usr/bin/env python # -*- coding:utf-8 -*- from turtle import *绘制皮卡丘头部def face(x,y): """画脸""" begin_fill() penup() # 将海龟移动到指定的坐标 goto(x, y) pendown() # 设置海龟的方向 setheading(40) circle(-150, 69)…

heroku_将应用程序集成为Heroku附加组件

herokuHeroku是流行的“平台即服务”提供商,它为供应商提供了作为附件提供的选项。 Heroku客户可以以多种方式使用附加组件,但是典型的情况是“启动数据库”,“启动MQ”或“启动日志记录解决方案”。 将附加组件添加到您的帐户后,…

请把下面的列表转换为html,在python中将列表转换为HTML表的最简单方法是什么?...

我会把你的问题分成两部分:给定一个“平面列表”,生成一个子列表列表,其中子列表具有给定的长度,并且整个列表可以按“行主要”顺序(第一个和第三个示例)或“列主要”(第二个示例)排列给定一个包含字符串项的子列表列表&#xff0…