Memo/AmazonWebServices/awscli

https://dexlab.net:443/pukiwiki/index.php?Memo/AmazonWebServices/awscli
 

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

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

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

aws sts get-caller-identity --profile default

{
    "Account": "1234567890",
    "UserId": "AIDXXXXXX",
    "Arn": "arn:aws:iam::1234567890:user/username"
}

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

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

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

リザーブドインスタンスの価格一覧取得

  • 何もオプションを付けないと大量のリスト取得のため、30秒以上レスポンスが返ってこない。
  • EC2で m3.large インスタンス のリスト取得
    aws ec2 describe-reserved-instances-offerings \
      --profile default \ # AWS profile
      --region ap-northeast-1 \ # 東京リージョン
      --instance-tenancy default \ # デフォルトか、ハードウェア専用か
      --offering-type "Partial Upfront" \ # 一部前払い(以前の重度利用)
      --offering-class standard \ 3年の場合はConvertibleも選べる
      --max-duration 31536000 \ # 1年
      --filters "Name=product-description,Values=Linux/UNIX,Linux/UNIX (Amazon VPC)" "Name=scope,Values=Region" \ # Linuxのみ
      --instance-type m3.large \
      --output json
    
    {
        "ReservedInstancesOfferings": [
            {
                "OfferingClass": "standard",
                "OfferingType": "Partial Upfront",
                "ProductDescription": "Linux/UNIX",
                "InstanceTenancy": "default",
                "PricingDetails": [],
                "UsagePrice": 0.0,
                "RecurringCharges": [
                    {
                        "Amount": 0.058000000000000003,
                        "Frequency": "Hourly"
                    }
                ],
                "Marketplace": false,
                "CurrencyCode": "USD",
                "FixedPrice": 463.0,
                "Duration": 31536000,
                "Scope": "Region",
                "ReservedInstancesOfferingId": "7875a3da-c41e-40bc-8f81-7e155f5bab77",
                "InstanceType": "m3.large"
            },
            {
                "OfferingClass": "standard",
                "OfferingType": "Partial Upfront",
                "ProductDescription": "Linux/UNIX (Amazon VPC)",
                "InstanceTenancy": "default",
                "PricingDetails": [],
                "UsagePrice": 0.0,
                "RecurringCharges": [
                    {
                        "Amount": 0.058000000000000003,
                        "Frequency": "Hourly"
                    }
                ],
                "Marketplace": false,
                "CurrencyCode": "USD",
                "FixedPrice": 463.0,
                "Duration": 31536000,
                "Scope": "Region",
                "ReservedInstancesOfferingId": "fbc08497-fd12-4bb0-a03b-5e0955899527",
                "InstanceType": "m3.large"
            }
        ]
    }

CloudFront?

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

SES

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

CloudWatch?

  • 例:RDSのCloudWatch?メトリクスを設定し、閾値を超えたらメールを送る
  1. AWS SNSトピックを作成
    AWS_PROFILE=default
    AWS_REGION=ap-northeast-1
    RDS_ID=db01
    EMAIL=alerts@example.com
    
    aws --profile $AWS_PROFILE --region $AWS_REGION \
      sns create-topic --name "AlertToMyemail"
    {
        "TopicArn": "arn:aws:sns:ap-northeast-1:1234567890:AlertToMyemail"
    }
    
    TopicArn="arn:aws:sns:ap-northeast-1:1234567890:AlertToMyemail"
    
    aws --profile $AWS_PROFILE --region $AWS_REGION \
      sns subscribe --topic-arn $TopicArn \
      --protocol email \
      --notification-endpoint $EMAIL
  2. 確認メールが届くので "Confirm subscription" をクリック
  3. AWS SNS 設定確認
    aws --profile $AWS_PROFILE --region $AWS_REGION \
      sns list-subscriptions-by-topic --topic-arn $TopicArn
  4. RDS:CPUUtilization >= 80% のメトリクスを作成
    aws --profile $AWS_PROFILE --region $AWS_REGION \
     cloudwatch put-metric-alarm \
     --alarm-name awsrds-${RDS_ID}-High-CPU-Utilization \
     --alarm-description "Alarm when CPU exceeds 80%" \
     --metric-name CPUUtilization \
     --namespace AWS/RDS \
     --statistic Average \
     --period 300 \
     --threshold 80 \
     --unit Percent \
     --comparison-operator GreaterThanOrEqualToThreshold \
     --dimensions  Name=DBInstanceIdentifier,Value=$RDS_ID  \
     --evaluation-periods 1 \
     --alarm-actions $TopicArn
  5. RDS:FreeStorageSpace? <= 5GB のメトリクスを作成(--threshold 5 --unit Gigabyte の設定は無効。Management Console上では0と表示される)
    aws --profile $AWS_PROFILE --region $AWS_REGION \
     cloudwatch put-metric-alarm \
     --alarm-name awsrds-${RDS_ID}-High-Free-Storage-Space \
     --alarm-description "Alarm when Free-Storage-Space less than 5GB" \
     --metric-name FreeStorageSpace \
     --namespace AWS/RDS \
     --statistic Average \
     --period 300 \
     --threshold 5242880000.0 \
     --comparison-operator LessThanOrEqualToThreshold \
     --dimensions  Name=DBInstanceIdentifier,Value=$RDS_ID  \
     --evaluation-periods 1 \
     --alarm-actions $TopicArn
  6. 作成したメトリクスを確認
    aws --profile $AWS_PROFILE --region $AWS_REGION \
      cloudwatch describe-alarms --alarm-names awsrds-${RDS_ID}-High-CPU-Utilization awsrds-${RDS_ID}-High-Free-Storage-Space

