[学习笔记] AWS

根账户

使用IAM服务创建用户,创建用户组,使用IAM用户进行操作
注意这里是账户,而账户可以创建IAM用户

  • 创建用户组
  • 分配策略
    • AWS托管
    • 客户托管
    • 内联
  • 创建用户
    • 密钥访问(生产服务)
    • 密码访问(控制台)
  • 添加到用户组

  • 用户
  • 角色

SSH密钥对

创建SSH密钥,在密钥对进行创建,在AWS,密钥对是一种资源

  • 通过AWS创建,或者导入

安全组

也就是防火墙

  • 控制流量协议和端口和来源以及进出

创建实例

  • 选择AMI镜像
  • 选择实例类型
  • 选择网络,IAM角色等
  • 选择储存数量
  • 添加标签
  • 配置安全组
  • 启动,选择密钥对

EBS

  • SSD gp2
  • SSD io1
  • HDD st1
  • HDD sc1

就是卷,然后可以进行挂载,可以参考K8s里的Volume

企业的多账户策略

企业采用多AWS账户策略通常是个很好的选择,因为它能提供最大数量的资源和足够成都的安全隔离

如:

  • 为开发人员单独创建aws账户
  • 为生成环境单独创建aws账户

也就是各种环境隔离

  • 身份账户体系结构
  • 日志账户体系结构
  • 发布账户体系结构
  • 账单结构

创建 IAM 用户的一般使用案例

  • 不使用根账户是一种最安全的做法,因为根账户会授予访问所有服务和资源的权限。授予用户最小数量的必要权限,这称为最低权限。
  • 您组中的其他人拥有各种访问和授权权限。当您使用 IAM 用户时,可以更轻松地向访问特定服务和相关资源的特定用户分配策略。
  • IAM 用户可以使用 AWS CLI。
  • IAM 用户可以使用角色。
  • 组是一个IAM 用户集合。您可以通过组向多个用户分配权限,这会让这些用户的权限管理工作变得更加轻松。

身份账户体系结构

如果只有一个AWS账户,管理任务相对简单,但是进一步扩展后将会变得非常复杂,比如

  • 账户A
    • IAM用户
  • 账户B
    • IAM用户

公司有N个账户,开发者需要对每个账户都有权限,则需要在每个账户下创建IAM用户,如果开发者离职,需要进入每个账户进行删除,非常麻烦。可以使用中央身份账户体系,设置中央身份账户,集中为组织建立用户,密码以及访问密钥,管理用户

            graph LR
            Account ---> Account A
Account ---> Account B
Account ---> Account C
Account ---> Account D
          

实际操作

  • 在身份账户(ID:shengfen)中创建一个开发用户,IAM用户名为zhangsan
  • 在生产环境账户(ID:shengchan)中创建一个跨账户角色,CA-TEST,并分配S3储存桶的完全访问权限
  • 在身份账户(ID:shenfen)中配置允许用户zhangsan切换到生产环境账户(shengchan)的CA-TEST的角色
            graph LR
            登录身份账户 ---> 切换角色 ---> 生产环境账户 ---> 管理 S3
          
  • 流程:
    • 在身份账户里IAM里创建生产环境账户(ID:zhangsan)
    • 生产环境账户(ID:shengchan)创建跨账户角色 CA-TEST
      • 创建角色 -> 其他AWS账户
      • 输入身份账户的ID:shengfen
      • 在权限里选择S3全部权限
      • 取名CA-TEST
    • 在身份账户下配置允许切换到CA-TEST的权限
      • 身份账户进入IAM,给张三用户添加权限
      • 添加内联策略

AWS Organizations

是一项账户管理服务,能够将多个AWS账户整合到创建并集中管理的组织中,包含账户管理和整合账单功能

  • 主账户:创建组织的账户
  • 成员账户:加入组织的账户

服务器控制策略(SCP)

  • 跟:应用于组织中的所有账户

  • OU:应用于OU及其任何子OU的中的所有账户

  • 账户:应用于账户的策略仅应用于这一个账户

  • 流程:

    • 在AWS Organizations里邀请账户
    • 然后启用服务控制策略
    • 创建策略并分配策略

组织账户的根账户也会收到限制

集中式日志储存架构

  • 尽早定义日志保留的要求以及日志生命周期策略
  • 日志生命周期策略自动化
  • 自动安装和配置日志传输代理程序
  • 支持混合云架构(私有云+公有云)

