aws lambda_跑来跑去:假人与AWS Lambda的第一次接触

aws lambda

这一切始于埃及人在一个木框上滑动几块大理石以简单的算术使其大脑放松的时候。 或许是希腊人发明了Antikythera机制来追踪行星的运动至每千年2度的精度 。 无论哪种方式,计算都已经走了很长一段路:查尔斯·巴贝奇的分析引擎 ,艾伦·图灵的Enigma-breaker ,美国宇航局将人送上月球的袖珍计算器 ,深蓝战胜了加里·卡斯帕罗夫·国际象棋大师。 与此相应,软件应用程序范式也发生了巨大变化:从无(基于纯硬件的编程),整体式,模块化,SOA,云到现在无服务器。

此时,“无服务器”通常表示FaaS(功能即服务); 从流行度和采用角度来看,FaaS和字面意思是AWS Lambda 。 因此,宣称无服务器开发的普及与lambda的易用性成正比并不夸张。

好吧,lambda 自2015年以来就已经存在,已经集成到许多AWS生态系统中,并且已有数百(即使不是数千)公司在生产中使用。 所以lambda应该非常直观且易于使用,对吗?

好吧,至少在我看来,这似乎不是。 我的案例是AWS的官方示例之一,我不太确定lambda是否足够友好,足以让新手了解图片。

首先,我想实现AWS自己的缩略图创建用例, 而不遵循他们自己的指南 ,以了解我能走多远。

作为程序员,我自然而然地开始使用Lambda管理控制台 。 该代码已经由慷慨的AWS专家编写 ,那么为什么要重新发明轮子呢? 复制,粘贴,保存,运行。 da!

嗯,看来我需要长大一点。

坦率地说, “创建功能”向导非常醒目。 有很多现成的蓝图。 太遗憾了,它还没有S3缩略图生成示例,或者这个故事可能就在这里结束!

因此,我只是使用了一个名为s3-thumbnail-generator的“从头开始创作”选项。

哦,等等,这是什么“角色”? 这也是必需的。 幸运的是,它具有“从模板创建新角色”选项,这可以节省我的时间。 (在“选择现有角色”下没有任何选择,而且我还太年轻,无法“创建自定义角色”。)

别紧张。 “角色名称”: s3-thumbnail-generator-role 。 但是“政策模板”呢?

也许我应该找到与S3有关的东西,因为我的Lambda是全S3。

惊喜! 当我搜索S3时,唯一得到的是“ S3对象只读权限”。 没有其他选择,我只是抢了它。 让我们看看我能跌倒多远!

是时候点击“创建功能”了。

哇,他们的Lambda设计师真的很棒!

“恭喜! 您的Lambda函数“ s3-thumbnail-generator”已成功创建。 现在,您可以更改其代码和配置。 准备测试功能时,单击“测试”按钮以输入测试事件。”

好吧,我该执行复制粘贴任务了。 样本源代码上的“复制”,lambda代码编辑器上的Ctrl + A和Ctrl + V。 简单!

全部为绿色(无红色)。 很高兴知道。

“保存”和“测试”。

哦,我应该知道得更多。 是的,如果我要“测试”,则需要“测试输入”。 明显。

我知道测试我的全新lambda并不那么容易,但是我并不期望必须手工编写一个JSON序列化的事件。 值得庆幸的是,他们在这里也做得很好,提供了现成的“ S3 Put”事件模板。 那我还要选择什么呢? :)

不出所料,第一次运行失败:

{"errorMessage": "Cannot find module 'async'","errorType": "Error","stackTrace": ["Function.Module._load (module.js:417:25)","Module.require (module.js:497:17)","require (internal/module.js:20:19)","Object. (/var/task/index.js:2:13)","Module._compile (module.js:570:32)","Object.Module._extensions..js (module.js:579:10)","Module.load (module.js:487:32)","tryModuleLoad (module.js:446:12)","Function.Module._load (module.js:438:3)"]
}

该死的,我应该注意到那些require线。 无论哪种方式都对我不利,因为我复制了示例代码的页面上有一个很大的标题“创建Lambda 部署程序包 ”,并且清楚地说明了如何将示例捆绑到可部署Lambda的zip中。

因此,我创建了一个包含我的代码和package.json的本地目录,并运行了npm install (好东西,我已经预装了nodenpm !)。 构建,压缩和上载该应用程序非常容易,希望我不必经历数不胜数的工作,就可以使lambda正常工作。

(顺便说一句,我希望我可以在其内置编辑器中执行此操作;可惜我无法找到添加依赖项的方法。)

