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


相关推荐
吴梓穆12 分钟前
UE5学习笔记 FPS游戏制作28 显式玩家子弹数
笔记·学习·ue4
KevinRay_34 分钟前
从零开始学习SQL
数据库·学习·mysql
虾球xz1 小时前
游戏引擎学习第195天
c++·学习·游戏引擎
上等猿2 小时前
Elasticsearch笔记
java·笔记·elasticsearch
Stardep2 小时前
算法学习11——滑动窗口——最大连续1的个数
数据结构·c++·学习·算法·leetcode·动态规划·牛客网
东京老树根3 小时前
SAP 学习笔记 - 系统移行业务 - MALSY(由Excel 移行到SAP 的收费工具)
笔记·学习
云上艺旅5 小时前
K8S学习之基础六十四:helm常用命令
学习·云原生·容器·kubernetes
时光追逐者5 小时前
学习如何设计大规模系统,为系统设计面试做准备!
学习·面试·职场和发展·系统设计
淬渊阁5 小时前
汇编学习之《指针寄存器&大小端学习》
汇编·学习
淬渊阁6 小时前
汇编学习之《段寄存器》
汇编·学习