AWSCLIを使ってみる

あけましておめでとうございます。今年もよろしくお願いします。
ごきげんまるです。

ということで、2019年1発目のブログを新年から半年経過した今日書きます。

AWSのアクセスキーとシークレットキー

AWSCLIのインストールが終われば、AWSCLIを使うための設定は1つ。AWSCLIのコマンドを実行するAWS環境の指定です。
この指定はコマンド1つで実行可能ですが、AWS環境を指定するためにはアクセスキーとシークレットキーが必要です。
Terraformなどを利用されている方には馴染みがあると思います。自分は仕事でTerraformで環境構築をしているので、アクセスキーとシークレットキーはすぐにわかりましたが、使ってないと「何それ?」となる人も多いのでは?
ということで、アクセスキーとシークレットキーの作成方法と調べ方を先に記載します。

1. AWSのコンソールからIAMコンソールを開きます。
2. 画面左のツリーから、「ユーザー」を選択。
3. 利用しているユーザ名をクリック。
4. 「認証情報」タブを選択。
5. すでにアクセスキーとシークレットキーがある場合は、ここでアクセスキーの箇所にアクセスキーIDがあります。
  ない場合は作成が必要なので、「アクセスキーの作成」を選択。
6. アクセスキーが自動で作成されるので、アクセスキーIDとシークレットキーをメモ。

ちなみにですが、アクセスキーとシークレットキーが作成済みであれば、コンソール画面の右上、自身のアカウント名が表示されているところをクリックし、「セキュリティ認証情報」から「アクセスキー(アクセスキーIDとシークレットアクセスキー)を選択すれば確認できます。」

アクセスキーとシークレットキーの情報が手に入ったらAWSCLIのコマンドで環境設定をします。

AWS環境設定

環境設定は以下のコマンドを実行すればOKです。

$ aws configure
AWS Access Key ID [None]:     <-先ほど調べたアクセスキー情報を入力
AWS Secret Access Key [None]:   <-先ほど調べたシークレットキー情報を入力
Default region name [None]:    <-デフォルトで利用するリージョン(東京ならap-northeast-1)を入力
Default output format [None]:   <-コマンドの出力形式を選択。(JSON/TEXT/TABLE)

これで設定は完了です。
ちなみにですが、これはDefaultのprofile設定となります。
profileは複数作成可能で、環境ごと(本番、開発など)にprofileを作成することも可能です。
例えば開発のprofileを作成するときは以下のようにオプションに"--profile profile名"を入れることで作成可能です。

$ aws configure --profile testprofilename
AWS Access Key ID [None]:     <-先ほど調べたアクセスキー情報を入力
AWS Secret Access Key [None]:   <-先ほど調べたシークレットキー情報を入力
Default region name [None]:    <-デフォルトで利用するリージョン(東京ならap-northeast-1)を入力
Default output format [None]:   <-コマンドの出力形式を選択。(JSON/TEXT/TABLE)

複数prifileを作成した場合ですが、コマンドを普通に実行すると、Defaultのprofileで環境が指定され実行されます。
コマンド実行時に引数に"--profile profile名"を入れれば、指定したprifileの環境でコマンドが実行されます。
AWSCLIですが、コマンドでAWS環境の構築・変更・削除が可能となる(もちろんIAMで設定されている権限で可能な範囲)ので、注意が必要です。
なので、Defaultのprofileは開発環境とし、本番に対して実行する場合は--profileオプションで実行する等を考慮してもいいと思います。
※自分は面倒なのと、本番運用に入った環境でAWSCLIを実行することが無いので、都度Defaultのprofileをaws configureで変更しています。

aws configureで設定した内容は自身のhome directory配下に「.aws」というディレクトリが作成され、そこに情報が格納されています。
「.aws」に2つのファイルが作成されます。
 config ・・・リージョンとアウトプット形式の情報が記載される
 credentials・・・アクセスキーとシークレットキーの情報が記載される
credentialファイルがあればAWS上に勝手にいろんなインスタンスを作成されてしまいますので、間違っても、.aws配下のファイルをgitなどに上げないようにしましょう!

AWSCLIコマンドを実行してみる

ここまで設定をすればAWSCLIでAWS環境へコマンドを実行できます。
AWSCLIのコマンドリファレンスは以下のサイトで公開されているので、実行したいコマンドを調べて実行してみるといいと思います。

docs.aws.amazon.com

といっても何かれやればいいかわからないという方もいるかと思います。
show系のコマンドであれば実行しても変更は入らないので、設定情報の確認から触ってみるのがいいかもです。
AWS上で何かしらを作っているのであれば必ずあると思うのがVPC系の情報なので、例えば以下のあたりのコマンドを実行してみましょう。

$ aws ec2 describe-vpcs
{
    "Vpcs": [
        {
            "VpcId": "vpc-xxxxxxxxx,
            "InstanceTenancy": "default",
            "CidrBlockAssociationSet": [
                {
                    "AssociationId": "vpc-cidr-assoc-xxxxxxxx",
                    "CidrBlock": "172.31.0.0/16",
                    "CidrBlockState": {
                        "State": "associated"
                    }
                }
            ],
            "State": "available",
            "DhcpOptionsId": "dopt-xxxxxxxx",
            "OwnerId": "xxxxxxxxxx",
            "CidrBlock": "172.31.0.0/16",
            "IsDefault": true
        }
    ]
}

このコマンドはAWS上で設定されているVPCの情報を確認するためのコマンドです。
上記は自分のAWS環境のDefaultのVPC情報ですね。
Default output formatの設定をJSONにしているので、JSONで出力されています。
出力形式は何も指定しない場合はDefault output formatの設定で出力されます。コマンドのオプション(--output )で変更が可能で、text形式で出力させたい場合は"--output text"、table形式で出力させたい場合は"--output table"で変更が可能です。
例えば上記のコマンドに"--output text"オプションを指定するとこんな感じ。

$ aws ec2 describe-vpcs --output text
VPCS    172.31.0.0/16   dopt-xxxxxxxx   default True    xxxxxxxxxx    available       vpc-xxxxxxx
CIDRBLOCKASSOCIATIONSET vpc-cidr-assoc-xxxxxxx 172.31.0.0/16
CIDRBLOCKSTATE  associated

"--output table"にするとこんな感じ。

$ aws ec2 describe-vpcs --output table
-------------------------------------------------------------------------------------------------------------------
|                                                  DescribeVpcs                                                   |
+-----------------------------------------------------------------------------------------------------------------+
||                                                     Vpcs                                                      ||
|+---------------+----------------+------------------+------------+---------------+-------------+----------------+|
||   CidrBlock   | DhcpOptionsId  | InstanceTenancy  | IsDefault  |    OwnerId    |    State    |     VpcId      ||
|+---------------+----------------+------------------+------------+---------------+-------------+----------------+|
||  172.31.0.0/16|  dopt-xxxxxxxx |  default         |  True      |  xxxxxxxxxxxxx |  available  |  vpc-xxxxxxxx  ||
|+---------------+----------------+------------------+------------+---------------+-------------+----------------+|
|||                                           CidrBlockAssociationSet                                           |||
||+------------------------------------------------------------------+------------------------------------------+||
|||                           AssociationId                          |                CidrBlock                 |||
||+------------------------------------------------------------------+------------------------------------------+||
|||  vpc-cidr-assoc-xxxxxxxx                                         |  172.31.0.0/16                           |||
||+------------------------------------------------------------------+------------------------------------------+||
||||                                              CidrBlockState                                               ||||
|||+-----------------------------------------+-----------------------------------------------------------------+|||
||||  State                                  |  associated                                                     ||||
|||+-----------------------------------------+-----------------------------------------------------------------+|||

もちろん、VPCだけではなくS3やEC2などもコマンドが用意されているので、上記で紹介しているリファレンスを見ながらいろいろと試してみるといいかと思います。
自分は「AWS上で構築した環境が正しくパラメータが設定されているかの確認をやれるようにしてほしい。」というお客様からのリクエストを満たすために使っているので、基本的にはshow系のコマンドを多く使います。
実際に環境の構築や変更・削除はAWSCLIではなくTerraformでやっているので…。