Memo/AmazonWebServices/awscli/EC2

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

'Memo/AmazonWebServices/awscli/EC2/' には、下位層のページがありません。

awscli ec2


EC2のホスト一覧の作成

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

EBSの追加と動的拡張

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

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

aws --profile default --region ap-northeast-1 ec2 describe-instances \
--filters 'Name=private-dns-name,Values=ip-01-02-03-04.ap-northeast-1.compute.internal' \
--query "Reservations[].Instances[].{InstanceId:InstanceId,Tags:Tags[],PublicDnsName:PublicDnsName,State:State.Name}"                                                                                                                                                      

[
    {
        "InstanceId": "i-123456",
        "State": "running",
        "PublicDnsName": "ec2-01-02-03-04.ap-northeast-1.compute.amazonaws.com",
        "Tags": [
            {
                "Value": "web01",
                "Key": "Name"
            }
        ]
    }
]

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自動変換機能は動作しない
AWS_PROFILE=default
AWS_REGION=ap-northeast-1
AWS_VPC_ID=vpc-xxxx
AWS_VPC_SG="sg-xxxx"
AWS_EC2_ID="i-xxxx01 i-xxxx02"

aws --profile $AWS_PROFILE --region $AWS_REGION ec2 enable-vpc-classic-link --vpc-id $AWS_VPC_ID

for id in $AWS_EC2_ID; do \
  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
done
  • EC2の中から、タグが「Name=web01, web02, ...」、動作中を探して、instance-idを返す
    AWS_EC2_ID=$(aws --profile $AWS_PROFILE \
      --region $AWS_REGION \
      ec2 describe-instances \
      --filters "Name=instance-state-name,Values=running" "Name=tag-key,Values=Name" "Name=tag-value,Values=web*" \
      --query 'Reservations[].Instances[].InstanceId' \
      --output text)

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

aws ec2 describe-instances \
  --region ap-northeast-1 \
  --instance-ids i-12345678 i-90123456 \
  --query "Reservations[].Instances[].{InstanceId:InstanceId,Tags:Tags[],PublicDnsName:PublicDnsName,State:State.Name}"

[
    {
        "InstanceId": "i-12345678",
        "State": "running",
        "PublicDnsName": "ec2-12-34-56-78.ap-northeast-1.compute.amazonaws.com",
        "Tags": [
            {
                "Value": "host01",
                "Key": "Name"
            },
        ]
    },
    {
     ...
    }
]

EC2 Security Group

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

セキュリティグループ追加時に説明記入する

AWS_PROFILE=example 
AWS_REGION=ap-northeast-1 
AWS_EC2_SG=sg-xxxx 
AWS_EC2_SG_CIDR="203.0.113.0/24" 
AWS_EC2_SG_DESCRIPTION="web01 td-agent" 

aws ec2 authorize-security-group-ingress \ 
--profile $AWS_PROFILE \ 
--region $AWS_REGION \ 
--group-id $AWS_EC2_FLUENTD_SG \ 
--ip-permissions "$(printf '[{"IpProtocol": "tcp", "FromPort": 24224, "ToPort": 24224, "IpRanges": [{"CidrIp": "%s", "Description": "%s"}]}]' "${AWS_EC2_DEVLOG_PUBLIC_CIDR}" "${AWS_EC2_DEVLOG_DESCRIPTION}")"

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

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

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