AWS中Lambda跨账户跨VPC连接DynamoDB

概述

楼主最近做了一个项目,需要Lambda去连接一个DynamoDB,难度在于Lambda和DynamoDB分别在两个AWS账户中,同时Lambda处于也要连接RDS的需要,跟RDS也放在同一个VPC中,这无异于再增加了一层难度,也就是说Lambda的traffic需要通过VPC Endpoint先出VPC才能连接DynamoDB。与此同时还有权限问题和身份问题,Lambda需要assume role的权限来操控另一个账户的DynamoDB, 楼主将一步一步来解析这些是如何实现。

建立权限

首先需要给Lambda Function建立一个单独的身份(role), 除了给到你Lambda本身需要的那这些基本权限诸如RDS/CloudWatch的读写权限以外,还需要增加两个规则,一个是AWS提供的VPC读写权限,一个是自定义的AssumeRole Police在Lambda所在的账户中(这里假定是A账户),因为Lambda本身是没有权限去读写在另一个账户的任何资源的,只能通过assume role到DynamoDB所在的AWS账户中(这里假定是B账户)的DynamoDB所绑定的角色来进行读写操作.

以下是账户A中Lambda的身份(role)中拥有的VPC权限和Assume Role权限, 注意Resource指定的Arn号码对应的是B账户中的账户B中DynamoDB所依附的身份(role):

以下是账户B中DynamoDB所依附的身份(role)中所依附的权限规则, 包含了要显式信任的账户A的Lambda身份资源号码(ARN):


以下是账户B中DynamoDB所依附的身份(role)中所依附的权限规则, 包含了对应DynamoDB表的读写权限:

到这一步在IAM中创建权限和身份的工作就完成了,下一步就是进行VPC网络配置。


VPC网络配置

这个章节讲述如何将Lambda的网络请求和数据访问到DynamoDB。需要注意的是我设置Lambda是放在VPC之中,默认只能访问到所在VPC里面的资源,比如同处于一个VPC的RDS. 默认配置下AssumeRole和Lambda对DynamoDB的读写请求都无法通过VPC到达公网。这里就要用到两个新的网管组件,一个是NAT(network address translation)和VPC Endpoint, NAT可以讲VPC内网请求连接到公网,VPC Endpoint则是专门给DynamoDB提供网络请求的数据通道,这样DynamoDB的读写请求和数据交互就不用通过公网了,保证了数据的安全。

1.创建VPC

在AWS VPC服务中创建VPC, 并且给Lambda指定这个刚刚创建的VPC.


2.创建子网Subnet

VPC是由子网作为基本单元所组成的,我们需要最少要创建三个子网subnet,一个子网subnet-a给IGW(internet gateway)用于连接公网所用,另外两个(subnet-b和subnet-c)给Lambda用。创建subnet的时候,CIDR可以用下图的组合:

将创建好的subnet-b和subnet-c绑定到Lambda

3.创建igw公网网关

创建internet gateway,并且绑定到我们一开始创建的VPC上即可。

4.创建NAT Gateway

子网subnet选择subnet-a,就是那个公共子网(public subnet), 下面弹性IP ID选择创建新的EIP按钮即可。

5.创建路由表route table

创建两个新的路由表(route table),为了理解方便,分别叫route-table-a和route-table-b, 

route-table-a作为默认主要路由表,默认所有外网请求通过internet gateway网关来请求VPC外的资源。

route-table-b则是这个项目最为精华的部分了,如下图配置,0.0.0.0/0地址规则表明默认流量是去到NAT的,NAT会又会自动把流量导到Internet gateway网关,这个规则主要是为了assume role的流量服务的,倒数第二行的规则在创建目的地的时候下拉选项里面会自动弹出来,选择我么刚刚创建的VPC endpoint对应的目的地,这样Lambda看到要去到dynamoDB的流量请求就会走VPC endpoint。


同时将这个路由表route-table-b跟我们之前创建的两个私有子网subnet进行关联.

6.创建安全组Security Group

并且把security group绑定到Lambda.

至此,所有网络设置都完成了,下面将讲解如何在代码中实现连接。

代码

const assumeRoleOnDynamoDB = function (results, sts = new AWS.STS({apiVersion: '2012-10-17'})) {

    const params = {

        RoleArn: process.env.AssumedDDBRole,

        RoleSessionName: process.env.RoleSessionName

    };

    return new Promise((resolve, reject) => {

        sts.assumeRole(params, function (err, stsEncryptedData) {

            if (err) {

                console.error("[ERROR] Unable to assume role on Freelunch DynamoDB. ");

                return reject(err);

            }

            return resolve([results, stsEncryptedData]);

        });

    });

};

const upsertDynamoDBTable = function (results, stsEncryptedData) {

    const dynamodb = new AWS.DynamoDB({

        apiVersion: '2012-08-10',

        accessKeyId: stsEncryptedData.Credentials.AccessKeyId,

        secretAccessKey: stsEncryptedData.Credentials.SecretAccessKey,

        sessionToken: stsEncryptedData.Credentials.SessionToken,

        region: process.env.REGION

    });

    const paramsForDDB = {

        TableName: 'TableName',

        Item: { 'data': { "S": "data" }}

    };

    return new Promise((resolve, reject) => {

        dynamodb.putItem(paramsForDDB, function (err, data) {

            if (err) {

                console.error("[ERROR]: Failed to upsert info into DynamoDB. ");

                return reject(err);

            }

            resolve([results, dynamodb])

        });

    });

};

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354