aws(学习笔记第三十六课) apigw-http-api-lambda-dynamodb

文章目录

  • [aws(学习笔记第三十六课) apigw-http-api-lambda-dynamodb](#aws(学习笔记第三十六课) apigw-http-api-lambda-dynamodb)
  • 学习内容:
    • [1. 整体架构](#1. 整体架构)
      • [1.1 代码链接](#1.1 代码链接)
      • [1.2 整体架构](#1.2 整体架构)
    • [2. 代码解析](#2. 代码解析)
      • [2.1 创建`vpc`](#2.1 创建vpc)
      • [2.2 创建`vpc`的终端节点](#2.2 创建vpc的终端节点)
      • [2.3 对`vpc`的终端节点设定`policy`](#2.3 对vpc的终端节点设定policy)
      • [2.4 创建`dynamodb`的``table](#2.4 创建dynamodb的``table)
      • [2.5 创建`lambda`函数](#2.5 创建lambda函数)
      • [2.6 `lambda`函数的代码(/lambda/apigw-handler/)](#2.6 lambda函数的代码(/lambda/apigw-handler/))
      • [2.7 为`dynamodb`的`table`设定`lambda`函数的权限,以及通过`env`设定表名](#2.7 为dynamodbtable设定lambda函数的权限,以及通过env设定表名)
      • [2.8 创建`api gateway`,并设定`handler`为`lambda`函数](#2.8 创建api gateway,并设定handlerlambda函数)
    • [3 执行整个架构](#3 执行整个架构)
      • [3.1 开始部署](#3.1 开始部署)
      • [3.2 访问`API gateway`](#3.2 访问API gateway)

aws(学习笔记第三十六课) apigw-http-api-lambda-dynamodb

  • 使用api gateway中使用lambda+dynamodb

学习内容:

  • 使用api gateway
  • 使用lambda
  • 使用dynamodb

1. 整体架构

1.1 代码链接

1.2 整体架构

  • API gateway访问lambda函数
  • lambda通过终端节点访问dynamodb

2. 代码解析

2.1 创建vpc

python 复制代码
# VPC
        vpc = ec2.Vpc(
            self,
            "Ingress",
            cidr="10.1.0.0/16",
            subnet_configuration=[
                ec2.SubnetConfiguration(
                    name="Private-Subnet", subnet_type=ec2.SubnetType.PRIVATE_ISOLATED,
                    cidr_mask=24
                )
            ],
        )

这里,只创建private subnet

2.2 创建vpc的终端节点

通常,private subnet里面的lambda是没有办法访问dynamodb的,如果想访问。有两种方式:

  • 一种是通过给public subnet里面设定NAT gateway
  • 另一种通过vpc endpoint,即vpc的终端节点。终端节点需要执行面向的service,这里是dynamodb
python 复制代码
 # Create VPC endpoint
        dynamo_db_endpoint = ec2.GatewayVpcEndpoint(
            self,
            "DynamoDBVpce",
            service=ec2.GatewayVpcEndpointAwsService.DYNAMODB,
            vpc=vpc,
        )

2.3 对vpc的终端节点设定policy

python 复制代码
# This allows to customize the endpoint policy
        dynamo_db_endpoint.add_to_policy(
            iam.PolicyStatement(  # Restrict to listing and describing tables
                principals=[iam.AnyPrincipal()],
                actions=[                "dynamodb:DescribeStream",
                "dynamodb:DescribeTable",
                "dynamodb:Get*",
                "dynamodb:Query",
                "dynamodb:Scan",
                "dynamodb:CreateTable",
                "dynamodb:Delete*",
                "dynamodb:Update*",
                "dynamodb:PutItem"],
                resources=["*"],
            )
        )

这里设定通过该endpoint,任何resource都能够进行dynamodb相关的操作。

2.4 创建dynamodb的``table

python 复制代码
        # Create DynamoDb Table
        demo_table = dynamodb_.Table(
            self,
            TABLE_NAME,
            partition_key=dynamodb_.Attribute(
                name="id", type=dynamodb_.AttributeType.STRING
            ),
        )

2.5 创建lambda函数

python 复制代码
        # Create the Lambda function to receive the request
        api_hanlder = lambda_.Function(
            self,
            "ApiHandler",
            function_name="apigw_handler",
            runtime=lambda_.Runtime.PYTHON_3_9,
            code=lambda_.Code.from_asset("lambda/apigw-handler"),
            handler="index.handler",
            vpc=vpc,
            vpc_subnets=ec2.SubnetSelection(
                subnet_type=ec2.SubnetType.PRIVATE_ISOLATED
            ),
            memory_size=1024,
            timeout=Duration.minutes(5),
        )

2.6 lambda函数的代码(/lambda/apigw-handler/)

python 复制代码
def handler(event, context):
    table = os.environ.get("TABLE_NAME")
    logging.info(f"## Loaded table name from environemt variable DDB_TABLE: {table}")
    if event["body"]:
        item = json.loads(event["body"])
        logging.info(f"## Received payload: {item}")
        year = str(item["year"])
        title = str(item["title"])
        id = str(item["id"])
        dynamodb_client.put_item(
            TableName=table,
            Item={"year": {"N": year}, "title": {"S": title}, "id": {"S": id}},
        )
        message = "Successfully inserted data!"
        return {
            "statusCode": 200,
            "headers": {"Content-Type": "application/json"},
            "body": json.dumps({"message": message}),
        }
    else:
        logging.info("## Received request without a payload")
        dynamodb_client.put_item(
            TableName=table,
            Item={
                "year": {"N": "2012"},
                "title": {"S": "The Amazing Spider-Man 2"},
                "id": {"S": str(uuid.uuid4())},
            },
        )
        message = "Successfully inserted data!"
        return {
            "statusCode": 200,
            "headers": {"Content-Type": "application/json"},
            "body": json.dumps({"message": message}),
        }

2.7 为dynamodbtable设定lambda函数的权限,以及通过env设定表名

python 复制代码
        # grant permission to lambda to write to demo table
        demo_table.grant_write_data(api_hanlder)
        api_hanlder.add_environment("TABLE_NAME", demo_table.table_name)

2.8 创建api gateway,并设定handlerlambda函数

python 复制代码
        # Create API Gateway
        apigw_.LambdaRestApi(
            self,
            "Endpoint",
            handler=api_hanlder,
        )

3 执行整个架构

3.1 开始部署

shell 复制代码
cdk --require-approval never deploy

3.2 访问API gateway


相关推荐
盐焗西兰花37 分钟前
鸿蒙学习实战之路:状态管理最佳实践
学习·华为·harmonyos
小毅&Nora2 小时前
【人工智能】【深度学习】 ⑦ 从零开始AI学习路径:从Python到大模型的实战指南
人工智能·深度学习·学习
Maxwell_li12 小时前
Pandas 描述分析和分组分析学习文档
学习·数据分析·numpy·pandas·matplotlib
雷工笔记2 小时前
MES学习笔记之SCADA采集的数据如何与MES中的任务关联起来?
笔记·学习
繁星星繁3 小时前
【C++】脚手架学习笔记 gflags与 gtest
c++·笔记·学习
2301_810746313 小时前
CKA冲刺40天笔记 - day20-day21 SSL/TLS详解
运维·笔记·网络协议·kubernetes·ssl
Lovely Ruby4 小时前
前端er Go-Frame 的学习笔记:实现 to-do 功能(三),用 docker 封装成镜像,并且同时启动前后端数据库服务
前端·学习·golang
YJlio5 小时前
SDelete 学习笔记(9.18):安全删除、空闲清理与介质回收实战
笔记·学习·安全
7446 小时前
数据结构(C语言版)线性表-单链表的拓展及应用
笔记·强化学习
xiaozi41206 小时前
Ruey S. Tsay《时间序列分析》Python实现笔记:综合与应用
开发语言·笔记·python·机器学习