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


相关推荐
DKPT6 分钟前
Java享元模式实现方式与应用场景分析
java·笔记·学习·设计模式·享元模式
Green1Leaves32 分钟前
pytorch学习-11卷积神经网络(高级篇)
pytorch·学习·cnn
KoiHeng3 小时前
操作系统简要知识
linux·笔记
巴伦是只猫4 小时前
【机器学习笔记Ⅰ】11 多项式回归
笔记·机器学习·回归
DKPT8 小时前
Java桥接模式实现方式与测试方法
java·笔记·学习·设计模式·桥接模式
巴伦是只猫9 小时前
【机器学习笔记Ⅰ】13 正则化代价函数
人工智能·笔记·机器学习
好好研究10 小时前
学习栈和队列的插入和删除操作
数据结构·学习
新中地GIS开发老师11 小时前
新发布:26考研院校和专业大纲
学习·考研·arcgis·大学生·遥感·gis开发·地理信息科学
SH11HF12 小时前
小菜狗的云计算之旅,学习了解rsync+sersync实现数据实时同步(详细操作步骤)
学习·云计算
Frank学习路上12 小时前
【IOS】XCode创建firstapp并运行(成为IOS开发者)
开发语言·学习·ios·cocoa·xcode