EMR

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

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

  • 全リージョンのEC2, RDS, ElastiCache?イベントをjsonとして出力
    AWS_PROFILE=default
    for region in $(aws --profile $AWS_PROFILE ec2 describe-regions --query "Regions[].[RegionName]" --output text); do \
    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 ; \
    aws --profile $AWS_PROFILE --region $region rds describe-events > $AWS_PROFILE.$region.rds.events.json ; \
    aws --profile $AWS_PROFILE --region $region elasticache describe-events > $AWS_PROFILE.$region.elasticache.events.json ; \
    done
  • EC2のCompleted以外のイベントを表示。除外したい文字列の場合「==false」または「|not」が使える。
    cat *.ec2.events.json | jq '.[]|select(.Events[].Description|contains("Completed")==false)'
  • RDSのイベントを表示
    cat *.rds.events.json
  • ElastiCache?のイベントを表示
    cat *.elasticache.events.json

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

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

タグ付け

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

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

SSL証明書を管理

今ではACMを使った方が良い。

  • IAMにアップロードされているSSL証明書の一覧
    aws iam list-server-certificates
    
    {
        "ServerCertificateMetadataList": [
            {
                "Path": "/", 
                "Arn": "arn:aws:iam::000000000000:server-certificate/example.com", 
                "ServerCertificateId": "XXXXXXXXXXXXXXXXXXXXX", 
                "ServerCertificateName": "example.com", 
                "UploadDate": "2014-01-02T03:40:50Z"
            }
        ]
    }
  • ELBのリスナーで使用されているSSL証明書の一覧
    aws elb describe-load-balancers \
     --query "LoadBalancerDescriptions[].[LoadBalancerName,ListenerDescriptions[].Listener[].SSLCertificateId]" \
     --region us-east-1
    
    [
        [
            "example.com",
            [
                "arn:aws:iam::000000000000:server-certificate/example.com"
            ]
        ]
    ]
  • IAMにSSL証明書をアップロード。名前は「ドメイン.期限」としておけば分かりやすい。ホームディレクトリにファイルがある場合は file://~/file.key 。ARNをメモしておく
    aws iam upload-server-certificate \
      --server-certificate-name example.com.20170101 \
      --certificate-body file://example.com.20170101.crt \
      --private-key file://example.com.20170101.key.nopass \
      --certificate-chain file://certificate_chain_file.crt
  • ELBにHTTPSリスナーを追加する場合
    ARN="arn:aws:iam::012345678901:server-certificate/production/newCert"
    aws --region ap-northeast-1 \
     elb create-load-balancer-listeners \
     --load-balancer-name elb01 \
     --listeners Protocol=HTTPS,LoadBalancerPort=443,InstanceProtocol=HTTP,InstancePort=80,SSLCertificateId=$ARN
  • ELBのSSL証明書を更新する場合
    ARN="arn:aws:iam::012345678901:server-certificate/production/newCert"
    aws --region ap-northeast-1 \
     elb set-load-balancer-listener-ssl-certificate \
     --load-balancer-name elb01 \
     --load-balancer-port 443 \
     --ssl-certificate-id $ARN
  • IAMからSSL証明書を削除する場合。ELBで使用中でも削除できるので注意
    aws iam delete-server-certificate \
      --server-certificate-name example.com

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をいれないと値が取れない
    # CentOS 6.3
    
    # ec2 cli (java 1.6.0_24)
    bash ec2cli_vs_awscli.sh i-xxxxxxxx ec2 5
    ...
    Elapsed time: 30.725 sec.
    
    # aws cli (python 2.6.6)
    bash ec2cli_vs_awscli.sh i-xxxxxxxx aws 5
    ...
    Elapsed time: 26.984 sec.

--query : 出力項目指定

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

Route53を使う

  • ドメイン名から、該当するレコード一覧(A, CNAMEのみ)を取得
    AWS_PROFILE=default
    DNS_NAME=example.com
    HOSTED_ZONE_ID=$(aws --profile $AWS_PROFILE route53 list-hosted-zones-by-name --max-items 1 --query "HostedZones[?Name == '${DNS_NAME}.'].[Id]" --output text)
    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名を指定して生成
    aws --profile test-user configure
  • /.aws/config

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

legacy

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

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

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

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

タグ付け

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

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-09-15 (土) 07:31:37 (9d)