aws(学习笔记第四十二课) serverless-backend

文章目录

  • [aws(学习笔记第四十二课) serverless-backend](#aws(学习笔记第四十二课) serverless-backend)
  • 学习内容:
    • [1. 整体架构](#1. 整体架构)
      • [1.1 代码链接](#1.1 代码链接)
      • [1.2 整体架构](#1.2 整体架构)
    • [2 代码分析](#2 代码分析)
      • [2.1 创建`S3 bucket`](#2.1 创建S3 bucket)
      • [2.2 创建`cognito user pool`](#2.2 创建cognito user pool)
      • [2.3 创建`dynamoDB`](#2.3 创建dynamoDB)
      • [2.4 创建`S3 bucket`](#2.4 创建S3 bucket)
      • [2.5 创建`lambda`,并赋予权限](#2.5 创建lambda,并赋予权限)
      • [2.6 创建`API Gateway`,并指定为`lambda`函数处理](#2.6 创建API Gateway,并指定为lambda函数处理)
    • [3. 执行`cdk`](#3. 执行cdk)
      • [3.1 检查`S3 bucket`和`dynamoDB`](#3.1 检查S3 bucketdynamoDB)
      • [3.2 开始执行`Stack`](#3.2 开始执行Stack)
        • [3.2.1 修改`lambda`执行环境的代码](#3.2.1 修改lambda执行环境的代码)
        • [3.2.2 开始执行](#3.2.2 开始执行)
    • [4 测试程序](#4 测试程序)
      • [4.1 `Create Cognito User`](#4.1 Create Cognito User)
      • [4.2 获得`API Gateway`的调用`url`](#4.2 获得API Gateway的调用url)
      • [4.3 将图片文件进行`base64`的`encode`](#4.3 将图片文件进行base64encode)
      • [4.4 使用`Postman`进行`post`](#4.4 使用Postman进行post)
        • [4.4.1 设定认证情报`Authorization`](#4.4.1 设定认证情报Authorization)
        • [4.4.2 设定`json`](#4.4.2 设定json)
        • [4.4.3 请求保存图片](#4.4.3 请求保存图片)
        • [4.4.4 从`S3 bucket`中取得保存图片](#4.4.4 从S3 bucket中取得保存图片)
    • [5 注意清除`Stack`](#5 注意清除Stack)

aws(学习笔记第四十二课) serverless-backend

  • 使用Amazon API Gateway以及lamda进行后台处理

学习内容:

  • 使用Amazon API Gateway
  • 使用lambda处理API Gateway请求,接受json参数
  • 使用Amazon S3 - Bucket to store images or files
  • 使用Amazon DynamoDB
  • 使用Amazon Cognito进行用户认证

1. 整体架构

1.1 代码链接

代码连接(serverless-backend)

1.2 整体架构

2 代码分析

2.1 创建S3 bucket

python 复制代码
bucket_name = _cfnParameter(self, "uploadBucketName", type="String",
                                    description="The name of the Amazon S3 bucket where uploaded images will be stored.")
my_bucket = _s3.Bucket(self, id='s3bucket',
                               bucket_name=bucket_name.value_as_string)
my_bucket.grant_read_write(my_lambda)

这里,S3 bucket的名字是通过cdk deploy时候,指定的参数uploadBucketName

shell 复制代码
cdk --require-approval never deploy ServerlessBackendStack --parameters uploadBucketName=finlay-20250524-upload

2.2 创建cognito user pool

python 复制代码
        user_pool = _cognito.UserPool(self, "UserPool")
        user_pool.add_client("app-client", auth_flows=_cognito.AuthFlow(
            user_password=True
        ),
            supported_identity_providers=[
                _cognito.UserPoolClientIdentityProvider.COGNITO]
        )
        auth = _apigateway.CognitoUserPoolsAuthorizer(self, "imagesAuthorizer",
                                                      cognito_user_pools=[
                                                          user_pool]
                                                      )

这里,创建cognito认证方式,创建user pool。并且创建apigateway.CognitoUserPoolsAuthorizer

2.3 创建dynamoDB

python 复制代码
my_table = _dynamodb.Table(self, id='dynamoTable', table_name='formmetadata', partition_key=_dynamodb.Attribute(
            name='userid', type=_dynamodb.AttributeType.STRING)) #change primary key here

创建dynamoDB,用来存储image文件的metadata

2.4 创建S3 bucket

python 复制代码
my_bucket = _s3.Bucket(self, id='s3bucket',
                               bucket_name=bucket_name.value_as_string)

使用S3 bucket来进行保存图片,这里S3 bucket的名字是通过cdk deploy执行时候,指定的参数uploadBucketName

2.5 创建lambda,并赋予权限

python 复制代码
my_lambda = _lambda.Function(self, id='lambdafunction', function_name="formlambda", runtime=_lambda.Runtime.PYTHON_3_9,
                                     handler='index.handler',
                                     code=_lambda.Code.from_asset(
                                         os.path.join("./", "lambda-handler")),
                                     environment={
                                         'bucket': my_bucket.bucket_name,
                                         'table': my_table.table_name
                                     }
                                     )
my_bucket.grant_read_write(my_lambda)
my_table.grant_read_write_data(my_lambda)

这里的lambda函数用来接收API Gateway来的请求处理,并且dynamoDBtableS3 bucket都对lambda函数打开了read/write权限。

  • 保存image文件的meta data
  • 保存image文件到S3 bucket

下面是lambda的处理代码。

python 复制代码
def upload_metadata(key, userid):
    table = os.environ['table']
    bucket = os.environ['bucket']
    reference = {'Bucket': {'S': bucket}, 'Key': {'S': key}}
    response = dynamodb.put_item(
        TableName=table,
        Item={"userid": {
            'S': userid}, "photo_reference": {'M': reference}})
    print(response)


def upload_image(image_id, img, userid):
    bucket = os.environ['bucket']
    extension = imghdr.what(None, h=img)
    key = f"{image_id}.{extension}"
    try:
        s3.put_object(Bucket=bucket, Key=key, Body=img)
        upload_metadata(key, userid)
    except botocore.exceptions.ClientError as e:
        print(e)
        return False
    return True


def handler(event, context):
    print(event)
    # Generate random image id
    image_id = str(uuid.uuid4())

    data = json.loads(event['body'])
    userid = data['userid']
    img = base64.b64decode(data['photo'])

    if upload_image(image_id, img, userid):
        return {
            'statusCode': 200,
            'headers': {
                'Access-Control-Allow-Headers': '*',
                'Access-Control-Allow-Origin': '*',
                'Access-Control-Allow-Methods': 'OPTIONS,POST,GET'
            },
            'body': json.dumps('Success!')
        }
    return {
        'statusCode': 500,
        'headers': {
            'Access-Control-Allow-Headers': '*',
            'Access-Control-Allow-Origin': '*',
            'Access-Control-Allow-Methods': 'OPTIONS,POST,GET'
        },
        'body': json.dumps('Request Failed!')
    }

2.6 创建API Gateway,并指定为lambda函数处理

python 复制代码
my_api = _apigateway.LambdaRestApi(
            self, id='lambdaapi', rest_api_name='formapi', handler=my_lambda, proxy=True)
        postData = my_api.root.add_resource("form")
        postData.add_method("POST", authorizer=auth,
                          authorization_type=_apigateway.AuthorizationType.COGNITO)  # POST images/files & metadata

这里,

  • 指定lambda函数作为处理http post请求的handler
  • 指定认证方式为cognitouser pool

3. 执行cdk

3.1 检查S3 bucketdynamoDB

如果同样名字的S3 bucketdynamoDB已经存在,那么Stack执行会失败,所以提前检查。

  • dynamoDB
  • S3 bucket

3.2 开始执行Stack

3.2.1 修改lambda执行环境的代码
python 复制代码
my_lambda = _lambda.Function(self, id='lambdafunction', function_name="formlambda", runtime=_lambda.Runtime.PYTHON_3_9,
                                     handler='index.handler',
                                     code=_lambda.Code.from_asset(
                                         os.path.join("./", "lambda-handler")),
                                     environment={
                                         'bucket': my_bucket.bucket_name,
                                         'table': my_table.table_name
                                     }
                                     )

如果太旧的python执行环境,会导致部署失败,这里指定_lambda.Runtime.PYTHON_3_9

3.2.2 开始执行
shell 复制代码
cd serverless-backend
python -m venv .venv
source .venv/Script/activate
pip install -r requirement.txt
cdk --require-approval never deploy ServerlessBackendStack --parameters uploadBucketName=finlay-20250524-upload

到这里,部署成功。

4 测试程序

4.1 Create Cognito User

之后进入cognitouser配置画面

创建用户,使用user namepassworduser pool ID

  • 之后使用aws cli,设定用户和密码为permanent。这里,用户名字为finlay,密码自己设定。这里带有XXX都是需要替换的。

    shell 复制代码
    aws cognito-idp admin-set-user-password --user-pool-id ap-northeast-1-XXXXXX --username finlayXXXX --password XXXXXX --permanent
  • 之后取得finlay这个user的id token

shell 复制代码
aws cognito-idp initiate-auth --region ap-northeast-1 --auth-flow USER_PASSWORD_AUTH --client-id XXXXXX --auth-parameters USERNAME=finlay,PASSWORD=XXXXXX

这里的--client-id必须要去cloudformation这里去查找。

之后保存IdToken随后使用。

4.2 获得API Gateway的调用url

4.3 将图片文件进行base64encode

python 复制代码
import base64

with open(r"d:\test.jpg", "rb") as image_file:
    base64_string = base64.b64encode(image_file.read()).decode('utf-8')

print(base64_string)

注意python文件不能为base64,取其他名字即可。

4.4 使用Postman进行post

4.4.1 设定认证情报Authorization
  • URL设定
    URL这里设定成前面取得的API Gatewayurl,注意,后缀加上form
    https://XXXXXX.execute-api.ap-northeast-1.amazonaws.com/prod/form
  • Authentication设定
    这里设定成前面取得的idToken
4.4.2 设定json

设定形式为

json 复制代码
 { "userid": "myUserID", "photo": "image details" }
4.4.3 请求保存图片

方法选择post,之后选择send

最后会显示成功success

4.4.4 从S3 bucket中取得保存图片

5 注意清除Stack

  • 清除Stack
  • 清除S3 bucket
  • 清除dynamoDB
相关推荐
LQYYDSY2 小时前
【C语言极简自学笔记】重讲运算符
c语言·开发语言·笔记
老兵发新帖3 小时前
AWS RDS :多引擎托管数据库服务
数据库·云计算·aws
亚林瓜子3 小时前
AWS S3拒绝非https的请求访问
https·云计算·json·ssl·aws·s3
虾球xz4 小时前
CppCon 2016 学习:BUILDING A MODERN C++ FORGE FOR COMPUTE AND GRAPHICS
开发语言·c++·学习
future14124 小时前
C#核心学习
学习·c#
不太可爱的叶某人5 小时前
【学习笔记】深入理解Java虚拟机学习笔记——第7章 虚拟机类加载机制
java·笔记·学习
好奇龙猫5 小时前
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(36):复习
学习
晨曦5432105 小时前
Flask入门指南:从零构建Python微服务
python·学习·flask
爱上妖精的尾巴6 小时前
3-18 WPS JS宏 颜色设置实例应用(按条件设置单元格颜色)学习笔记
javascript·笔记·学习·excel·wps·js宏·jsa
安顾里7 小时前
aws各类服务器编号
服务器·云计算·aws