AWS CLI使用 S3命令行使用 实例元数据

AWS CLI使用 S3命令行使用 实例元数据
20180704 Chenxin

参考:
1.https://blog.csdn.net/libing_thinking/article/details/48091743
2.官方文档

对AWS服务操作可以通过管理控制台、各语言SDK、CLI以及API等方式。
API的方式最复杂,需要自己生成哈希值签署请求以及处理请求错误等低级别的操作,AWS 的大部分服务都提供REST的API以及类似于REST的查询API,API提供的服务操作是最新最全面的;
SDK 的好处是封装好了请求签署与请求错误处理以及重试机制,用户只需要直接调用相关接口即可,但对于新的服务及操作的支持可能会滞后于API接口的发布。
CLI 其实也可以看成SDK的一种,它是AWS 服务操作的一把瑞士军刀

CLI需要的访问密钥ID与秘密访问密钥的创建
控制台创建用户密钥
访问密钥包含访问密钥 ID 和 秘密访问密钥
登陆根账号,选中对应的用户,选中"安全证书","创建安全密钥".
记录下此key_id(访问密钥ID)和key(秘密访问密钥).分别是2个文本字段.

到EC2的一个实例上,输入: aws configure,根据提示输入对应的2个字段.
默认会在linux用户主目录下创建.aws目录,包含2个文件:
tree /root/.aws/
/root/.aws/
├── config
└── credentials

[root@ip-10-0-1-23 .aws]# cat config
[default]
region = us-east-1

[root@ip-10-0-1-23 .aws]# cat credentials
[default]
aws_access_key_id = AKIAIK3XXXXXIQ7RI5MQ
aws_secret_access_key = WEJL+311KmXXXXXXXXXbNxYcmHnKRSnFHVBk9E/k6

aws命令的参数
aws xxx:
--profile – 要使用的配置文件的名称或“default”,后者使用默认配置文件。

--region – 要调用的 AWS 区域。
us-east-1 (美东-弗吉尼亚)
ap-southeast-1 (亚太-新加坡)

--output – 输出格式。json,table,text

命令自动补全
bash – 使用内置命令 complete。
$ complete -C '/usr/local/bin/aws_completer' aws

另外,可以将命令添加到 ~/.bashrc 中,以便在每次打开一个bash时运行它。
您的 ~/.bash_profile 应指定 ~/.bashrc的来源,以确保该命令也在登录外壳程序中运行。(默认已指向).
这样,在输入aws 的命令时,只需要输入一半,按tab键则会自动补全剩余命令字段.

常用CLI

S3 相关
S3对应的操作

创建与删除s3(mb,rb)
aws s3 mb s3://s3-cdn-test2 #创建s3
aws s3 rb s3://s3-cdn-test2 #删除s3
aws s3 rb s3://bucket-name --force #强制删除(非空bucket)
aws s3 mb s3://s3-cdn-test2
aws s3 ls s3://s3-cdn-test
aws s3 ls s3://s3-cdn-test/test-cdn/

列举文件(ls)
$ aws s3 ls s3://my-bucket #List the contents of my-bucket
$ aws s3 ls s3://my-bucket/path/ #列举url之下文件名,url路径要完整(包含最后的"/")

分页显示S3的对象
aws s3api list-objects --bucket my-bucket --page-size 100 #默认值是1000个对象属性,可以指定100个.列举的都是文件(对象)各属性(区别于ls)

拷贝文件
aws s3 cp t.txt s3://s3-cdn-test/ --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers #向全世界开放读取权限
aws s3 cp /to/local/path s3://bucket/prefix #只能拷贝文件过去,不可以拷贝文件夹到s3去
aws s3 cp s3://bucket/prefix /to/local/path
aws s3 cp s3://bucket1/prefix1 s3://bucket2/prefix2

删除bucket里的单个文件:
aws s3 rm s3://my-bucket/path/MySubdirectory/MyFile3.txt

删除url下的所有文件:
aws s3 rm s3://s3-cdn-test/test-cdn --recursive
aws s3 rm s3://s3-cdn-test/test-cdn2/ --recursive
当 --recursive 选项与 cp、mv 或 rm 一起用于目录/文件夹时,命令会遍历目录树,包括所有子目录。
与linux系统的 sync 命令相同,这些命令也接受 --exclude、--include 和 --acl 选项。

删除bucket下的所有文件(清空bucket):
aws s3 rm s3://s3-cdn-test --recursive

剪切bucket中文件到本地主机(或相反方向)
aws s3 mv s3://my-bucket/path ./MyDirectory --exclude '' --include '.jpg' --recursive #Move all .jpg files in s3://my-bucket/path to ./MyDirectory

