9折倒计时一周! QCon 全球软件开发大会·上海站讲师上线95% >>> 了解详情
写点什么

使用 AWS Systems Manager 和 AWS Lambda 实现跨账户的共享服务调用

  • 2019-10-23
  • 本文字数:5858 字

    阅读完需:约 19 分钟

使用 AWS Systems Manager 和 AWS Lambda 实现跨账户的共享服务调用

多账号架构下的共享服务

在大型企业的云环境中,为了满足 IT 系统的合规性要求和安全性要求,通常需要采用多账户的架构以实现不同业务部门之间的资源隔离和权限控制。下图是一个常见的企业多账户架构,通常包含两类账户群:一类是中央共享服务账户群(桔色背景框),包含 AD 服务、日志服务、VPN 服务、跳板机等共享服务;另一类是业务应用账户群(蓝色背景框),通常情况下生产和非生产的资源会分别放置到不同的账户中。



图一 企业多账户架构示例


业务应用和共享服务的通信,通常可以通过以下两种方式实现:


(1)通过 VPC Peering 的方式打通共享服务所在的 VPC 和业务应用所在的 VPC 的网络连接,同时配合安全组进行网络流量的控制。目前 AWS 的中国区域可以支持这个方式,但需要注意 VPC Peering 会有连接数量的限制


(2)业务应用可以通过 Interface VPC Endpoint(基于 AWS PrivateLink 技术)访问到共享服务的 VPC,同时配合安全组进行网络流量的控制。目前(2018 年 5 月)AWS 中国区域尚不支持 Interface VPC Endpoints。


除了以上两种基于私有网络打通的方案之外,本文描述了某 AWS 客户在项目实施中设计的第三种跨账户共享服务访问方式:基于 API 的跨账户共享服务访问方式。

基于 API 的跨账户共享服务访问方式概述

在项目实施中,为了避免共享服务和业务应用的直接网络连通,实施团队设计了使用业务应用账户下的 Lambda 程序调用共享服务账户下 AWS Systems Manager 服务 API 的方式来完成共享服务的调用。


本文将以 EC2 服务器的 DNS 自动注册为例,展示跨账户共享服务调用的实现机理。如图二所示,当 Auto Scaling 组发生水平扩展时,新增的 EC2 实例经常需要执行一些定制的初始化工作,DNS 域名的注册就是其中的一个环节。Auto Scaling 的水平扩展由 CloudWatch Event 的规则捕捉后,会触发 Lambda 程序通过跨账户的 API 调用完成 DNS 的域名注册。



图二 方案架构


下面将为您介绍方案的实现细节。

共享服务的 API 化

本方案通过 AWS Systems Manager 实现了共享服务的 API 化,从而把基于私有网络的服务调用转变为基于公有网络的 AWS API 调用。


例如,为了实现在 AD 中执行 DNS 域名的注册,可以采用 AWS Manager 预设的 AWS-RunPowerShellScript Document,通过在 AD 所在的 Windows 操作系统中执行 PowerShell 的脚本的方式完成 DNS 域名的注册。



图三 Documents in AWS Systems Manager


以下 Python 代码片段通过调用 AWS Manager 的 SendCommand API,实现了 DNS 域名注册共享服务的调用:


Python


ssmCommand = client.send_command(    InstanceIds = [      '<instance-id>'    ],    DocumentName = 'AWS-RunPowerShellScript',    Parameters = {    'commands': [      'Add-DnsServerResourceRecordA -Name "<host-name>" -ZoneName "<zone-name>" -AllowUpdateAny -IPv4Address "<ip-address>" -TimeToLive 01:00:00'    ]    },  )
复制代码


具体 Python SDK 函数的参数可以参见文档

共享服务调用的触发

共享服务调用通常由 AWS 资源的状态变更触发。本项目的需求为,当 Auto Scaling 组根据 Scaling Policy 启动 EC2 实例时,需要完成一些运维的自动化操作,而这些操作可以通过 Lambda 程序调用相应的 AWS API 来完成。例如:


  • 通过 AWS Manager 实现的共享服务 API:参见上文描述。

  • 通过 EC2 API 实现 AWS 平台层面的操作:例如,修改 AWS EC2 实例的属性 。


