【原创】aws s3 lambda缩略图生成

参考资料:

https://github.com/sagidm/s3-resizer

https://aws.amazon.com/cn/blogs/compute/resize-images-on-the-fly-with-amazon-s3-aws-lambda-and-amazon-api-gateway/

https://medium.com/swlh/how-to-get-started-with-aws-lambda-9f2ac14d863a

https://www.obytes.com/blog/2019/image-resizing-on-the-fly-with-aws-lambda,-api-gateway,-and-s3-storage/

https://heropy.blog/2019/07/21/resizing-images-cloudfrount-lambda/

and so on...

 

  1. 创建S3桶

https://s3.console.aws.amazon.com/s3/home?region=ap-northeast-2

点击“创建存储桶”,输入名称(假如叫做n-test-2),选择区域。

设置权限:

  • 取消勾选“阻止所有公共访问
  • 存储桶策略输入如下代码:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AddPerm",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::n-test-2/*"
        }
    ]
}

 

  1. 创建Lambda函数

https://ap-northeast-2.console.aws.amazon.com/lambda/home?region=ap-northeast-2#/functions

点击“创建函数”,输入函数名称(假设叫做resize-func),运行语言选择“Node.js 8.10”(因为目前可用的demo包就是nodejs8.1的版本)

展开“权限”部分,创建自定义角色,跳转到IAM控制台:

创建策略,跳转到新页面:

JSON里面输入如下内容:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::n-test-2/*"
        }
    ]
}

注意上面的 Resource里面是桶名称。

下一步,输入一个名称,比如resize-policy,然后点击创建。

 

回到创建角色页面,搜索刚才创建的策略并选中:

然后再搜索AmazonS3FullAccess,并选中:

点击下一步,再下一步,输入角色名称(假设resize-role),点击“创建角色”。

 

回到创建函数页面,选择“使用现有角色”,选择刚才创建的角色:

然后点击右下角 创建函数。

 

 

  1. 添加触发器

选择 API Gateway:

创建新 API:

安全性:打开

点击添加。

 

回到主界面,复制API 终端节点:

https://qzdp929f68.execute-api.ap-northeast-2.amazonaws.com/default/resize-func

 

  1. 桶静态网站托管配置:

回到桶设置中,属性,静态网站托管:

  • 索引文档:index.html
  • 错误文档:error.html
  • 重定向规则:
<RoutingRules>
  <RoutingRule>
    <Condition>
      <KeyPrefixEquals/>
      <HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals>
    </Condition>
    <Redirect>
      <Protocol>https</Protocol>
      <HostName>qzdp929f68.execute-api.ap-northeast-2.amazonaws.com</HostName>
      <ReplaceKeyPrefixWith>default/resize-func?path=</ReplaceKeyPrefixWith>
      <HttpRedirectCode>307</HttpRedirectCode>
    </Redirect>
  </RoutingRule>
</RoutingRules>

注意上面的 HostNameReplaceKeyPrefixWith 内容分别为刚才复制的API终端节点的值。

  • 复制上面的终端节点:http://n-test-2.s3-website.ap-northeast-2.amazonaws.com

 

 

  1. 环境变量配置

BUCKET=桶名称

URL=刚才复制的终端节点URL

右上角保存。

 

  1. 上传函数代码.

从这里下载nodejs8.1的函数包:https://github.com/sagidM/s3-resizer/releases

函数代码部分,选择“上传.zip文件”

右上角保存。

 

  1. 配置测试事件(可选)

{
  "queryStringParameters": {
    "path": "300x300/pic2.jpg"
  }
}

注意有个细节:300x300,是字母x,不是乘号(×)

此时访问原图: http://n-test-2.s3-website.ap-northeast-2.amazonaws.com/pic2.jpg

运行测试,会生成300*300的缩略图:

http://n-test-2.s3-website.ap-northeast-2.amazonaws.com/300x300/pic2.jpg

posted @ 2019-08-20 17:56  码农骆驼  阅读(2768)  评论(0编辑  收藏  举报