{"value":"#### **一. 前言**\n\n在 Amazon,我们始终坚持以客户为中心并不遗余力地帮助客户取得成功。因此,当我们找到一种有趣且高效的方法,而且是用 Amazon 服务组合来创建有价值的功能时,我们希望其他客户也能够了解它,这样他们也可以从中获益。这里我们分享的一个例子,即使用 Amazon 支持 API、EventBridge、Lambda、Athena、S3和 QuickSIght 创建了一个跨帐户支持案例面板。跨帐户案例面板是 Amazon 提供的支持 API 和一系列工具组合的自动化运维范例,它允许用户在单个位置查看多个帐户的案例详细信息。\n\nAmazon 客户打开支持案例是为了解决问题,获取更多关于 Amazon 服务的信息,即用户在设计应用程序时遇到问题,通过案例来获取相应的指导分析和解决方案等。而对于商业和企业支持客户,有无数的用户可以打开无限数量的案例,因此,任何给定的客户在任何给定的时间都可能有数十个甚至数百个支持案例,特别是有的大型客户或合作伙伴可能每月就会开启数百甚至数千支持案例,对于任何一个客户或合作伙伴来说,集中查看所有用户打开的案例并了解其情况是很有价值的,能帮助他们方便的参考当前案例和过往案例的概况,同时也易于与组织内的其他人分享案例中的经验教训以提高生产力,而 Amazon 的合作伙伴可以利用面板的观察,准确掌控案例开启和处理的状况来提高案例的处理质量。(如下是面板示例)\n\n![image.png](https://dev-media.amazoncloud.cn/69cf864700a04202bfc7de8a1f541c97_image.png)\n\n#### **二. 方案概览**\n\n这里是展示了一个在跨账户下实现中心化案例管理的面板设计应用架构,其中集成了 Amazon Support API、Lambda、Athena、Quicksight等服务组件:\n\n![image.png](https://dev-media.amazoncloud.cn/61255869478a406bac4530b69a67eda1_image.png)\n\n此方案布署前需要进行一些角色的初步配置,即为了能够具备跨账户描述支持案例内容的权限,需要在子帐户中创建了一个 IAM 角色。然后允许它们被主账户 IAM 角色用 assume role方式来访问。\n\n#### **三. 具体实现过程**\n\n##### 1) 配置 sub-account 的role\n\n在 sub-account 里创建CF stack,以便能允许 master-account 用assume role 方式来调用 Support API 查询案例情况:\n\n![image.png](https://dev-media.amazoncloud.cn/396145bc04c84e6d8d87c49a06c3cd77_image.png)\n\nTemplate 的参考文件可以从[这里](https://db2lbj04e3hrq.cloudfront.net/read-only-support-role-subaccount.json)获得。\n\n![image.png](https://dev-media.amazoncloud.cn/3f6096b8e79f44f285237d03a154bbc9_image.png)\n\n如上请保持 role name 不变,并输入 master-account 的账户ID,然后点 Next,直到 stack 创建完成。\n\n**2) Lambda 的配置:**\n\n创建 Lambda:\n\na) 先创建 Lambda 的 role ex. “masterrole”,其应包含 lambda execute、SES、Amazon support Access 和 S3 的 permission 的权限。\n\nb) 选Create Function from ‘Author from Scratch’:\n\n![image.png](https://dev-media.amazoncloud.cn/2c298ffe696e499896cf8dc274aaf188_image.png)\n\n其中用刚建的 lambda role 来执行。\n\n把如下代码贴入 lambda 文件:\n\n其中需要修改参数如下:\n\n**bucketname** (S3桶名),\n\n**filename** (从s3桶里读取的账户列表文件名) ,\n\n**SES_Region** (SES区域名), **SES_SENDFROM** (发送者邮箱)和**SES_SENDTO**(接受者邮箱),\n\n查询过去多少天(** delta #负数**)的案例处理情况。\n\n```\n#!/usr/bin/env python\nimport boto3\nimport csv\nimport os\nimport json\nimport datetime\n#For email\nfrom email.mime.application import MIMEApplication\nfrom email.mime.multipart import MIMEMultipart\nfrom email.mime.text import MIMEText\nfrom email.utils import COMMASPACE, formatdate\n\ndef lambda_handler(event, context):\n sts_client = boto3.client('sts')\n s3=boto3.client('s3')\n bucketname = '<bucket name'\n filename='path to accountIDs file'\n api_region = 'us-east-1'\n SES_SENDFROM = '<mail from address>'\n SES_SENDTO = '<mail to address>'\n SES_REGION = '<SES region name>'\n #Read AccountIDs\n fileobj= s3.get_object(\n Bucket=bucketname,\n Key=filename,)\n accountid = fileobj['Body'].read().decode('utf-8').splitlines()\n f = open('/tmp/case_list.csv', 'w+', newline='\\n', encoding='utf-8')\n csv_writer = csv.writer(f)\n csv_writer.writerow(['case-id', 'status', 'severity','service', 'subject', 'createdtime', 'case-owner', 'account-id'])\n for line in accountid:\n aid = line.strip()\n assumed_role_object = sts_client.assume_role(\n RoleArn=\"arn:aws:iam::\"+aid+\":role/GetSupportInfoRole\",\n RoleSessionName=\"masterrolesession\"\n )\n credentials = assumed_role_object['Credentials']\n #Switch Role to execute\n case_client = boto3.client(\n 'support',\n region_name = api_region,\n aws_access_key_id=credentials['AccessKeyId'],\n aws_secret_access_key=credentials['SecretAccessKey'],\n aws_session_token=credentials['SessionToken'],\n )\n now = datetime.datetime.now()\n timeline = (now + datetime.timedelta(days=<delta#>)).strftime(\"%Y-%m-%dT%H:%M:%S\")\n case_response = case_client.describe_cases(includeResolvedCases=True,afterTime=timeline)\n #Get Case Status\n for i in range(len(case_response['cases'])):\n case_id = case_response['cases'][i]['displayId']\n case_status = case_response['cases'][i]['status']\n case_severity = case_response['cases'][i]['severityCode']\n case_service = case_response['cases'][i]['serviceCode']\n case_subject = case_response['cases'][i]['subject']\n case_date = case_response['cases'][i]['timeCreated']\n case_owner = case_response['cases'][i]['submittedBy']\n fields=[case_id,case_status,case_severity,case_service,case_subject,case_date,case_owner,aid]\n print(fields)\n csv_writer.writerow(fields)\n f.close()\n s3.upload_file(\"/tmp/case_list.csv\",bucketname,\"casefile/case_list.csv\")\n #Sending Email\n msg = MIMEMultipart()\n msg['From'] = SES_SENDFROM\n msg['To'] = COMMASPACE.join(SES_SENDTO.split(\",\"))\n msg['Date'] = formatdate(localtime=True)\n msg['Subject'] = \"Case Status\"\n text = \"Find your Case Status Report attached\\n\\n\"\n msg.attach(MIMEText(text))\n with open(\"/tmp/case_list.csv\", \"rb\") as fil:\n part = MIMEApplication(\n fil.read(),\n Name=\"case_list.xlsx\"\n )\n part['Content-Disposition'] = 'attachment; filename=\"%s\"' % \"case_list.xlsx\"\n msg.attach(part)\n # Sending Mail notification\n ses = boto3.client('ses', region_name=SES_REGION)\n result = ses.send_raw_email(\n Source=msg['From'],\n Destinations=SES_SENDTO.split(\",\"),\n RawMessage={'Data': msg.as_string()}\n )\n```\n\nc) 增加一个触发器:\n\n可以在 lambda 配置界面直接增加一个触发器:\n\n![image.png](https://dev-media.amazoncloud.cn/579baaf83c844d4c8eb76b4f00afa93b_image.png)\n\n同时创建一个新的规则:\n\n![image.png](https://dev-media.amazoncloud.cn/a66bcf7ca8d04ea1a66a74d9c3e2d0e8_image.png)![image.png](https://dev-media.amazoncloud.cn/f70af29325ba44b3983a4443b863f695_image.png)\n\n触发器规则中设定相应的定期触发时间,让 lambda 去定时获取相应的 \n case 处理情况。\n\n**3) Athena 的设定:**\n\na) 首先创建一张数据表,建表的SQL语句:\n\n```\nCREATE EXTERNAL TABLE <table name> (\n caseid STRING,\n status STRING,\n severity STRING,\n service STRING,\n subject STRING,\n createdtime STRING,\n caseowner STRING,\n accountid STRING\n) \nROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' \nSTORED AS TEXTFILE LOCATION 's3://<S3 bucketname and prefix>' \nTBLPROPERTIES (\"skip.header.line.count\" = \"1\")\n```\n\n注意:如前面 lambda 配置,建议把 account list 文件和生成的案例列表文件放在 s3 桶下不同的 prefix 下。\n\nb) 查询数据表做数据验证:\n```SELECT * FROM <table name> limit 100;```\n\n##### **4) Quicksight 的配置:**\n\na) 首先新建一个新的数据集:\n\n![image.png](https://dev-media.amazoncloud.cn/2941c8d47f404a408a0fbb7cd0db2925_image.png)\n\nb) 以上面这个新的数据集创建一个 analysis:\n\n![image.png](https://dev-media.amazoncloud.cn/3add745a9d0d435ab4411d147e43c3b7_image.png)\n\nc) 最后以 pivot table 图形类型来创建你自己的案例面板:\n\n![image.png](https://dev-media.amazoncloud.cn/e44c27b2277c4c0eae5368e0c4dd379f_image.png)\n\n除了上面生成案例面板外,也可以通过其它类型图表实现自定义案例状态、类型和紧急程度的其它可视化图表等。\n\n![image.png](https://dev-media.amazoncloud.cn/9028c81cbf3640d3965ff0815e8cac30_image.png)\n\n#### **总结**\n\n客户越来越多地组织管理多个帐户并要求提供管理多帐户的功能,而集中管理多客户支持案例是您面临的一个挑战吗?如前述内容描述,我们利用自动化运维的方式,通过集成 EventBridge、Lambda 和 QuickSight 为您轻松构建可视化面板,如果您觉得会从中获得价值并可以打造自己定制的面板,请参考以上的方案来尝试看是否能够解决。我们也会通过更多类似的案例分享给用户我们更多的经验和方法。\n\n#### **更多内容**\n\n更多有关 Amazon Support SDK及 Lambda 实现相关内容,请大家参考 Amazon SDK,STS 和 Lambda 官方文档::\n\n[https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/support.html#Support.Client.describe_cases](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/support.html#Support.Client.describe_cases)\n\n[https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-api.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-api.html)\n\n[https://docs.aws.amazon.com/lambda/latest/dg/services-cloudwatchevents.html](https://docs.aws.amazon.com/lambda/latest/dg/services-cloudwatchevents.html)\n\n[https://docs.aws.amazon.com/cli/latest/reference/s3api/get-object.html](https://docs.aws.amazon.com/cli/latest/reference/s3api/get-object.html)\n\n[https://docs.aws.amazon.com/cli/latest/reference/support/describe-cases.html](https://docs.aws.amazon.com/cli/latest/reference/support/describe-cases.html)\n\n#### **本篇作者**\n\n![image.png](https://dev-media.amazoncloud.cn/7e16727e89a24fb3931c551d296b6279_image.png)\n\n#### **Harris Han**\n\n AWS 技术客户经理,负责企业级客户的架构和成本的优化、技术支持与服务等工作,同时致力于亚马逊云科技在国内和全球的应用及企业级服务的推广,并在产品部署、网络安全,桌面云,服务器虚拟化,企业运维管理等领域拥有丰富的设计与实践经验。","render":"<h4><a id=\"__0\"></a><strong>一. 前言</strong></h4>\n<p>在 Amazon,我们始终坚持以客户为中心并不遗余力地帮助客户取得成功。因此,当我们找到一种有趣且高效的方法,而且是用 Amazon 服务组合来创建有价值的功能时,我们希望其他客户也能够了解它,这样他们也可以从中获益。这里我们分享的一个例子,即使用 Amazon 支持 API、EventBridge、Lambda、Athena、S3和 QuickSIght 创建了一个跨帐户支持案例面板。跨帐户案例面板是 Amazon 提供的支持 API 和一系列工具组合的自动化运维范例,它允许用户在单个位置查看多个帐户的案例详细信息。</p>\n<p>Amazon 客户打开支持案例是为了解决问题,获取更多关于 Amazon 服务的信息,即用户在设计应用程序时遇到问题,通过案例来获取相应的指导分析和解决方案等。而对于商业和企业支持客户,有无数的用户可以打开无限数量的案例,因此,任何给定的客户在任何给定的时间都可能有数十个甚至数百个支持案例,特别是有的大型客户或合作伙伴可能每月就会开启数百甚至数千支持案例,对于任何一个客户或合作伙伴来说,集中查看所有用户打开的案例并了解其情况是很有价值的,能帮助他们方便的参考当前案例和过往案例的概况,同时也易于与组织内的其他人分享案例中的经验教训以提高生产力,而 Amazon 的合作伙伴可以利用面板的观察,准确掌控案例开启和处理的状况来提高案例的处理质量。(如下是面板示例)</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/69cf864700a04202bfc7de8a1f541c97_image.png\" alt=\"image.png\" /></p>\n<h4><a id=\"__8\"></a><strong>二. 方案概览</strong></h4>\n<p>这里是展示了一个在跨账户下实现中心化案例管理的面板设计应用架构,其中集成了 Amazon Support API、Lambda、Athena、Quicksight等服务组件:</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/61255869478a406bac4530b69a67eda1_image.png\" alt=\"image.png\" /></p>\n<p>此方案布署前需要进行一些角色的初步配置,即为了能够具备跨账户描述支持案例内容的权限,需要在子帐户中创建了一个 IAM 角色。然后允许它们被主账户 IAM 角色用 assume role方式来访问。</p>\n<h4><a id=\"__16\"></a><strong>三. 具体实现过程</strong></h4>\n<h5><a id=\"1_____subaccount_role_18\"></a>1) 配置 sub-account 的role</h5>\n<p>在 sub-account 里创建CF stack,以便能允许 master-account 用assume role 方式来调用 Support API 查询案例情况:</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/396145bc04c84e6d8d87c49a06c3cd77_image.png\" alt=\"image.png\" /></p>\n<p>Template 的参考文件可以从<a href=\"https://db2lbj04e3hrq.cloudfront.net/read-only-support-role-subaccount.json\" target=\"_blank\">这里</a>获得。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/3f6096b8e79f44f285237d03a154bbc9_image.png\" alt=\"image.png\" /></p>\n<p>如上请保持 role name 不变,并输入 master-account 的账户ID,然后点 Next,直到 stack 创建完成。</p>\n<p><strong>2) Lambda 的配置:</strong></p>\n<p>创建 Lambda:</p>\n<p>a) 先创建 Lambda 的 role ex. “masterrole”,其应包含 lambda execute、SES、Amazon support Access 和 S3 的 permission 的权限。</p>\n<p>b) 选Create Function from ‘Author from Scratch’:</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/2c298ffe696e499896cf8dc274aaf188_image.png\" alt=\"image.png\" /></p>\n<p>其中用刚建的 lambda role 来执行。</p>\n<p>把如下代码贴入 lambda 文件:</p>\n<p>其中需要修改参数如下:</p>\n<p><strong>bucketname</strong> (S3桶名),</p>\n<p><strong>filename</strong> (从s3桶里读取的账户列表文件名) ,</p>\n<p><strong>SES_Region</strong> (SES区域名), <strong>SES_SENDFROM</strong> (发送者邮箱)和<strong>SES_SENDTO</strong>(接受者邮箱),</p>\n<p>查询过去多少天(** delta #负数**)的案例处理情况。</p>\n<pre><code class=\"lang-\">#!/usr/bin/env python\nimport boto3\nimport csv\nimport os\nimport json\nimport datetime\n#For email\nfrom email.mime.application import MIMEApplication\nfrom email.mime.multipart import MIMEMultipart\nfrom email.mime.text import MIMEText\nfrom email.utils import COMMASPACE, formatdate\n\ndef lambda_handler(event, context):\n sts_client = boto3.client('sts')\n s3=boto3.client('s3')\n bucketname = '<bucket name'\n filename='path to accountIDs file'\n api_region = 'us-east-1'\n SES_SENDFROM = '<mail from address>'\n SES_SENDTO = '<mail to address>'\n SES_REGION = '<SES region name>'\n #Read AccountIDs\n fileobj= s3.get_object(\n Bucket=bucketname,\n Key=filename,)\n accountid = fileobj['Body'].read().decode('utf-8').splitlines()\n f = open('/tmp/case_list.csv', 'w+', newline='\\n', encoding='utf-8')\n csv_writer = csv.writer(f)\n csv_writer.writerow(['case-id', 'status', 'severity','service', 'subject', 'createdtime', 'case-owner', 'account-id'])\n for line in accountid:\n aid = line.strip()\n assumed_role_object = sts_client.assume_role(\n RoleArn="arn:aws:iam::"+aid+":role/GetSupportInfoRole",\n RoleSessionName="masterrolesession"\n )\n credentials = assumed_role_object['Credentials']\n #Switch Role to execute\n case_client = boto3.client(\n 'support',\n region_name = api_region,\n aws_access_key_id=credentials['AccessKeyId'],\n aws_secret_access_key=credentials['SecretAccessKey'],\n aws_session_token=credentials['SessionToken'],\n )\n now = datetime.datetime.now()\n timeline = (now + datetime.timedelta(days=<delta#>)).strftime("%Y-%m-%dT%H:%M:%S")\n case_response = case_client.describe_cases(includeResolvedCases=True,afterTime=timeline)\n #Get Case Status\n for i in range(len(case_response['cases'])):\n case_id = case_response['cases'][i]['displayId']\n case_status = case_response['cases'][i]['status']\n case_severity = case_response['cases'][i]['severityCode']\n case_service = case_response['cases'][i]['serviceCode']\n case_subject = case_response['cases'][i]['subject']\n case_date = case_response['cases'][i]['timeCreated']\n case_owner = case_response['cases'][i]['submittedBy']\n fields=[case_id,case_status,case_severity,case_service,case_subject,case_date,case_owner,aid]\n print(fields)\n csv_writer.writerow(fields)\n f.close()\n s3.upload_file("/tmp/case_list.csv",bucketname,"casefile/case_list.csv")\n #Sending Email\n msg = MIMEMultipart()\n msg['From'] = SES_SENDFROM\n msg['To'] = COMMASPACE.join(SES_SENDTO.split(","))\n msg['Date'] = formatdate(localtime=True)\n msg['Subject'] = "Case Status"\n text = "Find your Case Status Report attached\\n\\n"\n msg.attach(MIMEText(text))\n with open("/tmp/case_list.csv", "rb") as fil:\n part = MIMEApplication(\n fil.read(),\n Name="case_list.xlsx"\n )\n part['Content-Disposition'] = 'attachment; filename="%s"' % "case_list.xlsx"\n msg.attach(part)\n # Sending Mail notification\n ses = boto3.client('ses', region_name=SES_REGION)\n result = ses.send_raw_email(\n Source=msg['From'],\n Destinations=SES_SENDTO.split(","),\n RawMessage={'Data': msg.as_string()}\n )\n</code></pre>\n<p>c) 增加一个触发器:</p>\n<p>可以在 lambda 配置界面直接增加一个触发器:</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/579baaf83c844d4c8eb76b4f00afa93b_image.png\" alt=\"image.png\" /></p>\n<p>同时创建一个新的规则:</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/a66bcf7ca8d04ea1a66a74d9c3e2d0e8_image.png\" alt=\"image.png\" /><img src=\"https://dev-media.amazoncloud.cn/f70af29325ba44b3983a4443b863f695_image.png\" alt=\"image.png\" /></p>\n<p>触发器规则中设定相应的定期触发时间,让 lambda 去定时获取相应的<br />\ncase 处理情况。</p>\n<p><strong>3) Athena 的设定:</strong></p>\n<p>a) 首先创建一张数据表,建表的SQL语句:</p>\n<pre><code class=\"lang-\">CREATE EXTERNAL TABLE <table name> (\n caseid STRING,\n status STRING,\n severity STRING,\n service STRING,\n subject STRING,\n createdtime STRING,\n caseowner STRING,\n accountid STRING\n) \nROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' \nSTORED AS TEXTFILE LOCATION 's3://<S3 bucketname and prefix>' \nTBLPROPERTIES ("skip.header.line.count" = "1")\n</code></pre>\n<p>注意:如前面 lambda 配置,建议把 account list 文件和生成的案例列表文件放在 s3 桶下不同的 prefix 下。</p>\n<p>b) 查询数据表做数据验证:<br />\n<code>SELECT * FROM <table name> limit 100;</code></p>\n<h5><a id=\"4____Quicksight__178\"></a><strong>4) Quicksight 的配置:</strong></h5>\n<p>a) 首先新建一个新的数据集:</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/2941c8d47f404a408a0fbb7cd0db2925_image.png\" alt=\"image.png\" /></p>\n<p>b) 以上面这个新的数据集创建一个 analysis:</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/3add745a9d0d435ab4411d147e43c3b7_image.png\" alt=\"image.png\" /></p>\n<p>c) 最后以 pivot table 图形类型来创建你自己的案例面板:</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/e44c27b2277c4c0eae5368e0c4dd379f_image.png\" alt=\"image.png\" /></p>\n<p>除了上面生成案例面板外,也可以通过其它类型图表实现自定义案例状态、类型和紧急程度的其它可视化图表等。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/9028c81cbf3640d3965ff0815e8cac30_image.png\" alt=\"image.png\" /></p>\n<h4><a id=\"_196\"></a><strong>总结</strong></h4>\n<p>客户越来越多地组织管理多个帐户并要求提供管理多帐户的功能,而集中管理多客户支持案例是您面临的一个挑战吗?如前述内容描述,我们利用自动化运维的方式,通过集成 EventBridge、Lambda 和 QuickSight 为您轻松构建可视化面板,如果您觉得会从中获得价值并可以打造自己定制的面板,请参考以上的方案来尝试看是否能够解决。我们也会通过更多类似的案例分享给用户我们更多的经验和方法。</p>\n<h4><a id=\"_200\"></a><strong>更多内容</strong></h4>\n<p>更多有关 Amazon Support SDK及 Lambda 实现相关内容,请大家参考 Amazon SDK,STS 和 Lambda 官方文档::</p>\n<p><a href=\"https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/support.html#Support.Client.describe_cases\" target=\"_blank\">https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/support.html#Support.Client.describe_cases</a></p>\n<p><a href=\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-api.html\" target=\"_blank\">https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-api.html</a></p>\n<p><a href=\"https://docs.aws.amazon.com/lambda/latest/dg/services-cloudwatchevents.html\" target=\"_blank\">https://docs.aws.amazon.com/lambda/latest/dg/services-cloudwatchevents.html</a></p>\n<p><a href=\"https://docs.aws.amazon.com/cli/latest/reference/s3api/get-object.html\" target=\"_blank\">https://docs.aws.amazon.com/cli/latest/reference/s3api/get-object.html</a></p>\n<p><a href=\"https://docs.aws.amazon.com/cli/latest/reference/support/describe-cases.html\" target=\"_blank\">https://docs.aws.amazon.com/cli/latest/reference/support/describe-cases.html</a></p>\n<h4><a id=\"_214\"></a><strong>本篇作者</strong></h4>\n<p><img src=\"https://dev-media.amazoncloud.cn/7e16727e89a24fb3931c551d296b6279_image.png\" alt=\"image.png\" /></p>\n<h4><a id=\"Harris_Han_218\"></a><strong>Harris Han</strong></h4>\n<p>AWS 技术客户经理,负责企业级客户的架构和成本的优化、技术支持与服务等工作,同时致力于亚马逊云科技在国内和全球的应用及企业级服务的推广,并在产品部署、网络安全,桌面云,服务器虚拟化,企业运维管理等领域拥有丰富的设计与实践经验。</p>\n"}