这些自动化操作由 CloudWatch Event 的规则(rule)来触发。Rule Pattern 如下文所示:


Python


{  "source": [    "aws.autoscaling"  ],  "detail-type": [    "EC2 Instance Launch Successful"  ],  "detail": {    "AutoScalingGroupName": [      "my-asg-name"    ]  }}
复制代码


这个 CloudWatch Event 规则的设立可以通过 AWS 控制台的向导来完成。



图四 CloudWatch Event Rule 的设立


为实现配置过程的自动化,上述 CloudWatch Event 规则的设立也可以通过以下 CloudFormation 模板完成。

(1)设置触发条件和触发对象

Python


EventRule:   Type: "AWS::Events::Rule"  Properties:     Description: "EventRule"    EventPattern:       source:         - "aws.autoscaling"      detail-type:         - "EC2 Instance Launch Successful"      detail:         AutoScalingGroupName:           - "<asg-name>"    State: "ENABLED"    Targets:       -         Arn: <lambda-arn>        Id: "TargetFunction01"
复制代码


其中:


  • 是 Auto Scaling Group 的名字。

  • 是需要触发的 Lambda 程序的 ARN。

(2)设置调用权限,即赋予 CloudWatch Event 调用 Lambda 程序的权限

Python


PermissionForEventsToInvokeLambda:   Type: "AWS::Lambda::Permission"  Properties:     FunctionName: <lambda-arn>      Ref: "LambdaFunction"    Action: "lambda:InvokeFunction"    Principal: "events.amazonaws.com"    SourceArn: <event-rule-arn>
复制代码


其中,


  • 是 Lambda 程序的 ARN。

  • 是 CloudWatch Event 规则的 ARN

共享服务调用的权限配置

所有 AWS 的操作都需要授权才可以完成。跨账号的 API 调用的授权需要以下几个步骤。


(1)在共享服务账户下,创建角色(role),命名为 ssm-role-for-lambda。这个角色将被 Lambda 程序继承,用来获取执行 AWS Systems Manager 所需的权限。这个角色绑定的权限可采用以下 AWS Managed Policy。


Python


arn:aws-cn:iam::aws:policy/AmazonSSMFullAccess
复制代码


(2)在共享服务账户下,为第一步创建的 ssm-role-for-lambda 角色添加 Trusted Entity,从而允许业务账户中的 Lambda 程序继承这个角色。


Python


{  "Version": "2012-10-17",  "Statement": [   {     "Effect": "Allow",     "Principal": {       "AWS": "arn:aws-cn:iam::<app-account-id>:root"     },     "Action": "sts:AssumeRole"   }  ]}
复制代码


其中,是业务应用账户的 ID。


(3)在业务应用账户下,设置 Lambda 的执行权限,需包括以下权限,从而允许 Lambda 程序来继承 ssm-role-for-lambda 角色:


Python


{   "Sid": "VisualEditor0",   "Effect": "Allow",   "Action": "sts:AssumeRole",   "Resource": "arn:aws-cn:iam::<shared-service-account-id>:role/ssm-role-for-lambda"}
复制代码


其中,是共享服务账户的 ID。


(4)在业务应用账户下,Lambda 程序中通过 STS 服务的 AssumeRole API 继承这个角色。此 API 调用可以通过以下 Python 代码片段实现:


Python


lambda_sts_client = boto3.client('sts',    region_name="cn-north-1"    )response = lambda_sts_client.assume_role(    RoleArn="arn:aws-cn:iam::<share-service-account-id>:role/ssm-role-for-lambda",    RoleSessionName="remotessm"    )
复制代码


其中,是共享服务账户的 ID。


以上代码片段中的 response 变量将返回已继承 ssm-role-for-lambda 角色一套动态授权信息,具体包括:


  • AWS_ACCESS_KEY_ID

  • AWS_SECRET_ACCESS_KEY

  • AWS_SESSION_TOKEN


(5)在业务应用账户下,基于第四步获取的动态授权,Lambda 程序即可调用 AWS Systems Manager 的 API 完成共享服务的调用。例如,以下 Python 代码片段实现了调用 AWS Systems Manager 的 API 的 ssm_client 句柄的获取。


Python


