AWSのインフラ管理はIaC? いやちゃうちゃう。時代はInfrastructure as SQL (IaSQL)でしょ

# 概要

* 皆さんAWSのインフラ管理どうしてますか？
* なるべくならインフラ管理は自動化。手順書も作らず、資源作成時誰でもどの環境に対し同じものを作成したいですよね。
* そんな時、Infrastructure as Code（IaC)を採用し、インフラ管理をコード化するのは当たり前になってきているんじゃないでしょうか。
* AWSにおけるIaCだと例えば、**Cloudformation**とか、**AWS CDK**とか**Terraform**等、様々です。

* ただ今回は、そんなIaCの紹介・・・ではなく、全く新しい概念の**Infrastructure as SQL (IaSQL)** なるものについて、ご紹介したいと思います。

# Infrastructure as SQL (IaSQL)

* Infrastructure as SQL (IaSQL)とは何か。
=> **一言で表すなら、インフラ構成をPostgreSQLで管理するためのSaaSになります。**

https://iasql.com/

* 仕組みとしては、AWSアカウントとホストされているPostgreSQLデータベース間を接続し、インフラ構成をデータとしてモデル化するようになっています。
* そして、モジュールシステムにてすべてのIaSQLモジュールがAWSサービス（例えばaws_ec2、aws_elb）にマッピングされる形で適用される。

![スクリーンショット 2022-06-21 10.22.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/faa0e8d1-312a-05a2-4d25-7aa08b28ffe1.png)

## 何が嬉しいの？？

* 一番のメリットは、インフラ構成をSQLで管理できることにより、インフラを操作するために新しい言語を学ぶ必要がないことだと思います。
* SQLであれば、エンジニアリングチームで既に使用されているケースも多いでしょう。


### 実は既にIaSQLのSaaSは存在する

