前言

最近做的一个项目是要把公司在国外已经上线的一个物联网的项目移植到AWS中国区来。

由于AWS属于国外云产商,在中国运营,必须符合国家的相关规定:

  • 必须是合资公司 (AWS北京区由北京光环新网运营,宁夏区由西云数据运营)
  • 拿到ICP认证
  • 服务器和数据必须在物理上中国境内
  • 其他

AWS在Global区已有的服务,也是一点点在中国上线的,例如2020年上线了很多重要的服务,Route53、Certificate Manager等等, 可以在这里查看最新上线的服务

我曾经问过AWS中国的support人员,其他未上线的服务是否有时间表?support人员,一般标准回答都是:"没有准确的时间表。"

AWS的中国区和AWS在Global的其他区之间是"不相通的";账号是独立分开的,中国区的账号下,目前只有北京和宁夏两个region

从这段时间的工作经验,总结出要把国外的AWS云项目移植到中国需要注意的一些"坑", 其中很多问题,在中文社区很难找到相关文章,所以决定分享出来,避免大家再走弯路!

坑一:arn问题

问题描述

AWS的各个资源,都有一个arn,作为全局唯一的标识, 例如:arn:partition:service:region:account-id:resource-id

我们一般会在代码中会直接这样写:arn:aws:apigateway:region:lambda, 这样写,在AWS Global基本上没有问题,但是在中国区,AWS采取了不同的arn

上面的那个例子在中国区就变成了: arn:aws-cn:aipgateway:region:lambda

大部分公司都希望一套代码在全球使用,不希望单独为中国区准备一个版本。那怎么样做到兼容呢?

解决方案

在cloudFormation内建脚本中有一个参数Partition, 有了这个参数,上面的arn的写法就变成了: arn:${AWS::Partition}:apigateway:${AWS::Region}:lambda

为了做到批量修改,我们可以使用一些辅助工具replace,它还支持正则表达式

以下是一段参考脚本,适用于在CloudFormation中存在arn hardcode的情况, 可以根据具体情况进行修改替代规则

npm install -g replace
replace '!Sub "arn:aws:' '!Sub "arn:${AWS::Partition}:' *.template.yaml
replace '"arn:aws:iot:",{ "Fn::Sub": "${AWS::Region}" }' '{ "Fn::Sub": "arn:${AWS::Partition}:iot:${AWS::Region}" }' *.template.yaml

坑二:网址域名后缀

问题描述

在Global区,在生成的APIGateway和S3地址都是:https://.amazonaws.com, 在中国区变成了https://.amazonaws.com.cn

解决方案

目前我采取的方案,有些ugly:

  • 把所有hardcode的amazonaws.com用占位符替换掉
  • 部署的时候,根据目标环境替换成对应的值

    伪代码
# preparation
replace '.\$\{AWS::Region\}.amazonaws.com' '.${AWS::Region}.#AMAZONAWS#' *.template.yaml # deployment stage
if "target is China"
replace '#AMAZONAWS#' 'amazonaws.com.cn' *.template.yaml
else
replace '#AMAZONAWS#' 'amazonaws.com' *.template.yaml

坑三:可用区问题

问题描述

在Global区,大部分的region都有3个及以上可用区,所以在自动化创建VPC脚本里面,会默认使用3个可用区,however,在北京区(cn-north-1)目前只有两个可用区

解决方案

为了兼容性,方案类似于坑二,就是在部署脚本中需要判断目标区域的可用区数量,然后决定是用2个或3个可用区的脚本,建议VPC的部署脚本分成两份,一份支持两个可用区,另外一个支持三个可用区

坑四:APIGateway端口 80\443默认关闭问题

问题描述

曾经被这个问题耽误了很长时间,明明一个很简单的APIGateway+lambda应用,从本地postman怎么也发不通!后来发现每个账号,默认80和443端口是不通的!

解决方案

需要从AWS Console录一个support的case来开通。另外你的组织可能已经开始使用AWS Organization来管理多级账号了,每个子账号都需要用这种方式来开通端口

