前言

最近做的一个项目是要把公司在国外已经上线的一个物联网的项目移植到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. sqli-labs-master less06

    第六关与第五关步骤无区别,请参考 sqli-labs-master less05 及 Burp Suite暴力破解示例 区别:在第二步判断注入类型时发现 加单引号与不加单引号没有区别,加双引号时报错, ...

  2. Netty 搭建 WebSocket 服务端

    一.编码器.解码器 ... ... @Autowired private HttpRequestHandler httpRequestHandler; @Autowired private TextW ...

  3. 再见!【JAVA GUI】

    1.GUI概述 图形用户界面(Graphical User Interface,简称 GUI,又 称图形用户接口)是指采用图形方式显示的计算机操作用户界面. java作为一种面向对象的程序设计语言,它 ...

  4. mySQL初学者一定要掌握的数据操纵

    本文献给与作者一样不断地在追求梦想的小伙伴! 文章目录 1.INSERT 语句为表中所有字段添加数据 (1)可以指定所有字段名添加数据 (2)可以不指定字段名添加数据 (3)可以指定部分字段添加数据 ...

  5. 第8.9节 Python类中内置的查看直接父类的__bases__属性

    终于介绍完了__init__方法和__new__方法,接下来轻松一下,本节介绍类中内置的__bases__属性. 一. 语法释义 Python 为所有类都提供了一个 bases 属性,通过该属性可以查 ...

  6. 第12.2节 Python sys模块导览

    sys模块包括一些用于系统处理的功能,常用的成员包括: sys.argv:当前执行进程的命令参数列表,不含执行程序本身的名字: sys.stdin .sys.stdout 和 stderr :分别对应 ...

  7. Mybatis学习04

    title: Mybatis学习04 date: 2020-01-20 21:48:00 tags:Mybatis学习的第四篇笔记 这次的笔记主要是mybatis中的注解 <!--more--& ...

  8. jq中$(function(){})和js中window.onload区别

    先看下执行代码: $(function(){   console.log("jq");}) $(function(){   console.log("jq1") ...

  9. jQuery无限滚动

    由于demo实在虚拟桌面写的,所以懒得在敲一遍了,直接贴图了

  10. 链判断运算符和Null 判断运算符

    链判断运算符 如果我们要获取一个对象的深层嵌套属性,例如获取文章标题res.data.article.title,然后为了安全起见,我们肯定不能直接这样获取,万一res对象没有article属性了呢, ...