无论如何,我第二次考试的时机已经成熟。

{"errorMessage": "Cannot find module '/var/task/index'","errorType": "Error","stackTrace": ["Function.Module._load (module.js:417:25)","Module.require (module.js:497:17)","require (internal/module.js:20:19)"]
}

index ? 那个是从哪里来的?

等等...我的坏,我的坏。

似乎Handler参数仍然保留默认值index.handler 。 就我而言,它应该是CreateThumbnail.handlerfilename.method )。

让我们再试一次。

认真吗 没门!

是的。 日志不会说谎。

2018-02-04T17:00:37.060Z	ea9f8010-09cc-11e8-b91c-53f9f669b596Unable to resize sourcebucket/HappyFace.jpg and upload tosourcebucketresized/resized-HappyFace.jpg due to an error: AccessDenied: Access Denied
END RequestId: ea9f8010-09cc-11e8-b91c-53f9f669b596

很公平; 我没有sourcebucketsourcebucketresized ,但是可能其他人有。 因此,拒绝访问。 说得通。

因此,我创建了自己的存储桶s3-thumb-inputs3-thumb-inputresized ,编辑了事件输入(由于“ Configure test event”下拉菜单),然后再次尝试。

2018-02-04T17:06:26.698Z	bbf940c2-09cd-11e8-b0c7-f750301eb569Unable to resize s3-thumb-input/HappyFace.jpg and upload tos3-thumb-inputresized/resized-HappyFace.jpg due to an error: AccessDenied: Access Denied

拒绝访问? 再次?

幸运的是,基于事件输入,我发现403实际上指示404(未找到)错误,因为我的存储桶中并未真正包含HappyFace.jpg文件。

亲爱的读者,请稍等,我急忙前往S3控制台并将开心的脸上传到新的存储桶中。 等一下!

好吧,准备下一次测试。

2018-02-04T17:12:53.028Z	a2420a1c-09ce-11e8-9506-d10b864e6462Unable to resize s3-thumb-input/HappyFace.jpg and upload tos3-thumb-inputresized/resized-HappyFace.jpg due to an error: AccessDenied: Access Denied

完全一样的错误? 再次? 来吧!

对我来说这没有意义; 为什么在地球上我自己的lambda在我自己的AWS账户中运行,却无法访问自己的S3存储桶?

等等,这与那个执行角色有关吗? 我在哪里盲目分配了S3 只读权限?

稍作谷歌搜索后,我得到了针对lambda的极其全面的AWS IAM文档 ,在其中我了解到lambda是在其自己的IAM角色下执行的; 而且我必须根据要使用的AWS服务手动配置角色。 更糟糕的是,为了配置角色,我必须一直走到IAM管理控制台 (不幸的是,该控制台已经从执行角色下拉列表中链接了,更重要的是在新选项卡中打开)。

双手合十,直到加载自定义角色页面。

哦,不……更多JSON编辑吗?

在原始指南中,AWS伙计们似乎也钉上了执行角色部分 ,但是奇怪的是,那里没有提到S3(名称除外)。 他们错过了什么吗?

好的,这是历史上第一次,我将创建自己的IAM角色!

保佑那些AWS工程师,一个快速的Google搜索显示了他们的策略生成器宝珠。 就是我需要的东西。

但是,摆脱JSON语法只能解决一小部分问题。 我怎么知道我需要哪些权限?

Google,哥们? 有什么事吗

哦…回到AWS文档? 大…

好吧,这还不错,这要感谢S3权限指南 。 尽管有点让人不知所措,但我猜想我需要的是“对象操作”的某些权限,幸运的是,该文档有一张漂亮的桌子,暗示我需要s3:GetObjects3:PutObject (与s3.getObject(...)s3.putObject(...)调用)。

经过一番思考,我最终在我的存储桶上获得了具有上述权限的“ IAM策略”(以乏味的语法arn:aws:s3:::s3-thumb-input命名):

{"Version": "2012-10-17","Statement": [{"Sid": "Stmt1517766308321","Action": ["s3:PutObject"],"Effect": "Allow","Resource": "arn:aws:s3:::s3-thumb-inputresized"},{"Sid": "Stmt1517766328849","Action": ["s3:GetObject"],"Effect": "Allow","Resource": "arn:aws:s3:::s3-thumb-input"}]
}

并将其粘贴并保存到IAM角色编辑器中(这自动将我带回到lambda控制台页面;太好了!)

再试一次:

同样的错误?

