aws的各种坑-丙

目前项目的配置文件全部托管在gitlab上,每个环境对应一个库,只使用master分支(存个配置文件而已也用不着搞那么多分支)

运维历来这么搞,历史旧债了,我不是运维所以也没动力推动变革

最开始的需求是,研发在更新了dev环境的配置文件并push之后,能在第一时间得到通知

大体思路:dev的config库被push后,gitlab的webhook去call aws的api网关,调lambda,拿到此次push的所有commit,扒出各commit的commitID/在gitlab的URL/增删改过的文件,稍作格式化,丢给钉钉机器人在群里叫一声。看着确实简单。

前面一截都好说,无非就是api网关好像会把收到的header name全部转成小写(这又是另一个坑了)。自己造了个测试事件验出来改改就好了。关键是后面那一截,给钉钉机器人发通知:

一般都是用requests,本来想着这种很common的东西,lambda的运行时应该有的吧,结果很失望,不但没有,还丢了个错误:

1
2
[ERROR] Runtime.ImportModuleError: Unable to import module ‘lambda_function’: No module named ‘requests’

搜了一圈下来,找到这么一篇文章, Upcoming changes to the Python SDK in AWS Lambda

大概意思就是手动加一层官方指定的ARN就行了。其中有这么个列表,AWS自己做的lambda layer,各region对应的ARN不同.copy过来凑个版面

Region ARN
ap-northeast-1 arn:aws:lambda:ap-northeast-1:249908578461:layer:AWSLambda-Python-AWS-SDK:4
us-east-1 arn:aws:lambda:us-east-1:668099181075:layer:AWSLambda-Python-AWS-SDK:4
ap-southeast-1 arn:aws:lambda:ap-southeast-1:468957933125:layer:AWSLambda-Python-AWS-SDK:4
eu-west-1 arn:aws:lambda:eu-west-1:399891621064:layer:AWSLambda-Python-AWS-SDK:4
us-west-1 arn:aws:lambda:us-west-1:325793726646:layer:AWSLambda-Python-AWS-SDK:4
ap-east-1 arn:aws:lambda:ap-east-1:118857876118:layer:AWSLambda-Python-AWS-SDK:4
ap-northeast-2 arn:aws:lambda:ap-northeast-2:296580773974:layer:AWSLambda-Python-AWS-SDK:4
ap-northeast-3 arn:aws:lambda:ap-northeast-3:961244031340:layer:AWSLambda-Python-AWS-SDK:4
ap-south-1 arn:aws:lambda:ap-south-1:631267018583:layer:AWSLambda-Python-AWS-SDK:4
ap-southeast-2 arn:aws:lambda:ap-southeast-2:817496625479:layer:AWSLambda-Python-AWS-SDK:4
ca-central-1 arn:aws:lambda:ca-central-1:778625758767:layer:AWSLambda-Python-AWS-SDK:4
eu-central-1 arn:aws:lambda:eu-central-1:292169987271:layer:AWSLambda-Python-AWS-SDK:4
eu-north-1 arn:aws:lambda:eu-north-1:642425348156:layer:AWSLambda-Python-AWS-SDK:4
eu-west-2 arn:aws:lambda:eu-west-2:142628438157:layer:AWSLambda-Python-AWS-SDK:4
eu-west-3 arn:aws:lambda:eu-west-3:959311844005:layer:AWSLambda-Python-AWS-SDK:4
sa-east-1 arn:aws:lambda:sa-east-1:640010853179:layer:AWSLambda-Python-AWS-SDK:4
us-east-2 arn:aws:lambda:us-east-2:259788987135:layer:AWSLambda-Python-AWS-SDK:4
us-west-2 arn:aws:lambda:us-west-2:420165488524:layer:AWSLambda-Python-AWS-SDK:5
cn-north-1 arn:aws-cn:lambda:cn-north-1:683298794825:layer:AWSLambda-Python-AWS-SDK:4
cn-northwest-1 arn:aws-cn:lambda:cn-northwest-1:382066503313:layer:AWSLambda-Python-AWS-SDK:4
us-gov-west arn:aws-us-gov:lambda:us-gov-west-1:556739011827:layer:AWSLambda-Python-AWS-SDK:4
us-gov-east arn:aws-us-gov:lambda:us-gov-east-1:138526772879:layer:AWSLambda-Python-AWS-SDK:4

(以上信息截止到这篇文章发出都还是准的,后续变化以上面那篇文章里的为准。)

在lambda找到相关函数,点击设计器中相对靠底层的layer,然后点击 __添加层__。在接下来的页面中选择 指定一个ARN ,参照以上列表选择对应region的ARN。

lambda中使用时,导入requests使用该语句: from botocore.vendored import requests 然后就OK了

估计不止requests要这样处理,只是我刚好遇到了这个而已。如果不这样的话,就得自己本地搞到requests的源码,带上自己的代码一起打个zip,甚至丢到s3再发到lambda,复杂度大大增加。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!