case参考模板:

坑四:计费单位

问题描述

有时候需要设置一些Alarm,当费用超预算时,自动邮件通知,设置计费单位的时候,需要注意,中国区目前只支持CNY

解决方案

不要hardcode,而是把计费单位作为参数传进去

Parameters:
MoneyUnit:
Type: String
Default: USD
Resources:
DynamoDBBudget:
Type: "AWS::Budgets::Budget"
Properties:
Budget:
BudgetLimit:
Amount: !Ref DynamoDBBillingTreshold
Unit: !Ref MoneyUnit
TimeUnit: MONTHLY

不可用服务替代方案

之前提过,很多服务在中国区未上线,不可用,但很多全球项目又深度依赖这些服务。这个时候,就需要寻找替代方案。顺便说一下,在做整体架构设计的时候,可能需要考虑我的现有代码要从一个云产商移植到另外一个云产商需要付出的代价,这里就不展开讲了。

AWS Cognito User Pool -> Keycloak

问题描述

我们的项目深度依赖Cognito user pool, Cognito user pool和APIGateway集成, 做用户身份验证和授权,遗憾的是这个服务在中国区不可用。

解决方案

我们找到一个非常强大的做用户管理和身份验证的开源项目:Keycloak

经过实践,完美解决:用lambda写一个customize authorizer和APIGateway进行集成

其他

一位一起工作的国外同事,在国外,经常碰到一些网络连接的问题,开AWS China Console间歇性断网,非常影响工作效率。

后来的临时解决方案是先走公司内网,连到一台中国的服务器(jump server),再从这台服务器上连接AWS Console。

总觉得不是一个非常好的方案,建议能在国内有一名开发人员配合工作,提高效率!

写在最后

说是“坑”,其实是调侃,毕竟世界发展太快,之前的开发人员可能也没预料到科技受到各种ZZ因素的影响,导致无法理想化的大一统!

程序员就是这么一个职业,不断的给别人挖坑,填别人的坑!哈哈

好了,分享使我快乐,有什么问题,请留言。

AWS中国区的那些“坑”的更多相关文章

  1. AWS中国区使用https访问部署在S3上的网站

    问题描述 最近一个项目需要通过https的方式访问部署在S3上的网站,通过搜索引擎找到一篇文章,可以在AWS Global实现整个过程.但是目前AWS中国区有限制,CloudFront不能使用AWS ...

  2. 那些天使用AWS填过的坑和注意事项

    一直在找免费的GPU云端,在某乎上看到AWS提供免费的,就上去试了下,结果那个免费一年的只有CPU,并没有GPU,GPU还是需要付费的,相关背景就说这些,下面放几个相关教程,里面会说怎么使用,看了这几 ...

  3. Python使用boto3操作AWS S3中踩过的坑

    最近在AWS上开发部署应用. 看了这篇关于AWS中国区填坑的文章,结合自己使用AWS的经历,补充两个我自己填的坑. http://www.jianshu.com/p/0d0fd39a40c9?utm_ ...

  4. AWS 移动推送到iOS设备,Amazon Pinpoint

    前言 第一次对接aws,遇到的坑是真多.现在记录一下.本文主要用到的是[Amazon Pinpoint]推送. 开发人员的指南:https://docs.aws.amazon.com/zh_cn/pi ...

  5. 使用aws和tomcat搭建服务器过程中的一些坑.

    在国外没啥事做, 考前也不愿意复习, 看到aws能免费试用一年, 于是就试着搞了搞, 就准备搭建个个人网站玩玩. aws的注册与创建实例 首先个人感觉这个东西使用起来还是很方便的, 一开始注册完验证完 ...

  6. java操作AWS S3一些坑记录

    1,aws sdk jar版本不一致问题 一开始我在pom.xml中只配置了如下aws-java-sdk-s3 <!-- https://mvnrepository.com/artifact/c ...

  7. AWS云创建EC2与使用注意事项-踩坑记录

    目录 AWS 一 创建 EC2(云服务器) 二.AWS 注意事项 三.AWS 申请 SSL 证书 四. 创建VPC AWS 文章 GitHub 地址: 点我 AWS云服务器价格计算器 AWS WEB ...

  8. 坑:jmeter部署AWS云服务器时出现连接超时Non HTTP response code: org.apache.http.conn.HttpHostConnectException

    背景: jmeter脚本部署到云服务器(AWS EC2)公网上时,启动jmeter脚本运行了5个小时才运行完毕,后面发现脚本报错timeout(如图),找了很久不知道原因,后面进入脚本发现全部在报错. ...

  9. AWS EC2 外网不能访问的坑

    概述 今天我在 AWS EC2 上配置并启动了 nginx,但是通过外网不能访问,查了一下资料终于解决了,记录下来供以后开发时参考,相信对其它人也有用. 外网访问不了的原因 外网访问不了的原因不外乎有 ...

