CloudShellでEC2やRoute53の情報取得する

Page content

1.目的

AWSのCloudShellでEC2やRoute53の情報を取得したり、整形する方法を具体例を交えながら確認します。 私のようなシェル芸人としては、AWSのリソースをすべてCLIで維持管理できたらうれしいので、CloudShellへの理解は深めていきたいところです。

CloudShellを使うメリットとしては、AWSの運用管理がセキュアになることだと考えています。外部の端末からaws cliを実行する場合、IAMロール、アクセスキー、シークレットキーの管理が必要になってきます。

2.CloudShellとは

公式Docsはこちらになります。

CloudShellはAWSコンソールで用意されているCLI(on Web)ツールです。実体はEC2(AmazonLinux)になるので、普段からTeratermやPuttyなどのLinuxのターミナルを使っている方はあまり違和感がないと思います。

なおCloudShell自体は無料ですが、データ転送を行う場合はデータ転送料金が発生する場合があります。詳しくは上記の公式を参照ください。

3.aws cliとは

公式Docsはこちらになります。

AWS CLIは、AWSのサービスを管理するための統合CLIツールです。コマンドラインからAWSの各サービス/リソースの情報取得や設定変更を行うことができます。

なお、aws cliのコマンド構成については個人的には以下のようになっていると理解しています。

aws <サービス名> <やりたいこと> <--で内容/対象>

サービス名については、ec2s3route53などを指定します。 やりたいことは、起動したい更新したいなどの実行したい処理を指定します。 内容/対象では、どのインスタンスどのS3バケットなどなど、細かいオプションを指定します。

例えば単純な例としてec2のインスタンスを起動したいときには以下のようなコマンドになります。

aws ec2 start-instances --instance-ids i-123456789abc

4. まずはやってみよう!(EC2インスタンスの停止と起動)

まずは実際に動かしてみて、感動するところから始めましょう。その方がモチベーションもあがる(はず)!ここではテスト用に下記3台のEC2インスタンスを用意しました。これらは各EC2インスタンスに名前(タグ)として設定しています。

  • moon.example.net
  • earth.example.net
  • mars.example.net
  1. まずEC2のインスタンス一覧の情報を取得します。(わかりやすいようにgrepでフィルタしていますが、コマンドオプションの–queryやjqで絞る方がスタンダードです)

    $ aws ec2 describe-instances | grep "\"InstanceId\":\|\"Value\":\|\"Name\":"
                        "InstanceId": "i-08ddfe6**********", ★インスタンスID
                            "Name": "running" ★状態(running=起動中)
                                "Value": "moon.example.net" ★名前タグ情報
                        "InstanceId": "i-0d6d81d**********",
                            "Name": "running"
                                "Value": "earth.example.net"
                        "InstanceId": "i-0338d21**********",
                            "Name": "running"
                                "Value": "mars.example.net"
    $ 
    
  2. 起動状態のEC2インスタンスを停止してみます。ここではmoon.example.netを停止してみます。stop-instancesの–instance-idsオプションで、moon.example.netのインスタンスIDを指定します。このコマンドを実行すると、実行結果が表示されます。

    $ aws ec2 stop-instances --instance-ids i-08ddfe6********** 
    {
        "StoppingInstances": [
            {
                "CurrentState": {
                    "Code": 64,
                    "Name": "stopping"
                },
                "InstanceId": "i-08ddfe6**********",
                "PreviousState": {
                    "Code": 16,
                    "Name": "running"
                }
            }
        ]
    }
    $     
    
  3. EC2インスタンスの起動/停止状態を確認します。確かに停止状態になっています。

    $ aws ec2 describe-instances | grep "\"InstanceId\":\|\"Value\":\|\"Name\":"
                    "InstanceId": "i-08ddfe6**********",
                        "Name": "stopped" ★stopped=停止になった!
                            "Value": "moon.example.net"
                    "InstanceId": "i-0d6d81d**********",
                        "Name": "running"
                            "Value": "earth.example.net"
                    "InstanceId": "i-0338d21**********",
                        "Name": "running"
                            "Value": "mars.example.net"
    $ 
    
  4. それでは停止したEC2インスタンスを起動してみましょう。start-instancesの–instance-idsオプションで、moon.example.netのインスタンスIDを指定します。このコマンドを実行すると、停止時と同様に実行結果が表示されます。

    $ aws ec2 start-instances --instance-ids i-08ddfe6**********
    {
        "StartingInstances": [
            {
                "CurrentState": {
                    "Code": 0,
                    "Name": "pending"
                },
                "InstanceId": "i-08ddfe6**********",
                "PreviousState": {
                    "Code": 80,
                    "Name": "stopped"
                }
            }
        ]
    }
    $ 
    
  5. EC2インスタンスの起動/停止状態を確認します。確かに起動されました。

    $ aws ec2 describe-instances | grep "\"InstanceId\":\|\"Value\":\|\"Name\":"
                    "InstanceId": "i-08ddfe6**********",
                        "Name": "running" ★runnning=起動になった!
                            "Value": "moon.example.net"
                    "InstanceId": "i-0d6d81d**********",
                        "Name": "running"
                            "Value": "earth.example.net"
                    "InstanceId": "i-0338d21**********",
                        "Name": "running"
                            "Value": "mars.example.net"
    $
    