AWS提供很多服务帮助构建集中式日志解决方案

  • AWS ElasticSearch Service
  • AWS CLoudWatch Logs
  • Kinesis Firehose
  • AWS S3

配置CloudTrail和Config日志跨AWS账户储存

账户A+账户B

  • 账户A(中央账户)

    • 账户B AWS Config -> 账户A S3 桶1
    • 账户B AWS CloudTrail -> 账户A S3 桶2
  • 流程

    • 账户A创建存储桶1,2
    • 账户A创建存储桶策略
      • s3.GetBucketAcl
      • s3.PutObject
    • 账户B在CloudTrail创建跟踪
      • 指定存储桶名称

S3的访问策略

用IAM分配用户中的的权限,如果想跨账户管理权限,需要使用存储桶来管理

  • 可以用访问策略,限制IP访问等

跨账户S3存储桶访问

将S3存储桶的访问权限授予属于不同AWS账户的委托人,在组织的AWs架构中非常常见

  • 账户A (运行S3)
  • 账户B (运行EC2)

将账户B中EC2数据,备份到账户A的S3,在账户A下进行一下配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "cross",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::账户BID:root"
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::存储桶",
"arn:aws:s3:::存储桶/*",
]
}
]
}

但是现在账户B的文件,账户A无法访问

IAM策略评估

  • 默认情况下所有的请求都被拒绝(隐式拒绝)
  • 评估所有附加的策略
  • 代码将要检测在策略中是狗有应用于请求的Deny语句,如有则拒绝
  • 如果没有显示拒绝,代码检测是否有允许请求的操作,有则允许
  • 如果没有则隐式拒绝

拒绝策略有限度大于允许策略

AWS STS

为了开发测试代码,需要有一些资源的访问权限,可以使用

  • 提供密钥,设置期限
  • AWS STS生成临时凭证
  1. 在IAM中创建一个跨账户角色
  2. 附加一个S3策略到IAM角色
  3. 允许IAM用户STS Assume Role权限
  4. 开发人员申请Assumes Role
  5. 返回一个临时凭证
  6. 使用临时凭证进行访问

AWS KMS

是一项托管服务,可以创建和控制加密数据所用的加密密钥,创建的密钥受硬件安全模块保护

  • 完全托管
  • 集中式密钥管理
  • 管理AWS服务的加密
  • 成本低廉
  • 支持跨账户

  • 创建一个CMK(客户主密钥)
  • 定义密钥管理员及密钥用户
  • 密钥用户使用密钥ID来加密和解密数据

AWS创建的密码永远不会在创建区域外使用,且不会显示,只能通过密钥ID进行使用

1
2
3
4
# 加密
aws kms encrypt --key-id 密钥ID --plaintext "text" --query CiphertextBlob --output text | base64 --deode > encrypttest
# 解密
aws kms decrypt --ciphertext-blob fileb://文件 --query Plaintext --output text | base64 --decode

网络ACL

  • 网络ACL是没有任何状态的
  • ACL运行在子网级别,而安全组运行在实例级别
  • VPC中的每个子网都必须与一个网络ACL相关联
  • 默认网络ACL的内容为允许所有入站和出站的流量
安全组 网络ACL
在实例基本运行 在子网级别运行
仅支持允许规则 支持允许规则和拒绝规则
有状态 无状态

RDS只读副本

AWS RDS使用MariaDB,MySQL,Oracle,PostgreSQL数据库引擎的内置复制功能来从源数据库实例创建一个特殊类型的数据库实例,称为只读副本,对源数据库实例的更新将异步复制到只读副本

  • 可以创建最多5个只读副本
  • 副本只能读不能写
  • 副本可以提升为主数据库

负载均衡器

  • Classic Load Balancer
  • NLB
  • ALB

目前Classic Load Balancer是上一代负载均衡器,只被推荐用于ec2-classic的网络场景

Classic Load Balancer NLB ALB
TCP,SSL/TLS,HTTP,HTTPS TCP,UDP,TLS HTTP,HTTPS,HTTP/2
VPC,ec2-classic VPC VPC
ec2-classic 极致性能,固定IP 灵活管理

ALB

  • 支持HTTP/HTTPS
  • 支持基于路径、基于主机的路由
  • 可以将IP地址注册为目标
  • 支持Lambda函数
  • 支持SNI
  • 支持单个实例多个端口之间进行负载平衡

