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


相关推荐
枫叶200025 分钟前
OceanBase数据库-学习笔记1-概论
数据库·笔记·学习·oceanbase
一点.点35 分钟前
李沐动手深度学习(pycharm中运行笔记)——04.数据预处理
pytorch·笔记·python·深度学习·pycharm·动手深度学习
一点.点39 分钟前
李沐动手深度学习(pycharm中运行笔记)——07.自动求导
pytorch·笔记·python·深度学习·pycharm·动手深度学习
你可以叫我仔哥呀44 分钟前
k8s学习记录(五):Pod亲和性详解
学习·容器·kubernetes
tcoding1 小时前
《MySQL 技术内幕-innoDB 存储引擎》笔记
数据库·笔记·mysql
RaLi和夕1 小时前
单片机学习笔记9.数码管
汇编·笔记·单片机·嵌入式硬件·学习
见青..1 小时前
【学习笔记】文件包含漏洞--本地远程包含、伪协议、加密编码
前端·笔记·学习·web安全·文件包含
flying robot1 小时前
小结:BFD
笔记
jerry6092 小时前
优先队列、堆笔记(算法第四版)
java·笔记·算法
星雨流星天的笔记本2 小时前
1、Linux操作系统下,ubuntu22.04版本切换中英文界面
linux·学习