個人的にはGUIが苦手なので、このようにCLIで管理できるのはとてもありがたいです。欲を言えば、CloudShellの画面立ち上げまでのWeb GUIポチポチが手間なので、キーボードをパンパーン!とするだけで、CloudShellが操作可能になるといいなあと思いました。

5. EC2の具体例

公式のコマンドリファレンスはこちらです。

使えそうなコマンドを記載しておきます。

情報採取系

  • インスタンス一覧の取得

    aws ec2 describe-instances
    
  • インスタンス一覧の取得(整形版)

    「インスタンスID、名前、状態、プライベートIP、パブリックIP」を抽出してCSV形式で出力します。

    $ aws ec2 describe-instances | jq -r '.Reservations[] | .Instances[] | [.InstanceId, .Tags[].Value, .State.Name, .PrivateIpAddress, .PublicIpAddress] | @csv'
    "i-08ddfe6**********","moon.example.net","running","10.0.1.13",
    "i-0d6d81d**********","earth.example.net","running","10.0.0.20",
    "i-0338d21**********","mars.example.net","running","10.0.0.34","54.***.***.123"
    $ 
    
  • 起動中インスタンス一覧の取得(–filter使うパターン)

     –filterのパターンだと、フィルタ設定の書き方(ここではName=instance-state-name)が直感的ではない。。。

    aws ec2 describe-instances --filter "Name=instance-state-name,Values=running"
    
  • 起動中インスタンス一覧の取得(jqでselect使うパターン)

     jqの方が直感的なので、個人的にはこちらが好きです。

    $ aws ec2 describe-instances | jq -r '.Reservations[] | .Instances[] | select(.State.Name == "running") | [.InstanceId, .Tags[].Value, .State.Name, .PrivateIpAddress, .PublicIpAddress] | @csv'
    "i-0d6d81d**********","earth.example.net","running","10.0.0.10",
    "i-0338d21**********","mars.example.net","running","10.0.0.20","54.***.***.123"
    $ 
    

    情報取得系の処理は、jqのみでほぼ対応可能だと思うので、aws cliのこまかいコマンドオプションを覚えるよりも、jqで処理した方がとっつきやすいかもしれません。

6. Route53の具体例

公式のコマンドリファレンスはこちらです。

情報採取系

  • ホストゾーンの取得

    aws route53 list-hosted-zones
    
  • 全レコードの取得(ホストゾーン指定)

    $ aws route53 list-resource-record-sets --hosted-zone-id="/hostedzone/Z0760660HJ**********"
    
  • 全レコードの取得(データ抜粋版)

    $ aws route53 list-resource-record-sets --hosted-zone-id="/hostedzone/Z0760660HJ**********" | jq -r '.ResourceRecordSets[] | [ .Name, .Type, .ResourceRecords[].Value ]'
    [
    "example.net.",
    "NS",
    "ns-849.awsdns-42.net.",
    "ns-1616.awsdns-10.co.uk.",
    "ns-296.awsdns-37.com.",
    "ns-1026.awsdns-00.org."
    ]
    [
    "example.net.",
    "SOA",
    "ns-849.awsdns-42.net. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400"
    ]
    [
    "earth.example.net.",
    "AAAA",
    "2406:da14:1f98:7900:***"
    ]
    [
    "mars.example.net.",
    "AAAA",
    "2406:da14:1f98:7900:***"
    ]
    [
    "moon.example.net.",
    "AAAA",
    "2406:da14:1f98:7901:***"
    ]
    
  • AAAAレコードの取得(整形版)

    $ aws route53 list-resource-record-sets --hosted-zone-id="/hostedzone/Z0760660HJ**********" | jq -r '.ResourceRecordSets[] | select(.Type == "AAAA") | [ .Name, .Type, .ResourceRecords[].Value ] | @csv'
    "earth.example.","AAAA","2406:da14:1f98:7900:***"
    "mars.example.","AAAA","2406:da14:1f98:7900:***"
    "moon.example.","AAAA","2406:da14:1f98:7901:***"
    

7.まとめ

やはりCLIは早くていいですね。マウスを使う必要がないところが個人的に大好きです! 今回はEC2とRoute53についてざっと調べてみましたが、GUIで操作するような箇所はすべてCloudShellでも操作可能であるように見えました。

普段の定常的な作業は、CloudShellでバッチ化するなどもできそうで夢が膨らみますね!