同步目录
aws s3 sync /home/admin/test s3://s3-cdn-test/prefixdir --delete --acl public-read
aws s3 sync /home/admin/test s3://s3-cdn-test/prefixdir --delete --acl private

acl只在首次赋权的时候生效,之后给public-read也不会生效,且无提示.使用此命令,会自动到s3-cdn-test里创建prefixdir目录(其实只是url,存储桶里没有目录概念).

--acl 选项,使用该选项可以设置对复制到 S3 中的文件的访问权限。该选项接受 private、public-read 和 public-read-write 值。
aws s3 sync /home/admin/test s3://s3-cdn-test/prefixdir --delete --acl public-read #再次运行也不会public-read 了.只首次生效

那么,如果首次赋权为public-read了,想把所有文件改为private,应该怎么办呢?好像官方没有给出CLI的方法.

本地->s3 aws s3 sync /to/local/dir s3://bucket/prefixdir [--delete]
s3->本地 aws s3 sync s3://bucket/prefixdir /to/local/dir [--delete]
s3->s3 aws s3 sync s3://bucket1/prefixdir1 s3://bucket2/prefixdir2 [--delete]

匹配,正则
aws s3 sync . s3://my-bucket/path --exclude '.txt' --include 'MyFile.txt' --exclude 'MyFile?.txt'
比如:

backup yure server data

/usr/bin/aws s3 sync /bak/ s3://data-backup-xbzj-yw/yure-server/ --exclude 'jenkins' --exclude 'server-ip' --include '.tar.gz' --acl private
/usr/bin/aws s3 sync /bak/ s3://data-backup-xbzj-yw/yure-server/ --exclude '
jenkins' --exclude 'server-ip' --include '.tar.gz' --delete --acl private

添加区域
/usr/bin/aws s3 sync /home/xbzj/db-files/files/ s3://arch-log-ouzhou/status-log/ --acl private --region eu-central-1

--delete说明(此处可以不看)
通常,sync 仅在源和目标之间复制缺失或过时的文件或对象。不过,您可以提供 --delete 选项来从目标中删除源中不存在的文件或对象。
下面的示例对上一示例进行了扩展,显示了其工作方式。
$ rm ./MyFile1.txt // Delete local file
$ aws s3 sync . s3://my-bucket/path // Attempt sync without --delete option - nothing happens
$ aws s3 sync . s3://my-bucket/path --delete // Sync with deletion - object is deleted from bucket
delete: s3://my-bucket/path/MyFile1.txt
$ aws s3 rm s3://my-bucket/path/MySubdirectory/MyFile3.txt // Delete object from bucket
delete: s3://my-bucket/path/MySubdirectory/MyFile3.txt
$ aws s3 sync s3://my-bucket/path . --delete // Sync with deletion - local file is deleted
delete: MySubdirectory\MyFile3.txt

统计存储桶文件大小
列出每个文件大小,以及合计大小
aws s3 ls s3://xbzj-cloudfront-log --recursive --human-readable --summarize #整个桶,并遍历所有目录
aws s3 ls s3://xbzj-cloudfront-log/cf-logs/ --human-readable --summarize #某个固定目录,不遍历下级目录
aws s3 ls s3://arch-log-ouzhou/status-log/2018/09/ --recursive --human-readable --summarize #遍历对应目录下所有目录和文件

手动分片上传(未测试)
1文件分片
split -b 40m myfile myfile-part-

2创建分片上传任务
aws s3api create-multipart-upload --bucket bucketname --key prefix

3记录返回值
{
"Bucket": "bucketname",
"UploadId": "uploadeid",
"Key": "prefix"}

4上传分片
aws s3api upload-part --bucket bucketname --key prefix --part-number [分片上传编号(e.g. 1,2,3...)] --body myfile-[x] --upload-id uploadid

5列出已上传分片,创建分片结构文件
aws s3api list-parts --bucket bucketname --key prefix --upload-id uploadid
将上命令结果中的parts部分保存为 temp 文件

{"Parts": [
{
"PartNumber": 1,
"ETag": ""xxxxxxx""
},
{
"PartNumber": 2,
"ETag": ""xxxxxxxx""
}
]
}

6结束分片上传任务
aws s3api complete-multipart-upload --multipart-upload file://temp --bucket bucketname --key prefix --upload-id uploadid

获取规范用户ID(未测试)
aws s3api list-buckets --query 'Owner.ID'

