Memo/AmazonWebServices/awscli

http://dexlab.net/pukiwiki/index.php?Memo%2FAmazonWebServices%2Fawscli
 

awscli : AWS公式 CUIクライアント

  • AWS コマンドラインインターフェイス | アマゾン ウェブ サービス(AWS 日本語) Amazon製
    • Python 2.6.3 or later
    • CentOS6.x にインストール
      1. yum install python python-setuptools
      2. easy_install pip
      3. pip install awscli
      4.  
      5. aws --profile default configure
      6. AWS Access Key ID [None]: ****
      7. AWS Secret Access Key [None]: ****
      8. Default region name [None]: us-east-1
      9. Default output format [None]: json, table, text から一つ選択
      10.  
      11. # ヘルプ
      12. aws help
    • CentOS5.x
      1. yum install python26 python26-setuptools
      2. easy_install-2.6 pip
      3. pip2.6 install awscli

AWSアカウントIDとARNの確認

  1. aws sts get-caller-identity --profile default
  2.  
  3. {
  4.     "Account": "1234567890",
  5.     "UserId": "AIDXXXXXX",
  6.     "Arn": "arn:aws:iam::1234567890:user/username"
  7. }

~/.aws/config から ~/.aws/credentials を生成する

  • /.aws/config にクレデンシャル等もまとめてある状態から ~/.aws/credentials を生成したい場合

    1. cp ~/.aws/config ~/.aws/credentials
    2. perl -p -i -e "s/profile\s+|^output.+[\r\n]|^region.+[\r\n]|^signature_version.+[\r\n]//g" ~/.aws/credentials

CloudFront?

  • aws cli ではpreview版なので有効化
    1. aws configure set preview.cloudfront true
    2. # または
    3. echo -e "[preview]\ncloudfront = true" >> ~/.aws/config

SES

  • EMAILアドレスの検証。サンドボックスでのメール送信前にFROMとTOアドレスをこれで登録する必要がある。
    1. grep -v -P '^\s*$' ses-verify-email.txt | xargs -i aws --profile <AWS PROFILE> --region <AWS REGION> ses verify-email-identity --email-address {}

EMR

  • 稼働中のEMRクラスタの一覧
    1. aws --region ap-northeast-1 list-clusters --active
  • EMRクラスタの強制終了
    1. aws --region ap-northeast-1 emr terminate-clusters --cluster-ids j-xxxxxxxx

スケジュールイベントの取得

  • 全リージョンのEC2, RDS, ElastiCache?イベントをjsonとして出力
    1. AWS_PROFILE=default
    2. for region in $(aws --profile $AWS_PROFILE ec2 describe-regions --query "Regions[].[RegionName]" --output text); do \
    3. aws --profile $AWS_PROFILE --region $region ec2 describe-instance-status --filters "Name=event.code,Values=*" --query "InstanceStatuses[].{InstanceId:InstanceId, Events:Events}" --output json > $AWS_PROFILE.$region.ec2.events.json ; \
    4. aws --profile $AWS_PROFILE --region $region rds describe-events > $AWS_PROFILE.$region.rds.events.json ; \
    5. aws --profile $AWS_PROFILE --region $region elasticache describe-events > $AWS_PROFILE.$region.elasticache.events.json ; \
    6. done
  • EC2のCompleted以外のイベントを表示。除外したい文字列の場合「==false」または「|not」が使える。
    1. cat *.ec2.events.json | jq '.[]|select(.Events[].Description|contains("Completed")==false)'
  • RDSのイベントを表示
    1. cat *.rds.events.json
  • ElastiCache?のイベントを表示
    1. cat *.elasticache.events.json

EC2のスケジュールイベントをtsv形式で出力

  • 全リージョンのEC2イベントをtsv形式でファイルに出力
  • InstanceIDからInstane Tag:Nameの取得も行う
    1. AWS_PROFILE=default
    2. for region in $(aws --profile $AWS_PROFILE ec2 describe-regions --query "Regions[].[RegionName]" --output text); do \
    3. export region AWS_PROFILE; \
    4. aws ec2 describe-instance-status \
    5.   --region $region \
    6.   --profile $AWS_PROFILE \
    7.   --filters "Name=event.code,Values=*" --query 'sort_by(InstanceStatuses[].[InstanceId,Events[0].Code,Events[0].NotBefore,Events[0].NotAfter],&[2])' --output text \
    8.   | xargs -I{} bash -c 'line="{}"; \
    9.   id=$(echo $line|cut -d" " -f1); \
    10.   name=$(aws ec2 describe-instances --region $region --profile $AWS_PROFILE --instance-ids $id --query "Reservations[].Instances[].[Tags[?Key==\`Name\`].Value|[0]]" --output text); \
    11. echo -e "$AWS_PROFILE\t$region\t$name\t$line\t"' | sort > $AWS_PROFILE.$region.ec2.events.tsv ; \
    12. done
  • サイズが0byteのtsvを削除
    1. find . -type f -name '*.tsv' -size 0c -delete

