Memo/AmazonWebServices/awscli/EC2

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

EC2


特定のタグを持つインスタンスを一括処理

  • EC2で「state=running」、「Nameタグ」に「web*」と一致するインスタンスを一括停止
    1. AWS_PROFILE=default
    2. AWS_REGION=ap-northeast-1
    3. AWS_EC2_ID=$(aws --profile $AWS_PROFILE \
    4.   --region $AWS_REGION \
    5.   ec2 describe-instances \
    6.   --filters "Name=instance-state-name,Values=running" "Name=tag-key,Values=Name" "Name=tag-value,Values=web*" \
    7.   --query 'Reservations[].Instances[].InstanceId' \
    8.   --output text)
    9.  
    10. aws ec2 stop-instances --instance-ids $AWS_EC2_ID --profile $AWS_PROFILE --region $AWS_REGION

EBSの容量/タイプをオンラインで変更する

  • 例: gp2のvolume(root volumeではない)を30GBから60GBへ変更。ext4のボリュームはマウントしたまま止まらずに変更できた。
    1. aws ec2 modify-volume  --volume-id vol-xxxx --size 60 --profile default --region ap-northeast-1
    • 変更中のステータス確認
      1. aws ec2 describe-volumes-modifications --volume-ids vol-xxxx --profile default --region ap-northeast-1
      2. {
      3.     "VolumesModifications": [
      4.         {
      5.             "TargetSize": 60,
      6.             "TargetVolumeType": "gp2",
      7.             "ModificationState": "optimizing",
      8.             "VolumeId": "vol-xxxx",
      9.             "TargetIops": 180,
      10.             "StartTime": "2017-07-27T01:00:00.000Z",
      11.             "Progress": 65,
      12.             "OriginalVolumeType": "gp2",
      13.             "OriginalIops": 100,
      14.             "OriginalSize": 30
      15.         },
      16. ...
    • 数回行ったが、完了まで15〜30分程度とばらつきがある。
    • そのままではOSから増加分が認識されないので、resize2fsを実行する。これは十数秒で完了した。ただし、CPU loadが高い時に実行すると1時間まっても終わらないので注意。
      1. # root volumeでubuntu 14.04 LTSの場合
      2. # パーティションが1つでもあるとresize2fsだけでは拡張できない事があるのでgrowpartを使う
      3. sudo growpart /dev/xvda 1
      4. sudo resize2fs /dev/xvda1
      5.  
      6. # パーティションが無ければresize2fsだけで拡張できた
      7. sudo resize2fs /dev/xvdf
    • resize2fsはext4の場合、マウントしたままで可能と記載がある。6.3. ext4 ファイルシステムのサイズを変更する

EBSの追加と動的拡張

  • EBSの追加
    1. AWS_PROFILE=default
    2. aws --profile $AWS_PROFILE --region ap-northeast-1 ec2 create-volume --size 10 --volume-type gp2 --availability-zone ap-northeast-1b
    3. # vol-xxxx
    4. aws --profile $AWS_PROFILE --region ap-northeast-1 ec2 attach-volume --device /dev/sdf --volume-id vol-xxxx --instance-id i-xxxx
    • ホスト上の作業
      1. sudo mkdir /mnt/ebs0
      2. sudo mkfs.ext4 /dev/xvdf
      3. sudo mount /dev/xvdf /mnt/ebs0
      4. # /etc/fstab に追加
      5. sudo vim /etc/fstab
      6. --
      7. /dev/xvdf /ext/ebs0 ext4 defaults,nofail 0 0
      8. --

購入済みリザーブドインスタンスの一覧

  • EC2 RIで有効期限内だけをtsvで出力
    1. AWS_PROFILE=default
    2. AWS_REGION=ap-northeast-1
    3. aws ec2 describe-reserved-instances \
    4.   --profile $AWS_PROFILE \
    5.   --region $AWS_REGION \
    6.   --query 'ReservedInstances[].{C010:ReservedInstancesId,C020:State,C030_Start:Start,C040_End:End,C050:InstanceType,C060:InstanceCount,C070:OfferingType,C080:Duration,C090:FixedPrice,C100:UsagePrice,C110:ProductDescription,C120:OfferingClass}' \
    7.   --filters 'Name=state,Values=active' \
    8.   --output text

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

  • 何もオプションを付けないと大量のリスト取得のため、30秒以上レスポンスが返ってこない。
  • EC2で m3.large インスタンス のリスト取得
    1. aws ec2 describe-reserved-instances-offerings \
    2.   --profile default \ # AWS profile
    3.   --region ap-northeast-1 \ # 東京リージョン
    4.   --instance-tenancy default \ # デフォルトか、ハードウェア専用か
    5.   --offering-type "Partial Upfront" \ # 一部前払い(以前の重度利用)
    6.   --offering-class standard \ 3年の場合はConvertibleも選べる
    7.   --max-duration 31536000 \ # 1年
    8.   --filters "Name=product-description,Values=Linux/UNIX,Linux/UNIX (Amazon VPC)" "Name=scope,Values=Region" \ # Linuxのみ
    9.   --instance-type m3.large \
    10.   --output json
    11.  
    12. {
    13.     "ReservedInstancesOfferings": [
    14.         {
    15.             "OfferingClass": "standard",
    16.             "OfferingType": "Partial Upfront",
    17.             "ProductDescription": "Linux/UNIX",
    18.             "InstanceTenancy": "default",
    19.             "PricingDetails": [],
    20.             "UsagePrice": 0.0,
    21.             "RecurringCharges": [
    22.                 {
    23.                     "Amount": 0.058000000000000003,
    24.                     "Frequency": "Hourly"
    25.                 }
    26.             ],
    27.             "Marketplace": false,
    28.             "CurrencyCode": "USD",
    29.             "FixedPrice": 463.0,
    30.             "Duration": 31536000,
    31.             "Scope": "Region",
    32.             "ReservedInstancesOfferingId": "7875a3da-c41e-40bc-8f81-7e155f5bab77",
    33.             "InstanceType": "m3.large"
    34.         },
    35.         {
    36.             "OfferingClass": "standard",
    37.             "OfferingType": "Partial Upfront",
    38.             "ProductDescription": "Linux/UNIX (Amazon VPC)",
    39.             "InstanceTenancy": "default",
    40.             "PricingDetails": [],
    41.             "UsagePrice": 0.0,
    42.             "RecurringCharges": [
    43.                 {
    44.                     "Amount": 0.058000000000000003,
    45.                     "Frequency": "Hourly"
    46.                 }
    47.             ],
    48.             "Marketplace": false,
    49.             "CurrencyCode": "USD",
    50.             "FixedPrice": 463.0,
    51.             "Duration": 31536000,
    52.             "Scope": "Region",
    53.             "ReservedInstancesOfferingId": "fbc08497-fd12-4bb0-a03b-5e0955899527",
    54.             "InstanceType": "m3.large"
    55.         }
    56.     ]
    57. }

Private DNSからEC2インスタンスを検索する

  1. aws --profile default --region ap-northeast-1 ec2 describe-instances \
  2. --filters 'Name=private-dns-name,Values=ip-01-02-03-04.ap-northeast-1.compute.internal' \
  3. --query "Reservations[].Instances[].{InstanceId:InstanceId,Tags:Tags[],PublicDnsName:PublicDnsName,State:State.Name}"                                                                                                                                                     
  4.  
  5. [
  6.     {
  7.         "InstanceId": "i-123456",
  8.         "State": "running",
  9.         "PublicDnsName": "ec2-01-02-03-04.ap-northeast-1.compute.amazonaws.com",
  10.         "Tags": [
  11.             {
  12.                 "Value": "web01",
  13.                 "Key": "Name"
  14.             }
  15.         ]
  16.     }
  17. ]

classic link: EC2 classicとVPCを接続する

  • aws ec2 attach-classic-link-vpc
    • EC2 classicとVPC内のリソースを接続する
    • EC2 classicには一つのVPC IDだけ設定できる
    • EC2 classicからVPC内のリソースへのアクセスには、private dns/ipを使う。public dns/ipでは接続できなかった
    • Route53のpublic/private自動変換機能は動作しない
  1. AWS_PROFILE=default
  2. AWS_REGION=ap-northeast-1
  3. AWS_VPC_ID=vpc-xxxx
  4. AWS_VPC_SG="sg-xxxx"
  5. AWS_EC2_ID="i-xxxx01 i-xxxx02"
  6.  
  7. aws --profile $AWS_PROFILE --region $AWS_REGION ec2 enable-vpc-classic-link --vpc-id $AWS_VPC_ID
  8.  
  9. for id in $AWS_EC2_ID; do \
  10.   echo "---- $id: ";aws --profile $AWS_PROFILE --region $AWS_REGION ec2 attach-classic-link-vpc --instance-id $id --vpc-id $AWS_VPC_ID --groups $AWS_VPC_SG
  11. done
  • EC2の中から、タグが「Name=web01, web02, ...」、動作中を探して、instance-idを返す
    1. AWS_EC2_ID=$(aws --profile $AWS_PROFILE \
    2.   --region $AWS_REGION \
    3.   ec2 describe-instances \
    4.   --filters "Name=instance-state-name,Values=running" "Name=tag-key,Values=Name" "Name=tag-value,Values=web*" \
    5.   --query 'Reservations[].Instances[].InstanceId' \
    6.   --output text)

インスタンスIDから、インスタンス名の検索

  1. aws ec2 describe-instances \
  2.   --region ap-northeast-1 \
  3.   --instance-ids i-12345678 i-90123456 \
  4.   --query "Reservations[].Instances[].{InstanceId:InstanceId,Tags:Tags[],PublicDnsName:PublicDnsName,State:State.Name}"
  5.  
  6. [
  7.     {
  8.         "InstanceId": "i-12345678",
  9.         "State": "running",
  10.         "PublicDnsName": "ec2-12-34-56-78.ap-northeast-1.compute.amazonaws.com",
  11.         "Tags": [
  12.             {
  13.                 "Value": "host01",
  14.                 "Key": "Name"
  15.             },
  16.         ]
  17.     },
  18.     {
  19.      ...
  20.     }
  21. ]

EC2 Security Group

  • 全リージョンのセキュリティグループの取得
    1. AWS_PROFILE=test-user
    2. for region in $(aws --profile $AWS_PROFILE ec2 describe-regions --query "Regions[].[RegionName]" --output text); do \
    3. echo "---- $region"; aws --profile $AWS_PROFILE --region $region ec2 describe-security-groups --query 'SecurityGroups[].{GroupName:GroupName, IpRanges:IpPermissions[].IpRanges[]}' > $AWS_PROFILE.$region.ec2.security-groups.json; \
    4. aws --profile $AWS_PROFILE --region $region  rds describe-db-security-groups --query 'DBSecurityGroups[].{GroupName:DBSecurityGroupName, IpRanges:IPRanges[]}' > $AWS_PROFILE.$region.rds.security-groups.json; \
    5. done
    • 特定のIPアドレスを含む結果をフィルタリング(jqがキーの大文字、小文字を区別するので、一つのフィルタに出来なかった点がイマイチ)
      1. SECURITY_GROUPS_FILTER='"0.0.0.0/32","1.2.3.4/32"'
      2.  
      3. for file in $(ls $AWS_PROFILE.*.ec2.security-groups.json); do \
      4. echo "---- $file"; cat $file | jq -r ".[]|select(.IpRanges[].CidrIp|contains($SECURITY_GROUPS_FILTER))"; \
      5. done > filtered.$AWS_PROFILE.ec2.security-groups.json
      6.  
      7. for file in $(ls $AWS_PROFILE.*.rds.security-groups.json); do \
      8. echo "---- $file"; cat $file | jq -r ".[]|select(.IpRanges[].CIDRIP|contains($SECURITY_GROUPS_FILTER))"; \
      9. done > filtered.$AWS_PROFILE.rds.security-groups.json
  • MySecurityGroup?GatewaySecurityGroup? からsshで接続できるように設定
    1. aws --profile test-user ec2 authorize-security-group-ingress \
    2.   --group-name MySecurityGroup \
    3.   --protocol tcp \
    4.   --port 22 \
    5.   --source-group GatewaySecurityGroup
  • ELBからのTCPを許可
    1. aws --profile test-user ec2 authorize-security-group-ingress \
    2.   --group-name MySecurityGroup \
    3.   --protocol tcp \
    4.   --port 0-65535 \
    5.   --group-owner amazon-elb \
    6.   --source-group amazon-elb-sg
  • ELBから全てのプロトコル(tcp, udp, icmp)を許可
    1. aws --profile test-user ec2 authorize-security-group-ingress \
    2.   --group-name MySecurityGroup \
    3.   --source-security-group-owner-id amazon-elb \
    4.   --source-security-group-name amazon-elb-sg

EC2のホスト一覧の作成

  • EC2インスタンス一覧(Stateでソート、カラム名に"C010,C020,..."を付けているのは出力カラム順がアルファベットのため)
    1. aws ec2 describe-instances \
    2.   --region ap-northeast-1 \
    3.   --query 'sort_by(Reservations[].Instances[].{C010:Tags[?Key==`Name`].Value|[0],C020:InstanceId,C030:PublicDnsName,C040:State.Name}, &C040)' \
    4.   --output text
    • State=runningのみ
      1.   --filters "Name=instance-state-name,Values=running"
    • タグでソートしたい場合(sort_by(, &C010) ではnullが含まれると失敗する)
      1.   --output text | sort

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-03-28 (水) 16:25:43 (28d)