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
相关推荐
The_cute_cat27 分钟前
25.5.27学习总结
学习
朱友斌28 分钟前
【Golang笔记03】error、panic、fatal错误处理学习笔记
笔记·golang·error·panic·fatal·golang错误处理
FanfanPyt1 小时前
Python打卡训练营学习记录Day38
学习
ayas123192 小时前
numpy与matplotlib学习——数据可视化入门
学习·numpy·matplotlib
亚林瓜子2 小时前
Springboot引入Spring Cloud for AWS的配置中心(Parameter Store和Secrets)
spring boot·spring cloud·aws·secrets manager·parameter store
fictionist2 小时前
Linux 进阶命令篇
linux·运维·服务器·开发语言·学习
!!!5253 小时前
策略模式与责任链模式学习笔记:从入门到理解
学习·责任链模式·策略模式
yunson_Liu4 小时前
AWS创建github相关的角色
云计算·github·aws
大信团队—跨境TRO4 小时前
[25-cv-05718]BSF律所代理潮流品牌KAWS公仔(商标+版权)
笔记·跨境电商·亚马逊·版权·侵权维权
虾球xz4 小时前
游戏引擎学习第314天:将精灵拆分成多个层
linux·c++·学习·游戏引擎