AWS-CLI:使用命令行免登陆创建、控制EC2、更换ip等操作
AWS-CLI:使用命令行免登陆创建、控制EC2、更换ip等操作
home again安装AWS CLI
AWS CLI分为版本1和版本2,这里我们安装版本2。
Linux系统
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64-2.0.30.zip" -o "awscliv2.zip" |
MacOS系统
curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg" |
Windows系统
下载软件安装即可。
https://awscli.amazonaws.com/AWSCLIV2.msi
###检查安装
输入如下命令即可检查是否安装成功
aws --version |
结果类似如下即表示安装成功:
aws-cli/2.1.24 Python/3.7.4 Windows/10 botocore/2.0.0 |
配置环境
###创建用户
首先登陆aws控制台,然后打开如下地址以创建一个新用户。或者通过aws控制台搜索【iam】进入。
https://console.aws.amazon.com/iam
在导航窗格中,选择用户,然后创建用户,给用户随便取个名:AWS-Cli。访问类型:编程访问
。
创建新组,分配权限 AmazonEC2FullAccess
,意为对EC2相关的产品有完全的访问权限。
创建用户一共有五步,上面只给出最关键的两步,其他都是 下一步。
创建成功后,我们就获得了 Access Key ID
和 Secret Access Key
,务必保存 ID 和 Key ,关闭窗口后将无法再次找到。
###配置环境
使用如下命令配置aws的环境。
aws configure |
依次输入 Access Key ID、 Secret Access Key 、默认地区和输出格式。默认地区指的是在你不指定地区时默认使用此地区,输出格式指的是aws向你呈现结果的格式。默认地区我们不选择,直接回车;输出格式选择json或者table,便于阅读。
当我们需要修改配置,有这几个方法:
- configure 命令
仍然使用命令:aws configure,不需要修改的配置直接回车,需要修改的直接输入即可。 - set 命令
使用set命令,指定要修改的配置,如修改地区region为us-west-2.aws configure set region us-west-2
3、修改文件
直接进入保存配置的文件修改,简单粗暴。默认路径:
- 凭证文件: ~/.aws/credentials(在 Linux 或 macOS 上)或 C:\Users\USERNAME.aws\credentials(在 Windows 上)
- 配置文件: ~/.aws/config(在 Linux 或 macOS 上)或 C:\Users\USERNAME.aws\config(在 Windows 上)。
操作安全组
创建安全组
aws ec2 create-security-group --group-name my-sg --description "My security group" --vpc-id vpc-1a2b3c4d --region us-west-2 |
- group-name:安全组的组名。
- description:简单描述安全组。
- vpc-id:ec2的id,因为我们没有ec2就可以不用此参数。
- region:指定地区。因为我们在配置aws时没有指定region,这里就必须指定。
查看安全组
aws ec2 describe-security-groups --region us-west-2 |
如果加上 group-ids 参数,就能查看指定的安全组,否则就是查看当前地区所有的安全组。aws有很多地方都这样,不加参数就显示全部,加上参数就是指定。除了group-ids,还有 group-names。
另外aws必须要有地区概念,无论是安全组还是密钥对,ec2就更不用说,都存在“地区隔离”。us-west-2创建的任何东西都无法在其他地区使用,所以请指定region。
添加规则
创建好了安全组后,我们需要往它里面添加规则。下面表示指定id为sg-903004f8的安全组开放tcp协议、端口3389给 ip段:203.0.113.0/24。
aws ec2 authorize-security-group-ingress --group-id sg-903004f8 --protocol tcp --port 3389 --cidr 203.0.113.0/24 |
一般情况下我们是会向外界开放所有流量的,下面使用命令开放所有协议允许所有流量:
aws ec2 authorize-security-group-ingress --group-id sg-903004f8 --protocol all --cidr 0.0.0.0/0 |
删除安全组
aws ec2 delete-security-group --group-id sg-903004f8 |
操作密钥
创建密钥
aws ec2 create-key-pair --region us-west-2 --key-name MyKeyPair --query 'KeyMaterial' --output text > MyKeyPair.pem |
- key-name:密钥名
- output:密钥格式
- MyKeyPair.pem:保存到本地当前目录的密钥名。确保和key-name一致,否则你会搞混的。
查看密钥
查看名为MyKeyPair的密钥。请注意:密钥生成后保管好,无法再次查看和创建。丢失后只能创建新的密钥对。
aws ec2 describe-key-pairs --key-name MyKeyPair --region us-west-2 |
删除密钥
删除名为MyKeyPair的密钥。
aws ec2 delete-key-pair --key-name MyKeyPair |
创建EC2
完成安全组和密钥的创建后,现在开始创建EC2实例。
aws ec2 run-instances --image-id ami-xxxxxxxx --count 1 --instance-type t2.micro --key-name MyKeyPair --security-group-ids sg-903004f8 --subnet-id subnet-6e7f829e |
- image-id:镜像id,就是系统
- count:创建数量。默认是1
- instance-type:套餐类型。
-key-name:选择我们上面创建好的密钥 - security-group-ids:选择我们上面创建好的安全组
- subnet-id:子网id。可以不指定,会默认选择
查看ec2
aws ec2 describe-instances --filters "Name=instance-type,Values=t2.micro" --region us-west-2 |
查看套餐为t2.micro的系统。不加filters显示所有。filters意为过滤,筛选符合条件的结果。下面是filters支持的参数:
- image-id:镜像id
- instance-id:实例id
- ip-address:ipv4地址
- instance-type:套餐类型
- key-name:实例对应的密钥名
- availability-zone:所在地区
- instance.group-name:实例所在的安全组名
- instance.group-id:实例所在的安全组id
- private-ip-address:内网ip
假设知道一个vps的实例id为i-0648f34776c549d6d,根据实例id查询vps的ip地址:
aws ec2 describe-instances --filters "Name=instance-id,Values=i-0648f34776c549d6d" --query "Reservations[].Instances[].[PublicIpAddress]" --output text |
终止ec2
终止ec2意味着删除。一旦ec2的状态变为 shutting-down 或 terminated,那么你也将停止为该ec2付费。
aws ec2 terminate-instances --instance-ids i-5203422c |
停止ec2
理解为关机。
aws ec2 stop-instances --instance-ids i-5203422c |
开启ec2
aws ec2 start-instances --instance-ids i-5203422c |
重启ec2
aws ec2 reboot-instances --instance-ids i-5203422c |
更换IP
确定vps等InstanceId和其ip地址,首先分配一个新的弹性ip
aws ec2 allocate-address --domain vpc --query "PublicIp" --output text |
执行后会出现一个ip地址,这就是我们的新ip。例如:192.168.1.1
aws ec2 associate-address --instance-id InstanceId --public-ip 192.168.1.1 |
把新ip绑定到vps,这里 InstanceId 指的就是vps。绑定了新ip后,我们找到旧ip的分配id。
aws ec2 describe-addresses --filters "Name=public-ip,Values=OldPublicIpAddress" --query "Addresses[*].[AllocationId]" --output text |
利用这个分配id,我们就能释放旧ip了。
aws ec2 release-address --allocation-id AllocationId |
分配ip用了associate-address命令,这个命令用法(支持的参数):
- domain:指定弹性ip分配到VPC还是Classic中,不用想只能是VPC
- address:要从地址池中恢复的弹性ip或者ipv4
显示结果:
{ |
除了弹性ip以外,还有一个 AllocationId 分配id,这个分配id可以用来关联到实例。
关联/绑定ip:associate-address
- instance-id:要关联的实例id
- public-ip:要关联的弹性ip
- allocation-id:要关联的弹性ip的分配id
输出结果是关联id:
{ |
有关联就有取消关联:disassociate-address
- association-id:要取消关联的关联id
- public-ip:要取消关联的弹性ip
释放ip:release-address。释放的是弹性ip,可以使用弹性ip地址或者分配id来释放
- allocation-id:根据分配id释放
- public-ip:根据ip地址释放
ec2实例自带的外网ip不是弹性ip,在第一次将弹性ip关联到实例时,是没有弹性ip空闲的,也就不用释放。将关联实例的弹性ip取消关联后,实例会重新生成新ip,这个新ip也不是弹性ip。具体理解请前往lightsail进行申请、绑定、解绑弹性ip操作,你会加深aws的弹性ip关联的理解。
根据这些命令,就能写出一个创建、删除、重启、开关机、更换ip的脚本了。完整的关于ec2的命令行官方文档:
https://docs.aws.amazon.com/cli/latest/reference/ec2
地区
- 弗吉尼亚:us-east-1
- 俄亥俄州:us-east-2
- 加利福尼亚:us-west-1
- 俄勒冈:us-west-2
- 开普敦:af-south-1
- 香港:ap-east-1
- 孟买:ap-south-1
- 大阪:ap-northeast-3
- 首尔:ap-northeast-2
- 新加坡:ap-southeast-1
- 悉尼:ap-southeast-2
- 东京:ap-northeast-1
- 加拿大:ca-central-1
- 法兰克福:eu-central-1
- 爱尔兰:eu-west-1
- 伦敦:eu-west-2
- 米兰:eu-south-1
- 巴黎:eu-west-1
- 斯德哥尔摩:eu-north-1
- 巴林:me-south-1
- 圣保罗:sa-east-1
不同账户默认开放不同的地区,创建之前请注意地区权限。一般默认禁用 香港、巴林、开普敦和米兰。
套餐类型
- t2.nano:1vCPU 0.5GiB
- t2.micro:1vCPU 1GiB(符合条件免费)
- t2.small:1vCPU 2GiB
- t2.medium:2vCPU 4GiB
- t2.large:2vCPU 8GiB
- t2.xlarge:4vCPU 16GiB
- t2.2xlarge:8vCPU 32GiB
- t3.nano:2vCPU 0.5GiB
- t3.micro:2vCPU 1GiB
- t3.small:2vCPU 2GiB
- t3.medium:2vCPU 4GiB
- t3.large:2vCPU 8GiB
- t3.xlarge:4vCPU 16GiB
- t3.2xlarge:8vCPU 32GiB
- … …
- … …
- … …
镜像id
1、控制台
登陆控制台,打开下面地址:
https://console.aws.amazon.com/ec2/
2、命令行查找
aws ec2 describe-images --owners self amazon |
3、参考下面
下面都是免费镜像,其他镜像自行前往控制台查看。
Linux 2 AMI:ami-093d73f27794c5b1d
Red Hat Enterprise Linux 8:ami-f4fab885
SUSE Linux Enterprise Server 15 SP2:ami-0b4017973f2328b15
SUSE Linux Enterprise Server 12 SP5:ami-0937793114349c8fe
Ubuntu Server 20.04 LTS:ami-0774445f9e6290ccd
Ubuntu Server 18.04 LTS:ami-036915aa0cb1d91a1
Ubuntu Server 16.04 LTS:ami-a7a9ebd6
Microsoft Windows Server 2019:ami-0b6b45fa8b883020b
Microsoft Windows Server 2012 R2 Base:ami-04cd2556af182fac8
Microsoft Windows Server 2016 Base:ami-0156dd61aa6aaf241
Microsoft Windows Server 2004 Core Base:ami-02c5a5352e19d7115
Debian 10:ami-05b7d5ed6f439d5f6