回顾S3权限文档,我注意到对象权限似乎在资源名称下包含一个星号( /*后缀,可能表示文件)。 因此,我们也尝试使用新的自定义策略:

{"Version": "2012-10-17","Statement": [{"Sid": "Stmt1517766308321","Action": ["s3:PutObject"],"Effect": "Allow","Resource": "arn:aws:s3:::s3-thumb-inputresized/*"},{"Sid": "Stmt1517766328849","Action": ["s3:GetObject"],"Effect": "Allow","Resource": "arn:aws:s3:::s3-thumb-input/*"}]
}

再次(开始感觉像Whiplash ):

2018-02-04T17:53:45.484Z	57ce3a71-09d4-11e8-a2c5-a30ce229e8b7Successfully resized s3-thumb-input/HappyFace.jpg and uploaded tos3-thumb-inputresized/resized-HappyFace.jpg

呜呜!

并且,不管您信不信,一个resized-HappyFace.jpg文件刚刚出现在我的s3-thumb-inputresized存储桶中; 是的

现在,当我将文件放入存储桶时,如何配置lambda自动运行?

幸运的是,lambda控制台(具有直观的“触发功能允许”布局)使我清楚地知道我想要的是S3触发器。 因此,我添加了一个,将“创建的对象(所有)”作为“事件类型”,将“ jpg”作为后缀,保存所有内容,然后立即将JPG文件拖放到我的存储桶中。

是的,就像魅力一样。

要查看整个过程花费了多长时间(在实际执行中,而不是在“测试”中),我单击了(上一个)执行结果窗格上的“日志”链接,然后转到此处显示的最新“日志流”中; 没有!

更令人怀疑的是,最新的日志流中的最后一个日志是“访问被拒绝”日志,尽管我已经超过了这一点,甚至实现了成功的调整大小。 也许我最近的更改打破了lambda的记录功能?

多亏了Google和StackOverflow ,我发现我的执行角色也需要包含一些与日志记录相关的权限。 确实,现在我记得当我开始创建自定义角色时,权限编辑器文本框中有一些权限,并且我再一次无知地将我的S3策略粘贴在它们上面。

另一轮政策编辑:

{"Version": "2012-10-17","Statement": [{"Sid": "Stmt1517766308321","Action": ["s3:PutObject"],"Effect": "Allow","Resource": "arn:aws:s3:::s3-thumb-inputresized/*"},{"Sid": "Stmt1517766328849","Action": ["s3:GetObject"],"Effect": "Allow","Resource": "arn:aws:s3:::s3-thumb-input/*"},{"Action": ["logs:CreateLogGroup","logs:CreateLogStream","logs:PutLogEvents"],"Effect": "Allow","Resource": "arn:aws:logs:*:*:*"}]
}

另一个文件丢失了,这次调整大小和日志都完美地工作了……最后!

现在一切都理顺了,缩略图正在目标存储桶中等待,我启动了浏览器,输入http://s3-thumb-inputresized.s3.amazonaws.com/resized-HappyFace.jpg (根据S3虚拟主机docs ),然后按Enter键,期望返回一个漂亮的缩略图。

<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>C8BAC3D4EADFF577</RequestId><HostId>PRnGbZ2olpLi2eJ5cYCy0Wqliqq5j1OHGYvj/HPmWqnBBWn5EMrfwSIrf2Y1LGfDT/7fgRjl5Io=</HostId>
</Error>

已经厌倦了“ AccessDenied”消息!

显然,尽管我的代码生成了文件,但它并未使文件可公开访问(但是私有缩略图有什么用处,是吗?)

深入研究AWS文档,我很快发现了putObject操作的ACL参数,该参数允许S3上传的文件公开。 希望这能解决地球上的所有问题,我Swift升级了代码,将文件的ACL设置为public-read

s3.putObject({Bucket: dstBucket,Key: dstKey,Body: data,ContentType: contentType,ACL: 'public-read'},next);}

保存函数,然后单击“测试”:

2018-02-04T18:06:40.271Z	12e44f61-19fe-11e8-92e1-3f4fff4227faUnable to resize s3-thumb-input/HappyFace.jpg and upload tos3-thumb-inputresized/resized-HappyFace.jpg due to an error: AccessDenied: Access Denied

再次?? 你在跟我开玩笑吗?!

幸运的是,这次我了解足够多,可以直接进入S3权限指南 ,该指南立即显示我还需要在策略中拥有s3:PutObjectAcl权限,才能在我的putObject调用中使用ACL参数。 因此,再次往返于策略编辑器,IAM仪表板和lambda控制台。

2018-02-04T18:15:09.670Z	1d8dd7b0-19ff-11e8-afc0-138b93af2c40Successfully resized s3-thumb-input/HappyFace.jpg and uploaded tos3-thumb-inputresized/resized-HappyFace.jpg

这次,令我非常满意的是,当我将托管URL http://s3-thumb-inputresized.s3.amazonaws.com/resized-HappyFace.jpg放入浏览器时,浏览器高兴地向我展示了我的笑脸缩略图。

总而言之,我很满意,我终于能够通过将所有分散的碎片放在一起,独自解决难题。 但是我不禁想像一下,如果我可以自由样式地构建我的lambda,而AWS独自负责角色,权限和其他方面的工作,而又不让我到处乱跑,那将会有多酷。

也许我应该从一开始就遵循该官方指南……但是,再一次,naaah :)

翻译自: https://www.javacodegeeks.com/2018/02/running-around-block-dummys-first-encounter-aws-lambda.html

aws lambda

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

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

相关文章

Linux 命令之 set -- 显示或设置 shell 特性及 shell 变量

文章目录一、命令介绍二、选项参数三、命令示例&#xff08;一&#xff09;开启/关闭特性&#xff08;二&#xff09;将普通变量设为环境变量一、命令介绍 set 命令作用主要是显示系统中已经存在的 shell 变量&#xff0c;设置 shell 变量的新变量值&#xff0c;可以把已有的变…

Linux 命令之 unset -- 删除指定的shell变量或函数

文章目录一、命令介绍二、选项参数三、命令示例&#xff08;一&#xff09;删除指定的环境变量一、命令介绍 unset 为 shell 内建指令&#xff0c;用于删除已定义的shell变量&#xff08;包括环境变量&#xff09;和shell函数。unset命令不能够删除具有只读属性的shell变量和环…

带有Jersey的RESTful Web服务的JAX-RS教程

在当今世界&#xff0c;数据起着非常重要的作用。 如此众多的应用程序将各种类型的数据用于不同的操作&#xff0c;所以最重要的方面是应用程序之间的通信。 当应用程序之间可以通信时&#xff0c;数据共享变得容易。 就像在亚洲运行的应用程序向在欧洲运行的应用程序提供数据…

mysql --force -f_Mysql_mysql force Index 强制索引

其他强制操作&#xff0c;优先操作如下&#xff1a;mysql常用的hint对于经常使用oracle的朋友可能知道&#xff0c;oracle的hint功能种类很多&#xff0c;对于优化sql语句提供了很多方法。同样&#xff0c;在mysql里&#xff0c;也有类似的hint功能。下面介绍一些常用的。强制索…

Linux 查看文件位置/查看文件路径的命令

which 查看可执行文件的位置find 实际搜寻硬盘查询文件名称whereis 查看文件的位置locate 配合数据库查看文件的位置

抽象工厂模式设计模式_创新设计模式:抽象工厂模式

抽象工厂模式设计模式抽象工厂模式是一种创新模式&#xff0c;是与构建器和工厂模式一起最受欢迎的模式之一。 使用创建模式是为了创建对象&#xff0c;而不是直接使用构造函数创建对象。 抽象工厂模式提供了一种封装一组具有共同主题的单个工厂而无需指定其具体类的方法。 采…

dubbo protocol port 消费者端_Dubbo源码:搞定URL,就走完了进度条的一半

Dubbo 中的 URL大家都知道&#xff0c;在互联网领域&#xff0c;每个信息资源都有统一的且在网上唯一的地址&#xff0c;该地址就叫 URL&#xff08;Uniform Resource Locator&#xff0c;统一资源定位符&#xff09;&#xff0c;它是互联网的统一资源定位标志&#xff0c;也就…

swarm 容器_Oracle应用容器云上的WildFly Swarm

swarm 容器在此博客文章中&#xff0c;我将描述如何将打包在WildFly Swarmber -jar中的CloudEE Duke应用程序部署到Oracle Application Container Cloud 。 在Oracle Application Container Cloud中进行部署所需的部署工件是一个ZIP归档文件&#xff0c;其中包含应用程序ber-j…

mysql数据库文件还原数据库_MySql通过数据库文件恢复数据库

以表”Table”为例:如类型是MyISAM, 数据文件则以”Table.frm””Table.MYD””Table.MYI””三个文件存储于”/data/$databasename/”目录中.如类型是InnoDB, 数据文件则存储在”$innodb_data_home_dir/″中的ibdata1文件中(一般情况)&#xff0c;结构文件存在于table_name.fr…

yum 如何知道从哪里下载包?

包来自什么地方呢&#xff1f;yum 如何知道从哪里下载包&#xff1f;起点是 /etc/yum.repos.d/ 目录&#xff0c;这个目录常常包含几个 repo 文件。这是 repo 的默认位置&#xff0c;但是可以在 YUM 配置文件&#xff08;通常是 /etc/yum.conf&#xff09;中指定其他位置。清单…

mysql主从修改系统参数步骤_mysql主从配置的参数配置与步骤_MySQL

mysql主从配置的参数配置与步骤_MySQL主从配置的步骤&#xff1a;在主库建立要同步的数据库,建立主库的帐号和修改主备库配置create database web default character set utf8grant replication slave on *.* to repdcssub192.168.191.112 identified by 123456;grant all priv…

javascript 解密_Javascript中的AES加密和Java中的解密

javascript 解密AES代表高级加密系统&#xff0c;它是一种对称加密算法&#xff0c;很多时候我们需要在客户端加密一些纯文本&#xff0c;例如密码&#xff0c;然后将其发送到服务器&#xff0c;然后由服务器解密以进行进一步处理.AES加密和解密更加容易在相同的平台&#xff0…

英文标点符号大全

标点符号英文中文名称未知反撇号’apostrophe撇号&#xff0c;缩写及所有格符号plus加号&#xff1b;正号-minus减号&#xff1b;负号plus or minus正负号is multiplied by乘号is divided by除号&#xff1d;is equal to等于号≠is not equal to不等于号≡is equivalent to全等…

Linux 系统下显示文件内容(查看文件内容)的命令 more/less/cat/head/tail 比较

命令说明more建议用于查看内容较长的文本文件&#xff0c;内容可以分屏显示&#xff0c;并且支持在显示时定位关键字cat建议用于查看内容较少的文本文件。当文件较大时&#xff0c;文本在屏幕上迅速闪过&#xff08;滚屏&#xff09;&#xff0c;用户往往看不清所显示的内容。因…

mysql子分区多少层_MySQL 子分区-阿里云开发者社区

介绍子分区其实是对每个分区表的每个分区进行再次分隔&#xff0c;目前只有RANGE和LIST分区的表可以再进行子分区&#xff0c;子分区只能是HASH或者KEY分区。子分区可以将原本的数据进行再次的分区划分。一、创建子分区子分区由两种创建方法&#xff0c;一种是不定义每个子分区…

gradle 编译java_Java的Gradle依赖关系,使用编译还是实现?

gradle 编译java当我向一位同事解释如何将Gradle用于Java项目时&#xff08;他正在远离Maven &#xff09;&#xff0c;我们遇到了各种代码示例。 一些示例将编译配置用于依赖项&#xff0c;而其他示例则使用Implements和api 。 dependencies { compile commons-httpclient:co…

Linux 命令之 typeset -- 声明 shell 变量,设置变量的属性

文章目录一、命令介绍二、常用选项三、命令示例&#xff08;1&#xff09;定义关联数组并访问一、命令介绍 typeset 命令是 bash 的内建命令&#xff0c;是命令 declare 的别名&#xff0c;两者是完全一样的&#xff0c;用来声明 shell 变量&#xff0c;设置变量的属性。 用于…

git log 迁移_现场故事:从Log4J迁移到Log4J2

git log 迁移通过从您的应用程序学习企业APM产品&#xff0c;发现更快&#xff0c;更有效的性能监控。 参加AppDynamics APM导览&#xff01; 与许多Java应用程序一样&#xff0c;AppDynamics Java代理广泛使用日志记录。 多年来&#xff0c;我们一直使用Log4J作为我们的日志记…

mysql firebird 性能_Firebird, MySQL 与 PostgreSQL 代码质量对比

今天看到一篇文章 - “Firebird, MySQL 与 PostgreSQL 代码质量对比”- 关于三个开源 RDBMS 的静态分析比较。主要内容A few words about the projectsFirebirdMySQLPostgreSQLPVS-StudioComparison criteriaWhy "head-on" comparison is not a good ideaAn alterna…

Linux 命令之 let -- bash 中用于计算的工具,用于执行一个或多个表达式

文章目录一、命令介绍二、命令示例自增操作自减操作shell 脚本中的运算表达式一、命令介绍 let 命令是 BASH 中用于计算的工具&#xff0c;用于执行一个或多个表达式&#xff0c;变量计算中不需要加上 $ 来表示变量。如果表达式中包含了空格或其他特殊字符&#xff0c;则必须引…