NLB

  • 在OSI第四层传输层
  • 对于TCP
    • 基于协议,源IP地址,源端口,目标IP地址,目标端口,TCP序列号,使用流哈希算法进行负载均衡
    • 每个单独的TCP链接在有效期内指挥路由到单个目标
  • 能够处理突发和不稳定的流量模式,处理极具波动的工作负载,可扩展到每秒处理数百万个请求

弹性伸缩架构

  • 始终保持当前实例数量
    • 类似K8s里面的ReplicaSets
  • 手动扩展
    • 设置最大最小容量,并设置所需容量变化
  • 按计划扩展
    • 创建定时的扩展任务
  • 根据需求进行扩展
  • 预测式扩展

实例状态检查和自动恢复

  • AWS会对每个EC2实例执行自动检查以识别硬件和软件问题
  • 状态检查式内置的,不能禁用和删除
  • 状态检查每分钟仅一次,会返回通过和失败状态
  • 可以创建CloudWatch警报,用于监控

类型

  • 系统状态检查
    • 网络链接丢失
    • 系统电源损耗
    • 物理主机上的软件问题
    • 物理主机上影响到网络链接状态的硬件问题
  • 实例状态检查
    • 系统状态检查故障
    • 实例的网络或启动配置不正确
    • 内存耗尽
    • 系统文件损坏
    • 内核不兼容

S3跨区域复制 CRR

  • 跨AWS S3存储桶自动以异步方式复制对象
  • 可在不同AWS区域或在相同区域中自动复制存储桶中的对象
  • 复制目标存储桶可为相同AWS账户或不同账户拥有
  • 跨区域复制一般用于满足合规性要求,最大限度减少延迟,灾难恢复等
  • 源存储桶和目标存储桶必须已启用版本控制
  • 创建规则前的对象不会自动复制

Elastic Beanstalk

  • 能够让开发人员更加轻松地在AWS中快速部署和管理应用程序
  • 只需要上传应用程序,Elastic Beanstalk将自动处理容量预配置,负载均衡,Auto Scaling和应用程序允许状况监控的部署细节
  • 支持多种语言和Docker
  • 不额外收费,只付费运行所需资源和存储

  1. 创建应用程序,选择平台
  2. 上传应用代码

类似PaaS?

放置群组

可以让启动的实例物理上互相靠近一些

  • 集群
    • 将一个可用区中靠经的实例打包在一起
    • 用于可收益于低网络延迟或高网络吞吐量的应用程序
    • 适用于HPC应用程序通常使用的紧密耦合的节点到节点通信的要求
    • 一个集群不能跨多个地区
    • 对于实例类型有要求
  • 分区
    • 将实例分布在不同的逻辑分区上
    • 通常为大型分布式和重复的工作负载所使用,例如,Hadoop,Cassandra和Kafka
    • 在分区置放群组中启动实例时,EC2将尝试跨指定数量的分区均匀分发实例
    • 对于每个可用区,一个分区置放群组最多可具有7个分区
  • 分布
    • 将每个实例放置在不同的机架上

网络吞吐量受短板影响

  • 如果你在停止放置群组中的某个实例,然后重启该实例,则其仍将在该置放群组中运行
  • 如果已有正在运行的实例的置放群组中启动实例时接收到容量错误信息,请在该置放群组中停止并启动所有实例,然后尝试再次启动

VPC终端节点

网关终端节点

VPC终端节点能够通过AWS的私有网络连接到支持的AWS服务,而不需要通过公网

  • 终端节点是虚拟设备,他们是水平扩展,冗余和高度可用的VPC组件
  • 访问AWS服务无需Internet网关,NAT网关/实例
  • 网关终端节点只支持S3和DynamoDB
  • 排除终端节点问题
    • DNS解析配置
    • 路由表
  • 需要为每一个VPC创建一个网关
  • 需要更新路由表,在其中创建到AWS服务的路由
  • 网关终端节点,是在VPC级别定义的
    • EC2->路由表->终端节点->S3
  • 必须在VPC中启用DNS解析
  • 创建的网关终端节点只能在创建的VPC里使用,无法扩展到VPC之外

VPC终端节点策略

在创建终端节点时,可以通过配置终端节点策略,来控制对连接到的AWS服务的访问

  • 终端节点策略,使用Json文档来控制服务的访问
  • 终端节点策略不会覆盖或取代IAM用户策略或服务特定策略
  • IAM仍然可以不通过这个终端节点来进行访问(公网)

同时在S3的那边

  • 使用S3存储桶策略,可以控制从特定终端节点或特定VPC对存储桶的访问
    • 只允许从特定的终端节点
    • 只允许从特定VPC访问(仅私网)
  • 无法使用IP限制,只能限制共有IP

