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/

404 - Not Found #目前查詢為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版本).
虛擬環境里的不會變.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM