LoginSignup
0
0

WSL環境にAWS コマンドラインインターフェイス(AWS CLI)を構築する

Last updated at Posted at 2023-08-04

イントロ

こんにちは。
最近お仕事でAWSを触りまくってます。インプットが多すぎてアウトプットできていなかったのですが、徐々に情報を発信していこうと思っています。まずは「AWS コマンドラインインターフェイス(AWS CLI)」です。いわゆる

$ aws ec2 describe-instances
{
    "Reservations": [
        {
            "Groups": [],
            "Instances": [
                {
                    "AmiLaunchIndex": 0,
                    "ImageId": "ami-04394efb326c1b2f0",
                    "InstanceId": "i-xxxxx",
                    "InstanceType": "t2.micro"...
$

的なヤツですね。WindowsのWSL環境にAWS CLIをインストールして、触っていこうと思います。

まずはインストール

WSL を起動して、

$ aws
Command 'aws' not found, but can be installed with:
まだ存在しない

$ unzip
Command 'unzip' not found, but can be installed with:
sudo apt install unzip

こっちもない

ってことで、unzipをインストールしてから、AWS CLIをインストールしていきます。

$ sudo apt install unzip

$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"

$ unzip awscliv2.zip
Archive:  awscliv2.zip
   creating: aws/
   creating: aws/dist/
  inflating: aws/install
  ...

$ sudo ./aws/install
You can now run: /usr/local/bin/aws --version

$ aws --version
aws-cli/2.13.6 Python/3.11.4 Linux/5.15.90.1-microsoft-standard-WSL2 exe/x86_64.ubuntu.22 prompt/off$

インストール完了です。

設定する

いわゆるアカウントキー

aws_access_key_id = AKIAxxxxxx
aws_secret_access_key = QbJYxxxxxx

等は取得済ってことですすめます。

~$ aws configure
AWS Access Key ID [None]: AKIAxxxxxx
AWS Secret Access Key [None]: QbJYxxxxxx
Default region name [None]: ap-northeast-1
Default output format [None]:
$

設定完了です。

データを取ってみる。

動かしてみます。

$ aws ec2 describe-vpcs
{
    "Vpcs": [
        {
            "CidrBlock": "172.16.0.0/16",
            "DhcpOptionsId": "dopt-xxxx
            "State": "available",
            "VpcId": "vpc-xxxx
            "OwnerId": "xxxx",
            "InstanceTenancy": "default",
            "CidrBlockAssociationSet": [
                {

    ......
}

VPCのデータを取ってみましたが、なんらかデータが返ってきました。データ量が多すぎるので項目を絞ってみます。

$  aws ec2 describe-vpcs \
    --query "Vpcs[*].[Tags[0].Value, VpcId, CidrBlock]" --output  table
----------------------------------------------------------------
|                         DescribeVpcs                         |
+-----------------+-------------------------+------------------+
|  062xxxxxxxxx   |  vpc-0c2e5bxxxxxxxxxxx  |  172.16.0.0/16   |
|  defaultVPC     |  vpc-9dxxxxxx           |  172.31.0.0/16   |
|  TmpVPCStack    |  vpc-0c29xxxxxxxxxxxxx  |  192.168.0.0/16  |
|  MyVPC          |  vpc-0cdbxxxxxxxxxxxxx  |  192.168.0.0/16  |
|  abcd-efghij-VPC|  vpc-08fxxxxxxxxxxxxxx  |  192.168.0.0/16  |
+-----------------+-------------------------+------------------+
$

VpcIdとCidrBlockとTags配列の最初の値(よくNameとかのキーで値が入っています)、を並べてみました。 --output table で表形式で出力できるようですね。

TIPS

参考: AWS CLIのフィルターとクエリーの使い方についてまとめてみた ほとんどこのサイトから得られた情報です。ありがとうございます。

Tagsをちゃんと指定する

Tagsの最初の値とか曖昧な指定ではなく、Key名をちゃんと指定(Key=='Name') してみます。
具体的には Tags[0](Tags[?Key=='Name'])[0] とKeyが 'Name' って値たちの最初、って変更してみると

$ aws ec2 describe-vpcs \
    --query "Vpcs[*].[(Tags[?Key=='Name'])[0].Value, VpcId, CidrBlock]" --output  table
-----------------------------------------------------------------
|                         DescribeVpcs                          |
+------------------+-------------------------+------------------+
|  None            |  vpc-0c2e5bxxxxxxxxxxx  |  172.16.0.0/16   | <- Name がないヤツはNone
|  defaultVPC      |  vpc-9dxxxxxx           |  172.31.0.0/16   |
|  tmp-vpc         |  vpc-0c29xxxxxxxxxxxxx  |  192.168.0.0/16  |
|  stg-VPCStack-VPC|  vpc-0cdbxxxxxxxxxxxxx  |  192.168.0.0/16  |
|  abcd-efghij-VPC |  vpc-08fxxxxxxxxxxxxxx  |  192.168.0.0/16  |
+------------------+-------------------------+------------------+
$

ちゃんとKeyが'Name'って値を取得する事ができました!便利ですね。

条件でフィルタする

たとえばサブネットで、あるVPCに含まれるサブネット、とかは以下の通り。

$ aws ec2 describe-vpcs --query "Vpcs[][VpcId,CidrBlock]" --output table
---------------------------------------------
|               DescribeVpcs                |
+------------------------+------------------+
|  vpc-0c2e5bxxxxxxxxxxx |  172.16.0.0/16   |
|  vpc-9dxxxxxx          |  172.31.0.0/16   |
|  vpc-0c29xxxxxxxxxxxxx |  192.168.0.0/16  |
|  vpc-0cdbxxxxxxxxxxxxx |  192.168.0.0/16  |
|  vpc-08fxxxxxxxxxxxxxx |  192.168.0.0/16  |
+------------------------+------------------+
$ 

vpc-0cdbxxxxxxxxxxxxx のSubnetを一覧してみる

$ aws ec2 describe-subnets \
--query "Subnets[*].[(Tags[?Key=='Name'])[0].Value,CidrBlock,SubnetId]" \
--filters "Name=vpc-id, Values=vpc-0cdbxxxxxxxxxxxxx" \
--output table

----------------------------------------------------------------------------
|                              DescribeSubnets                             |
+---------------------------+-----------------+----------------------------+
|  stg-VPCStack-public-003  |  192.168.4.0/24 |  subnet-0042cd4xxxxxxxxxx  |
|  stg-VPCStack-private-002 |  192.168.3.0/24 |  subnet-0c63408xxxxxxxxxx  |
|  stg-VPCStack-private-003 |  192.168.5.0/24 |  subnet-00e6a55xxxxxxxxxx  |
|  stg-VPCStack-private-001 |  192.168.1.0/24 |  subnet-02b5744xxxxxxxxxx  |
|  stg-VPCStack-public-001  |  192.168.0.0/24 |  subnet-044d4f1xxxxxxxxxx  |
|  stg-VPCStack-public-002  |  192.168.2.0/24 |  subnet-0ffc99cxxxxxxxxxx  |
+---------------------------+-----------------+----------------------------+

--filters Name=vpc-id,Values=vpc-0cdbxxxxxxxxxxxxx って指定ができるようです。NameがVpcIdではなく vpc-id ってところが要注意。

条件はAnd条件を複数指定できるっぽい。下記はさらに「かつ、MapPublicIpOnLaunch=false」のヤツ、という指定をしています。

$ aws ec2 describe-subnets \
--query "Subnets[*].[(Tags[?Key=='Name'])[0].Value,CidrBlock,SubnetId]" \
--filters \
 "Name=vpc-id, Values=vpc-0cdbxxxxxxxxxxxxx" \
 "Name=map-public-ip-on-launch, Values=false" \
--output table

----------------------------------------------------------------------------
|                              DescribeSubnets                             |
+---------------------------+-----------------+----------------------------+
|  stg-VPCStack-private-002 |  192.168.3.0/24 |  subnet-0c63408xxxxxxxxxx  |
|  stg-VPCStack-private-003 |  192.168.5.0/24 |  subnet-00e6a55xxxxxxxxxx  |
|  stg-VPCStack-private-001 |  192.168.1.0/24 |  subnet-02b5744xxxxxxxxxx  |
+---------------------------+-----------------+----------------------------+
$

JSON形式で出力する。

$ aws ec2 describe-subnets \
--query "Subnets[*].[(Tags[?Key=='Name'])[0].Value,CidrBlock,SubnetId]" \
--filters \
 "Name=vpc-id, Values=vpc-0cdbxxxxxxxxxxxxx" \
 "Name=map-public-ip-on-launch, Values=false" \
--output json

[
    [
        "stg-VPCStack-private-002",
        "192.168.3.0/24",
        "subnet-0c63408xxxxxxxxxx"
    ],
    [
        "stg-VPCStack-private-003",
        "192.168.5.0/24",
        "subnet-00e6a55xxxxxxxxxx"
    ],
    [
        "stg-VPCStack-private-001",
        "192.168.1.0/24",
        "subnet-02b5744xxxxxxxxxx"
    ]
]

項目名が出力されないようですね。明示的にプロパティ名を与えてあげないといけないようです。

$ aws ec2 describe-subnets \
--query "Subnets[*].{name:(Tags[?Key=='Name'])[0].Value,cidr:CidrBlock,id:SubnetId}" \
--filters \
 "Name=vpc-id,Values=vpc-0cdbxxxxxxxxxxxxx" \
 "Name=map-public-ip-on-launch,Values=false" \
--output json

[
    {
        "name": "stg-VPCStack-private-002",
        "cidr": "192.168.3.0/24",
        "id": "subnet-0c63408xxxxxxxxxx"
    },
    {
        "name": "stg-VPCStack-private-003",
        "cidr": "192.168.5.0/24",
        "id": "subnet-00e6a55xxxxxxxxxx"
    },
    {
        "name": "stg-VPCStack-private-001",
        "cidr": "192.168.1.0/24",
        "id": "subnet-02b5744xxxxxxxxxx"
    }
]

ついでにjqと連動してみます。

$ aws ec2 describe-subnets \
--query "Subnets[*].{name:(Tags[?Key=='Name'])[0].Value,cidr:CidrBlock,id:SubnetId}" \
--filters \
 "Name=vpc-id,Values=vpc-0cdb748dbc3f8eabe" \
 "Name=map-public-ip-on-launch,Values=false" \
--output json | jq '.[].cidr'

"192.168.3.0/24"
"192.168.5.0/24"
"192.168.1.0/24"
$

いままでAWSの管理画面から見ていたデータをこのようにコマンドラインから取得できるわけですね。便利です!

以上、お疲れさまでした。

関連リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0