实例安全组 -> 路由表 -> VPC终端节点策略 -> S3存储桶策略 (IAM角色)

VPC对等连接

用来连接2个VPC网络,两个VPC中的实例之间的通信就像在同一网络中一样,流量一直处于AWS网络,不会经过公网

  • VPC不能有重叠的CIDR块
  • VPC对等连接不支持传递
  • 可在自己账户的VPC与其他AWS账户的VPC之间创建对等连接
  • 需要手动更新每个VPC子网的路由表
  • 支持跨AWS区域
  • 可以引用另一端的对等VPC中的安全组,作为安全组规则中的入出向规则的源或目标
  • 流量会选择路由表中与流量最匹配的,最明确的路由条目,对流量进行路由

无效VPC对等配置

  • 重叠CIDR块
  • 对等连接不支持传递
  • 不支持边界到边界的路由(和不能传递差不多)

VPC

  • CIDR,规定VPC的网络,16~28
  • 私有IP
  • 与其他虚拟网络隔离
  • 子网
    • 位于VPC内,创建子网需要指定子网CIDR
    • 每个子网都必须完全位于一个可用区之内
    • 在子网中启动的实例,都会被分配一个私有IP
  • 路由表
    • 用于决定来自子网或网关的网络流量的流向
    • 主里有表以及自定义路由表,与子网进行挂链
  • 网关
    • 一种横向扩展,冗余且高度可用的VPC组件,将VPC接入internet
    • 为已经分配了共有IP的实例进行网络地址转换
  • 共有子网
    • 有一条内容将0.0.0.0/0的流量发送到internet网关的路由
    • 实例需要有唯一IP地址
  • 私有子网
    • 通过NAT实例或者NAT网关访问internet
    • NAT网关或实例需要配置在公有子网
    • 添加0.0.0.0/0将所有流量路由至NAT网关
  • NAT实例
    • 需要部署在共有子网
    • 添加0.0.0.0/0将所有流量路由至NAT实例
    • 带宽受限,便宜
  • NAT网关
    • 带宽自动扩展,网关每小时费率及数据处理费率
    • 在每个可用区时高度可用
    • 在每个可用区中创建一个NAT网关,可确保架构不依赖于可用区
    • 需要绑定一个弹性IP地址
  • 网络ACL
  • 安全组
  • VPC流日志
    • 捕获有关传入和传出VPC中网络接口的IP流量的信息
    • 可以发布到AWS CloudWatch Logs或S3
    • 可以为VPC,子网或网络接口(ENI)创建流日志
  • 堡垒机
    • 通过堡垒机登录私有子网实例
    • 需要自己配置
  • 支持IPv6
    • 创建一个IPv6的CIDR与该VPC关联,互联网网关附加到您的VPC
    • 公有子网
    • 私有子网

AWS VPN

基于客户端的托管VPN服务,可以使用基于OpenVPN的VPN客户端从任何位置访问AWS私有子网的资源

软件VPN

自行搭建VPN

  • AWS建议为每个用户VPC创建单独的VPN连接
  • 对于多VPC,可用Direct Connect

共享服务VPC

  • 创建一个用于放置共享服务的VPC
  • 共享服务VPC与本地数据中心之间创建AWS site-to-site VPN连接
  • 将本地数据中心的需要共享的服务,应用服务,数据库等等,在共享服务VPC做一个副本,或者在共享服务VPC部署一批代理服务,将其他VPC之间访问本地的请求,通过代理服务进行代理
  • 将VPC分别和共享服务VPC创建VPC对等连接

其他方式Transit VPC(可传递)
Transit Gateway

VPC终端节点服务

  • 配置为终端节点服务后,其他AWS用户可使用VPC接口终端节点,通过AWS的私有网络访问应用程序
  • 提供了一种最安全,高度的可扩展的方式,将应用程序提供给上千个VPC访问
  • 不需要创建VPC对等连接,不需要NAT,互联网网关,也不需要配置路由表

AWS CloudFormation

基础架构及代码

  • 可跨多个AWS账户,区域,快速的部署
  • 可参考Terraform

创建资源的权限和使用的IAM用户的权限一致

  • CloudFormer
    • 可从账户中现有AWS资源创建AWS CloudFormation模板
  • ChangeSets
    • 当需要更新堆栈时,在实施之前可以通过更改集,了解更改会如何影响正在允许的资源
  • StackSets
    • 使用堆栈集可以跨多个AWS账户和区域创建,更新或删除堆栈
  • 堆栈策略
    • 防止堆栈资源在堆栈更新过程中被意外更新或删除