AWSCLI 访问阿里云 OSS(未测试)
aws configure --p aliyun #设置key与secret,其他默认
aws configure set s3.addressing_style virtual --p aliyun
aws s3 ls --endpoint-url [url/(e.g. http://oss-cn-hangzhou.aliyuncs.com)] --p aliyun

EC2概览
以下命令会列出 Amazon EC2 的可用子命令。
$ aws ec2 help
$ aws ec2 describe-instances help

实例操作(属性/启动/关闭/生成)
aws ec2 describe-instances #查看各instance属性
aws ec2 describe-instances --region ap-southeast-1
aws ec2 describe-instances --region ap-southeast-1 --instance-ids "i-07263bfbc62a7d33b"
aws ec2 describe-instances --instance-ids "instanceid1" "instanceid2" #默认region里有才行
aws ec2 describe-instances --query 'Reservations[].Instances[].[Placement.AvailabilityZone, State.Name, InstanceId]' --output text
aws ec2 describe-instances --query 'Reservations[].Instances[].[Placement.AvailabilityZone, State.Name, InstanceId]' --output text | grep us-west-2a | grep running | awk '{print $3}'

aws ec2 start-instances --instance-ids "instanceid1" "instanceid2" #启动
aws ec2 stop-intances --instance-ids "instanceid1" "instanceid2" #关闭

aws ec2 run-instances --image-id ami-b6b62b8f --security-group-ids sg-xxxxxxxx --key-name mytestkey --block-device-mappings "[{"DeviceName": "/dev/sdh","Ebs":{"VolumeSize":100}}]" --instance-type t2.medium --count 1 --subnet-id subnet-e8330c9c --associate-public-ip-address
(Note: 若不指定subnet-id则会在默认vpc中去选,此时若指定了非默认vpc的安全组会出现请求错误。如无特殊要求,建议安全组和子网都不指定,就不会出现这种问题。)

加载本地json文件
要避免在命令行中对 JSON 字符串进行转义的需要,请从文件中加载该 JSON。通过使用 file:// 前缀,如以下示例所示。
aws ec2 describe-instances --filters file://filter.json #当前目录下的filter.json
aws ec2 describe-instances --filters file:///tmp/filter.json #/tmp目录下的

加载远程json文件
AWS CLI 还支持使用 http:// 或 https:// URL 从 Internet 上托管的文件中加载参数。下面的示例引用 Amazon S3 存储桶中的一个文件。这将允许您从任何计算机访问参数文件,但要求文件存储在可公开访问的位置。
$ aws ec2 run-instances --image-id ami-a13d6891 --block-device-mappings http://my-bucket.s3.amazonaws.com.cn/filename.json

生成CLI框架,控制命令输出

查看region与AZ
aws ec2 describe-regions #列出全球所有的regions
aws ec2 describe-availability-zones --region ap-southeast-1 #列出此region的可用AZ:"ZoneName": "ap-southeast-1a"

查看当前实例元数据和用户数据
curl http://169.254.169.254/latest/
dynamic
meta-data
user-data

curl http://169.254.169.254/latest/meta-data/ #列出可以查看的当前实例支持项
ami-id 查看当前instance使用的AMI ID
ami-launch-index
ami-manifest-path
block-device-mapping/
hostname
instance-action
instance-id 查看instance id
instance-type 查看配置
local-hostname
local-ipv4 查看内网IP
mac
metrics/
network/
placement/ #查看instance所在区域 curl http://169.254.169.254/latest/meta-data/placement/availability-zone
profile
public-hostname
public-ipv4 查看外网IP
public-keys/
reservation-id
security-groups
services/

curl http://169.254.169.254/latest/dynamic/instance-identity/signature
X1GiQQ0gfhHAhtufYsVmRpekZR1hlTlo+xypIEeGj0ig8ylw8wezcD51uJaguOrJN0DVupA4N5ql
68aMM45yk4T38uWy2iKthapX7Gllt1CPCdJRqCppljiZk2kjCPPGI0mbjLuqS3JXs09e/0jET2zn
mJC6kFG6u+ZKG6POVTg=

curl http://169.254.169.254/latest/user-data/

<title>404 - Not Found</title> #目前查询为404返回页

安全组

指定region,指定VPC:
aws ec2 create-security-group --group-name mygroupname --description mydescription --vpc-id vpc-0f8694367c4046b96 --region ap-southeast-1

指定VPC:
aws ec2 create-security-group --group-name mygroupname --description mydescription --vpc-id vpc-id #若不指定vpc,则在默认vpc中创建安全组

添加访问策略
aws ec2 authorize-security-group-ingress --group-id sg-xxxxyyyy --protocol tcp --port 22 --cidr 0.0.0.0/0
添加允许22端口访问

添加额外其他安全组内资源访问
aws ec2 authorize-security-group-ingress --group-id sg-xxxxyyyy --protocol tcp --port 9999 --source-group sg-xxxxxxxx
从sg-xxxxxxxx安全组内的来源流量访问sg-xxxxyyyy端口为TCP9999的进行放行.(这里需要sg-xxxxxxxx和sg-xxxxyyyy在同一个VPC内,否则会报错.相当于都在防火墙内的资源).

IAM(未测试)

Role 操作
aws iam create-role MY-ROLE-NAME --assum-role-policy-document file://path/to/trustpolicy.json
aws iam put-role-policy --role-name MY-ROLE-NAME --policy-name MY-PERM-POLICY --policy-document file://path/to/permissionpolicy.json
aws iam create-instance-profile --instance-profile-name MY-INSTANCE-PROFILE
aws iam add-role-to-instance-profile --instance-profile-name MY-INSTANCE-PROFILE --role-name MY-ROLE-NAME

STS

代入ROLE的EC2实例的临时认证信息
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/ROLE-NAME
测试结果报404错误

AutoScaling(未测试)
列出AS组
aws autoscaling describe-auto-scaling-groups

列出AS实例
aws autoscaling describe-auto-scaling-instances
aws autoscaling describe-auto-scaling-instances --instance-ids [instance-id-1 instance-id-2 ...]

从组中分离实例
aws autoscaling detach-instances --auto-scaling-group-name myasgroup --instance-ids instanceid1 instanceid2 [--should-decrement-desired-capacity|--no-should-decrement-desired-capacity]

附加实例到组
aws autoscaling attach-instances --auto-scaling-group-name myasgroup --instance-ids instanceid1 instanceid2

挂起AS流程
aws autoscaling suspend-process --auto-scaling-group-name myasgroup --scaling-processes AZRebalance|AlarmNotification|...

删除AS组
aws autoscaling delete-auto-scaling-group --auto-scaling-group-name myasgroup

kinesis(未测试)

创建流
aws kinesis create-stream –stream-name mystream –shard-count

列出流
aws kinesis list-streams

获取指定流的分片迭代器
aws kinesis get-shard-iterator –stream-name mystream –shard-id shard-1 –shard-iterator-type TRIM_HORIZON

发送数据到流
aws kinesis put-record –stream-name mystream –partition-key mykey –data test

获取流数据
aws kinesis get-records –shard-iterator myiterator

MAC 上安装 aws cli 工具
2019/07/16 Chenxin

mac 安装 aws cli以及 修改系统默认python版本,指定aws路径(python pip安装程序的默认路径)
https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/install-macos.html

详细安装步骤(参考aws文档) 在 macOS 上安装 AWS CLI

  1. 从 Python.org 的下载页面下载并安装最新版本的 Python。

  2. 下载并运行 Python 打包权威机构提供的 pip3 安装脚本。
    curl -O https://bootstrap.pypa.io/get-pip.py
    python3 get-pip.py --user

  3. 使用新安装的 pip3 安装 AWS CLI。如果您使用的是 Python 3+ 版本,我们建议您使用 pip3 命令。
    pip3 install awscli --upgrade --user

  4. 验证 AWS CLI 是否已正确安装。(找不到aws命令的话,可能需要修改PATH变量,见下一部分)
    $ aws --version
    AWS CLI 1.16.116 (Python 3.6.8)
    如果未找到该程序,请将它添加到命令行路径。

要升级到最新版本,请重新运行安装命令。
$ pip3 install awscli --upgrade --user

将 AWS CLI 可执行文件添加到命令行路径
在使用 pip 进行安装后,需要将 aws 程序添加到操作系统的 PATH 环境变量中。
程序的位置取决于 Python 的安装位置。

使用pip3安装的aws二进制文件在 PATH=/Users/chanix/Library/Python/3.6/bin:$PATH
而python3的程序在/Library/Frameworks/Python.framework/Versions/3.6/bin/python3 (注意,这里需要创建一个默认的python符号链接指向python3: ln -s pyton3.7 python )
系统自带的python2的程序在/usr/bin/python.

aws命令文件,类似以下
chanix@Chanix-Mac Python$ pwd
/Users/chanix/Library/Python
chanix@Chanix-Mac Python$ du -sh *
67M 3.6
68M 3.7
chanix@Chanix-Mac Python$ ls 3.7/bin/
pycache aws aws_zsh_completer.sh pyrsa-decrypt ...

以上需要在环境变量里配置
PATH="/Library/Frameworks/Python.framework/Versions/3.6/bin:${PATH}" # python在这里
/usr/local/bin/python3 # python3也在这里,且3.6,3.7都在这里.python3指向最新的python版本. /usr/local/bin下的所有文件夹,都是符号链接指向类似 /Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6m 这些文件的.
export PATH=~/Library/Python/3.6/bin:$PATH # aws 命令在这里

另外,重新打开pycharm的话,会将新的python3.7更新到pycharm里,以便在pycharm里能够需要对应的解析器版本(3.7版本).
虚拟环境里的不会变.

posted @ 2020-04-20 17:14  ChanixChen  阅读(6020)  评论(0编辑  收藏  举报