前言

最近做的一个项目是要把公司在国外已经上线的一个物联网的项目移植到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. 手把手教你使用Vue/React/Angular三大框架开发Pagination分页组件

    DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师.官方网站:devui.designNg组件库:ng-devui(欢迎S ...

  2. web服务器专题:tomcat基础及模块

    Web服务器专题:Tomcat(一)基础架构 针对java系的经典服务器,打算系统的整理一下Tomcat的机制和一些原理,以此记录. 插一则题外话,关于tomat这个名字的由来:Tomcat 名称的由 ...

  3. charles功能(三)弱网测试(模拟超慢网速,会导致接口数据返回超时的那种慢)

    模拟超慢网速(会导致接口数据返回超时的那种...) 设置带宽和延迟时间(毫秒) 注:可以根据下图中的翻译体会下导致网络延迟的原因: 然后打开网页回变得非常满

  4. linux下的bash shell

    运行bash shell命令的方式 vi t1.sh 并输入 pwd ls pwd 然后:x保存关闭 1.首先查看权限 ls -l,如果没有执行权限则用chmod a+x t1.sh ,最后运行./t ...

  5. PyQt(Python+Qt)学习随笔:QDateTimeEdit日期时间编辑部件

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 Designer输入部件中,Date/Time E ...

  6. 图论-zkw费用流

    图论-zkw费用流 模板 这是一个求最小费用最大流的算法,因为发明者是神仙zkw,所以叫zkw费用流(就是zkw线段树那个zkw).有些时候比EK快,有些时候慢一些,没有比普通费用流算法更难,所以学z ...

  7. Spring Cloud Alibaba (一): SpringCloud与SpringBoot版本选型

    前言   近年SpringCloud与SpringBoot更新迭代非常频繁,导致我们对两者的版本选型非常的困难.若是版本选择有问题, 会导致开发中调试兼容性占用非常多的得必要时间. SpringClo ...

  8. vue 按键修饰符 keyup

    按键修饰符 keyup 通过官方文档可查询到特殊的按键修饰符 .enter .tab .delete (捕获"删除"和"退格"键) .esc .space .u ...

  9. bp VNext 入门——让ABP跑起来

    因好多群友@我说,ABP他们简单的了解了下,按照官方的教程一路下来跑不起来(倒在了入门的门口),才有了此文. 此文结合官方文档,一步一步带领大家让ABP跑起来(跨过门口). 建议大家一步一步实际动手操 ...

  10. 精尽Spring MVC源码分析 - HandlerAdapter 组件(三)之 HandlerMethodArgumentResolver

    该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...