DeletionPolicy

  • Retain
    • 可用向任何资源类型添加次删除策略
    • 在其堆栈被删除时会保留资源,而不删除资源或其内容
  • Snapshot
    • 删除资源前做快照
    • 支持EC2的EBS卷等等
  • Delete
    • 将删除资源及其所有内容(如果适用)
    • 对于S3,需要清空才能删除

Route53

是高可用性和可扩展性的域名系统(DNS)Web服务,三个主要功能

  • 域名注册
  • DNS解析
  • 运行状况检查

  • A记录:解析到IPv4地址
  • AAAA记录:解析到IPv6地址
  • CNAME记录:流量路由到另外一个域名
  • ALIAS:流量路由到AWS资源
    • 支持顶级域名
  • 其他记录类型

TTL:指缓存DNS记录的时间

简单路由策略

  • 将流量路由到单个资源
  • 简单路由策略无法附加健康状况检查

加权路由策略

  • 允许将多个资源关联至单个域名,并可配置向每个资源路由多少流量
  • 非常适用于软件新版本的测试
  • 两个AWS区域分配流量,实现负载均衡
  • 可以关联健康状态检查

故障转移路由策略

  • 当主资源不健康时,返回辅助记录

延迟路由策略

  • 从用户到延迟最低的AWS区域处理用户的请求
  • 评估延迟是指从用户端到AWS区域的延迟
  • 添加健康状况检查,提高自动故障迁移能力

地理位置路由策略

  • 根据用户地理位置选择提供流量的资源
  • 创建默认记录,处理来着未映射到任何位置的以及未创建地理位置记录的记录
  • 内容本地化或者因法律法规要求,网站或业务只服务于某些国家等需求时非常适用

嵌套记录策略

  • 比如先用延迟路由策略,然后再加权路由策略

多值应答路由策略

  • 允许配置为返回多个值来响应DNS查询
  • 多值应答路由允许附加并检查每个资源的运行状况
  • 每一次多值应答查询最多返回8个健康的记录
  • 不能代替负载均衡器

部署方式

  • User Data
    • EC2实例的User Data
    • 第一次启动EC2实例时
    • 简单,常见的配置任务
  • AMI
    • 创建AMI
    • 安装运行环境,更新操作系统,安装工具
    • 可同时使用User Data做环境的快速配置
  • AutoScaling组
    • 启动模板或者启动配置都可以基于之前创建的AMI
  • CodeDeploy
    • 用于将创建的应用程序部署至AWS
      • EC2的in-place就地部署
      • AutoScaling组的in-place就地部署
      • 创建新的AutoScaling组的蓝/绿部署
      • Lambda函数的Traffic Shifting部署
      • ECS的新任务集的Traffic Shifting部署
  • Elastic Beanstalk
    • 一次性部署全部
    • 滚动部署以及批次滚动部署
    • 不可变部署
    • 蓝绿部署
  • OpsWorks
    • Chef或者Puppet
    • 可以管理EC2实例以及ELB
    • 不负责管理AutoScaling组
  • SAM
    • 利用CloudFormation和CodeDeploy

EC2类型

  • R类型,内存优化型实例,适用于应用程序需要大量的内存和内存缓存数据库
  • C系列,计算优化型实例,适用于应用程序需要大量的计算能力
  • M系列,通用型实例,提供平衡的计算
  • I系列,适用于应用程序本地需要高性能IO,实例储存
  • G系列,适用于需要GPU计算能力的业务
  • T2/T3,可突增性能实例,将积分用于CPU使用的实例
  • T2/T3 unlimited,适用于负载长时间运行再超基准CPU的使用率

  • 按需实例
  • Spot实例,价格会低一些,适用于可灵活控制应用程序的运行时间且应用程序可以中断
  • 预留实例,最低1年
    • 可以升降配
    • 可转换预留实例
    • 计划预留实例
  • 专用实例,没有其他用户共享硬件
  • 专用主机,EC2实例容量完全专供使用的物理服务器
    • 现有的软件许可是基于CPU插槽,内核或者按虚拟机授权
    • 希望实例重启后还运行再当前的主机上,需要通过主机关联配置进行设置

  • CPU
  • 网络
  • 状态检查指标
  • 磁盘
  • 不提供内存响应指标

参考资料