タグ付け

リソース指定方法や、タグの書式が違う。

  • aws-cli/1.3.2
  • EC2
    1. aws --profile test-user ec2 create-tags \
    2.  --region us-east-1 \
    3.  --resources i-xxxxxx01 i-xxxxxx02 \
    4.  --tags Key=MY-KEY,Value=MY-VALUE
  • RDS
    1. aws --profile test-user rds add-tags-to-resource \
    2.  --region us-east-1 \
    3.  --resource-name arn:aws:rds:us-east-1:1234567890:db:MY-RDS-01 \
    4.  --tags Key=MY-KEY,Value=MY-VALUE
  • S3
    1. aws --profile test-user s3api put-bucket-tagging \
    2.  --region us-east-1 \
    3.  --bucket mybucket \
    4.  --tagging '
    5. {
    6.   "TagSet": [
    7.     {
    8.       "Key": "MY-KEY",
    9.       "Value": "MY-VALUE"
    10.     }
    11.   ]
    12. }'

ec2 cliとaws cliの速度比較

  • ec2 cliはjavaベースなので毎回JVMを起動する分遅いと思われる
  • aws cliはpythonベース
  • サンプルスクリプト
    • File not found: "ec2cli_vs_awscli.sh" at page "Memo/AmazonWebServices/awscli"[添付]
  • ec2 cliとaws cliを5回ずつ呼んだ結果。毎回5秒のwait。7回以上は Web Service Call Limits にひっかかり、ある程度waitをいれないと値が取れない
    1. # CentOS 6.3
    2.  
    3. # ec2 cli (java 1.6.0_24)
    4. bash ec2cli_vs_awscli.sh i-xxxxxxxx ec2 5
    5. ...
    6. Elapsed time: 30.725 sec.
    7.  
    8. # aws cli (python 2.6.6)
    9. bash ec2cli_vs_awscli.sh i-xxxxxxxx aws 5
    10. ...
    11. Elapsed time: 26.984 sec.

条件を指定してテキスト形式でのリストを取得

  • TCPのIPリストを取得
    1. aws ec2 describe-security-groups --group-id sg-123456 \
    2.   --query 'SecurityGroups[].IpPermissions[?contains(IpProtocol, `tcp`)].IpRanges' \
    3.   --output text

--query : 出力項目指定

  • filtersで検索対象を指定し、--queryで出力項目を指定する
  • [*] は [] に省略できる
  • 配列を平分に変換
  • 配列内の値を出力。「|[0]」を使う。
    1. # 通常
    2. aws rds describe-reserved-db-instances-offerings \
    3.   --region ap-northeast-1 \
    4.   --duration 1 \
    5.   --max-items 1 \
    6.   --query 'ReservedDBInstancesOfferings[].[DBInstanceClass,RecurringCharges]'
    7.  
    8. [
    9.     [
    10.         "db.t1.micro",
    11.         [
    12.             {
    13.                 "RecurringChargeAmount": 0.023,
    14.                 "RecurringChargeFrequency": "Hourly"
    15.             }
    16.         ]
    17.     ]
    18. ]
    19.  
    20. # "|[0]" 指定
    21. aws rds describe-reserved-db-instances-offerings \
    22.   --region ap-northeast-1 \
    23.   --duration 1 \
    24.   --max-items 1 \
    25.   --query 'ReservedDBInstancesOfferings[].[DBInstanceClass,RecurringCharges[].RecurringChargeAmount|[0]]'
    26.  
    27. [
    28.     [
    29.         "db.t1.micro",
    30.         0.023
    31.     ]
    32. ]
  • EC2からTag Name : my-host-01 のインスタンスIDを取得する
    1. aws ec2 describe-instances --filters "Name=tag-key,Values=Name" \
    2.   "Name=tag-value,Values=my-host-01" \
    3.   --query "Reservations[*].Instances[*].InstanceId" \
    4.   --output table
    5.  
    6. -------------------
    7. |DescribeInstances|
    8. +-----------------+
    9. |  i-xxxxxxxx     |
    10. +-----------------+
  • {...}でjson出力時のkeyの別名(alias)を指定できる。別名を使うときは出力する全てのキーに別名を付ける
    • 例:VolumeId?にIDという別名を付ける
      1. aws ec2 describe-volumes --query 'Volumes[*].{ID:VolumeId,AZ:AvailabilityZone,Size:Size}'
      2.  
      3. [
      4.     {
      5.         "AZ": "ap-northeast-1a",
      6.         "ID": "vol-xxxxxxxx",
      7.         "Size": 8
      8.     },
      9.     {
      10.         "AZ": "ap-northeast-1b",
      11.         "ID": "vol-xxxxxxxx",
      12.         "Size": 8
      13.     }
      14. ]
  • 複数の項目を指定して列挙する
    • 親階層の列挙時に、子階層のアイテムは参照できる。
    • 子階層の列挙時に、親階層のアイテムは参照できない。
    • 例:ELBを列挙して、DNSNameとInstanceId?を表示
      1. aws elb describe-load-balancers \
      2.   --query "LoadBalancerDescriptions[].[DNSName,Instances[].InstanceId]"
      3.  
      4. [
      5.     [
      6.         "example1-0000000000.ap-northeast-1.elb.amazonaws.com",
      7.         [
      8.             "i-xxxxxxxx",
      9.             "i-xxxxxxxx"
      10.         ]
      11.     ],
      12.     [
      13.         "example2-0000000000.ap-northeast-1.elb.amazonaws.com",
      14.         [
      15.             "i-xxxxxxxx"
      16.         ]
      17.     ]
      18. ]
      • 子階層の列挙時に、親階層のアイテム参照は値が取れずnullになる
        1. aws elb describe-load-balancers \
        2.   --query "LoadBalancerDescriptions[].Instances[].[LoadBalancerDescriptions[].DNSName,InstanceId]"
        3.  
        4. [
        5.     [
        6.         null,
        7.         "i-xxxxxxxx"
        8.     ],
        9.     [
        10.         null,
        11.         "i-xxxxxxxx"
        12.     ]
        13. ]
  • ELBでSSLCertificateId?を列挙。(SSL証明書更新時に、どのELBがSSL Listener持っているのかを調べる時など)
    1. aws elb describe-load-balancers \
    2.  --query "LoadBalancerDescriptions[].[LoadBalancerName,ListenerDescriptions[].Listener[].SSLCertificateId]"
    3.  
    4. [
    5.     [
    6.         "example1",
    7.         [
    8.             "arn:aws:iam::000000000000:server-certificate/example.com"
    9.         ]
    10.     ] 
    11. ]
  • 配列をフラット(elb name,ssl cert)に出力
    1.  --query "LoadBalancerDescriptions[].{C010:LoadBalancerName,C020:ListenerDescriptions[].Listener[].SSLCertificateId | [0]}" \