* 実はSQLを使ってインフラを管理しようとするサービスは、他にも存在します。
  * [CloudQuery](https://www.cloudquery.io/)
  * [Steampipe](https://steampipe.io/)
  * [trino-cloud](https://github.com/nineinchnick/trino-cloud)
  * [StackQL](https://stackql.io/)

## どんな感じで記述するのか

* [こちら](https://iasql.com/)にアクセスしていただき「**Try IaSQL now**」をクリックしてください。

![スクリーンショット 2022-06-21 10.38.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/2cf963f6-a2be-1ea4-88d3-22beab0efb8d.png)

* ログイン画面に遷移するので、ログインしていきます。

![スクリーンショット 2022-06-21 10.37.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/da5d5da1-5113-a5c2-5c81-c73c1003130c.png)

* ログインできると、下記のような画面に遷移するので、接続するAWSアカウントの情報を入力し接続しておきます。

![スクリーンショット 2022-06-21 10.40.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/92342a15-742d-7020-b180-2fb5d7a12a82.png)

![スクリーンショット 2022-06-21 10.40.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/ffd2dd38-2bab-dab9-bd7a-8e55811fad9a.png)

### SQLのサンプル

* IaSQLにおけるschemaの情報は下記より参照できます。

https://dbdocs.io/iasql/iasql?table=alias_target&schema=public&view=table_structure

#### EC2の資源をクエリする

* まず初めにEC2モジュールをインストールします。

```sql
SELECT * FROM iasql_install('aws_ec2');
```

##### 資源の作成クエリ組み立て

* トランザクションを張り、それぞれでインスタンスを作成するような例になります。
* 今回、インスタンスのタイプは**t2.micro**を指定し、amiは最新のものを確認し記載します。
* また、後に以下で作成するインスタンスを参照したいので、タグを付与し名前を「i-1」「i-2」としています。

```sql
BEGIN;
  INSERT INTO instance (ami, instance_type, tags)
    VALUES ('ami-0892d3c7ee96c0bf7', 't2.micro', '{"name":"i-1"}');
  INSERT INTO instance_security_groups (instance_id, security_group_id) SELECT
    (SELECT id FROM instance WHERE tags ->> 'name' = 'i-1'),
    (SELECT id FROM security_group WHERE group_name='default');
COMMIT;

BEGIN;
  INSERT INTO instance (ami, instance_type, tags)
    VALUES ('ami-0892d3c7ee96c0bf7', 't2.micro', '{"name":"i-2"}');
  INSERT INTO instance_security_groups (instance_id, security_group_id) SELECT
    (SELECT id FROM instance WHERE tags ->> 'name' = 'i-2'),
    (SELECT id FROM security_group WHERE group_name='default');
COMMIT;
```

##### 資源の適用

* 準備は整ったので、早速資源を作成しましょう。
* 資源作成時に使用するSQLは下記になります。

```sql
SELECT * FROM iasql_apply();
```

##### 作成した資源の読み取り

* 上記で作成した資源を今度は読み取ってみましょう。
* 直感的にSQLを組み立てれば良さげです。
* ここで先ほどEC2を作成した際に付与していたタグを指定することで、読み取るEC2を限定することができます。

```sql
SELECT *
FROM instance
WHERE tags ->> 'name' = 'i-1' OR
tags ->> 'name' = 'i-2';
```

* ちなみにこんなこともできたり。
* 下記はインスタンスの数を取得するクエリですね。

```sql
SELECT COUNT(*)
FROM instance;
```

### IaSQLで用意されている関数

* IaSQLで用意されている関数には以下のようなものがあります。

| name | signature | 説明 | サンプル |
| ---- | ---- | ---- | ---- |
| apply | iasql_apply() | リソースを作成、削除、または更新する。 | SELECT * FROM iasql_apply() |
| plan_apply | iasql_plan_apply() | 変更するデータベース内のリソースのプレビューができます。 | SELECT * FROM iasql_plan_apply() |
| sync | iasql_sync() | dbをクラウドアカウントの現在の状態と同期します。 | SELECT * FROM iasql_sync() |
| plan_sync | iasql_plan_sync() | 同期時に変更するデータベース内のリソースのプレビューをします。 | SELECT * FROM iasql_plan_sync() |
| install | iasql_install(variadic text[]) | modsをdbにインストールし、作成されたすべてのテーブルのレコードを返します。 | SELECT * FROM iasql_install('aws_vpc@0.0.1', 'aws_ec2') |
| uninstall | iasql_uninstall(variadic text[]) | dbでモジュールをアンインストールし、ドロップされたすべてのテーブルのレコードを返します。 | SELECT * FROM iasql_uninstall('aws_vpc', 'aws_ec2@0.0.1') |
| modules_list | iasql_modules_list() | インストール可能なすべてのモジュールを一覧表示します。 | SELECT * FROM iasql_modules_list() |
| modules_installed | iasql_modules_installed() | データベースに現在インストールされているすべてのモジュールを一覧表示します。 | SELECT * FROM iasql_modules_installed() |
| delete_all_records | delete_all_records() | iasqlモジュールによって管理されているテーブルのすべてのレコードを削除します。 | SELECT * FROM delete_all_records() |
| help | iasql_help() | ヘルプの表示です。 | SELECT * FROM iasql_help() |

## 現在/将来的なサポート範囲

* 現在、AWSのサービスの一部のみしかサポートしていません。ただ、Gitを見ると他のサービスのサポートもされそうな気配を感じます。
=> （EC2、ECR、ECS + Fargate、ELB、RDS、VPC、IAM、Route53）

![スクリーンショット 2022-06-21 10.30.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/618003ff-1cfa-7cf5-aacb-9952bf539ce6.png)


* また、将来的にGCP、Azure、他のクラウドプロバイダーもサポートする予定であるとも書いてありますね。

# 参考

https://iasql.com/

https://github.com/iasql/iasql-engine

https://dev.classmethod.jp/articles/introduction-iasql/