随机推荐

  1. 在VMware下创建windows server 2008虚拟机

    1.创建新的虚拟机 打开VMware软件,点击主页内创建新的虚拟机 2.进入新建虚拟机向导 点击典型,点击下一步 3.在下一步中单击稍后安装操作系统 点击下一步 4.选择操作系统类型 客户机操作系统选 ...

  2. c++11-17 模板核心知识(十二)—— 模板的模板参数 Template Template Parameters

    概念 举例 模板的模板参数的参数匹配 Template Template Argument Matching 解决办法一 解决办法二 概念 一个模板的参数是模板类型. 举例 在c++11-17 模板核 ...

  3. 再也不担心写出臃肿的Flink流处理程序啦,发现一款将Flink与Spring生态完美融合的脚手架工程-懒松鼠Flink-Boot

    目录 你可能面临如下苦恼: 接口缓存 重试机制 Bean校验 等等...... 它为流计算开发工程师解决了 有了它你的代码就像这样子: 仓库地址:懒松鼠Flink-Boot 1. 组织结构 2. 技术 ...

  4. MySQL——事务ACID&隔离级别

    数据库事务ACID&隔离级别 什么是事务 事务是用户定义的一个数据库操作序列.这些操作要么全执行,要么全不执行,是一个不可分割的工作单元.在关系型数据库中,事务可以是一条SQL语句,也可以是一 ...

  5. linux离线安装docker + docker-compose

    1 准备阶段(docker) 1.1 卸载旧版本 如果电脑上已经存在docker,需要先卸载可能存在的旧版本: 1. 删除某软件,及其安装时自动安装的所有包 sudo apt-get autoremo ...

  6. PyQt(Python+Qt)学习随笔:QMainWindow的addDockWidget方法增加QDockWidget停靠窗到主窗口

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 DockWidget除了放在QMainWindow窗口内外,也可以放在 ...

  7. 第11.18节 Python 中re模块的匹配对象

    匹配对象是Python中re模块正则表达式匹配处理的返回结果,用于存放匹配的情况.老猿认为匹配对象更多的应该是与组匹配模式的功能对应的,只是没有使用组匹配模式的正则表达式整体作为组0. 为了说明下面的 ...

  8. 西湖论剑2020MISC-Yusa_yyds

    非常规USB流量分析 附件下载: 链接:https://pan.baidu.com/s/1Gjgj1EH9qmX0PYi21uYlDg 提取码:x9xn 先提取USB流量数据,使用工具: https: ...

  9. java中的反射(三)

    目录 一.反射 1.class类 2.访问字段 3.调用方法 4.调用构造方法 5.获取继承对象 6.动态代理 二.sping中的反射 本篇转自:https://depp.wang/2020/05/0 ...

  10. 【题解】NOI 系列题解总集

    每次做一道 NOI 系列的估计都很激动吧,对于我这种萌新来说( P1731 [NOI1999]生日蛋糕 练习剪枝技巧,关于剪枝,欢迎看我的垃圾无意义笔记 这道题是有一定难度的,需要运用各种高科技剪枝( ...