Route53を使う

  • ドメイン名から、該当するレコード一覧(A, CNAMEのみ)を取得
    1. AWS_PROFILE=default
    2. DNS_NAME=example.com
    3. HOSTED_ZONE_ID=$(aws --profile $AWS_PROFILE route53 list-hosted-zones-by-name --max-items 1 --query "HostedZones[?Name == '${DNS_NAME}.'].[Id]" --output text)
    4. aws --profile $AWS_PROFILE route53 list-resource-record-sets --hosted-zone-id $HOSTED_ZONE_ID  --query "ResourceRecordSets[?Type == 'CNAME' || Type == 'A'].[Name]" --output text
    • 「--dns-name」オプションは一致しなくとも、何かしらの値を返すので使えなかった

複数のプロファイルを使い分ける

  • profile名を指定して生成
    1. aws --profile test-user configure
  • /.aws/config

    1. [default]
    2. aws_access_key_id=AKIAIOSFODNN7EXAMPLE
    3. aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
    4. region=us-east-1
    5.  
    6. [profile test-user]
    7. aws_access_key_id=AKIAI44QH8DHBEXAMPLE
    8. aws_secret_access_key=je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY
    9. region=us-west-2
  • 実行
    1. aws --profile test-user s3 ls s3://mybucket
  • 環境変数を指定する方法
    1. export AWS_CONFIG_FILE=~/.aws/config
    2. export AWS_DEFAULT_REGION=us-west-2
    3. export AWS_ACCESS_KEY_ID=AKIAI44QH8DHBEXAMPLE
    4. export AWS_SECRET_ACCESS_KEY=je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY
    5. export AWS_DEFAULT_OUTPUT=text

legacy

javaだったりruby製だったりした。

keypairのフィンガープリント確認

AWS ManagementConsole?のkeypairとローカルファイル(pem)を比較する場合

  1. ec2-fingerprint-key kaypair.pem
  2. # or
  3. openssl pkcs8 -in kaypair.pem -nocrypt -topk8 -outform DER | openssl sha1 -c

タグ付け

  • インスタンス、AMI、EBS等にタグを設定できる。「i-xxxxxxxx vol-xxxxxxxx」等複数同時に設定できる
  • インスタンスにNameタグを付けるとManagementConsole?で名前に表示できる
    1. ec2-create-tags i-xxxxxxxx --tag "Name=host1.example.com"
  • EBSでもNameタグを付けるとManagementConsole?で名前に表示できる
    1. ec2-create-tags vol-xxxxxxxx --tag "Name=host1.example.com"

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-04-02 (月) 18:10:01 (24d)