ssm_session = boto3.Session(    aws_access_key_id=response['Credentials']['AccessKeyId'],aws_secret_access_key=response['Credentials']['SecretAccessKey'],    aws_session_token=response['Credentials']['SessionToken'],    region_name="cn-north-1"    )ssm_client = ssm_session.client('ssm')
复制代码

基于 API 的跨账户共享服务访问方式的优势

本文介绍了基于 AWS Systems Manager 和 Lambda 的跨账户共享服务访问方式。相比前文中提到的另外两种方式,本方案有以下优势:


  • 无需配置共享服务 VPC 和业务应用 VPC 的私有网络连接。对于没有 Private Link 功能的中国区域,避免了触及 VPC Peering 数量上限的风险。

  • 把需要客户自行实现的私有网络接口暴露、操作系统内程序执行权限管控等高风险功能,转化为 AWS 平台基于 IAM 服务的 API 访问控制,从而提高了系统的安全性。

  • 实现了共享服务的 API 化,为下一步的共享服务的标准化和自动化奠定基础。


作者介绍:


寇欣


亚马逊 AWS 中国区专业服务部咨询顾问。加入 AWS 之前,在 IT 和云计算行业积累了丰富的云服务架构和应用软件架构的经验。历任 Oracle 电信事业部专业服务部门资深顾问、中国移动研究院云计算研究员、Lucent Tech 研发中心系统架构师。


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/using-aws-systems-manager-and-aws-lambda-for-cross-account-shared-service-calls/


2019-10-23 08:00608

评论

发布
暂无评论
发现更多内容

单向链表合并实战

Andy

能上能下

张老蔫

28天写作

DeFi去中心化DAPP系统开发的知识科普

W13902449729

去中心化金融 DeFi去中心化系统开发

[0/28]软件质量的那点事(1)———引言

L3C老司机

软件测试 软件质量

一致性Hash算法

Andy

大作业(一)

橘子皮嚼着不脆

有技术和落地,区块链才能创造价值

CECBC

区块链

搭建自己的MinDoc文档库

后台技术汇

28天写作

即时通讯的原理和历史

v16629866266

强!腾讯老兵亲荐“从零开始学架构”教你如何成为出色的架构师?(整整2000页的笔记)

比伯

Java 编程 架构 面试 程序人生

期末大作业(一)

wanlinwang

金三银四将至!我肝了万字的Java垃圾回收,看完你还敢说不会?

编程 面试 JVM

重学JS | 聊聊闭包

梁龙先森

大前端 编程语言 28天写作

别小看 Log 日志,它难住了我们组的架构师

Java架构师迁哥

大作业二

fmouse

架构师训练营第 1 期

最新区块链科普图书《区块链进化史》上市

CECBC

区块链 科普

【JS】函数实参与形参

德育处主任

JavaScript 大前端 js 28天写作

HDFS SHELL详解(2)

罗小龙

hadoop 28天写作 hdfs shell

大作业一

fmouse

架构师训练营第 1 期

去中心化DAPP系统APP开发|去中心化DAPP软件开发

系统开发

极客时间架构 1 期:大作业二 学习大总结

Null

大作業(二)mindmap

Judyyy

极客时间架构 1 期:大作业一 根据业务编写指定输出系统概要设计

Null

大作業(一)(PPT)

Judyyy

Java并发编程实战(2)- Java内存模型

技术修行者

Java 并发编程 happens-before 多线程

在 win 10 上安装 Elasticsearch 7.10.1

escray

elasticsearch elastic 28天写作 死磕Elasticsearch 60天通过Elastic认证考试

RocketMQ学习笔记

大刘

RocketMQ MQ 消息队列

智慧城市发力,区块链助力土木建设数据存储

CECBC

土木建设

太过完美!滴滴全球首发Spring5+SpringMVC5+Mybatis3.X全彩小册

Java架构追梦

Java 源码 架构 滴滴 ssm

大作业(二)

橘子皮嚼着不脆

APICloud AVM多端开发 | 企业app开发解析:案例展示、加盟申请功能源码

YonBuilder低代码开发平台

大前端 小程序flutter, 跨平台 APICloud

  • 扫码添加小助手
    领取最新资料包
使用 AWS Systems Manager 和 AWS Lambda 实现跨账户的共享服务调用_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章