メタップスアドベントカレンダー第三日目の記事です。
IaCのSQL版が少し前に話題になり、ずっと気になっていたので改めて調べてみました。
新たな領域のIaCが登場
最近、IaC(Infrastructure as Code)という言葉が一般的になりつつあり、インフラをコードで管理するという概念が市民権を得てきていると感じています。
代表的なツールとしては
- Terraform
- AWS CloudFormation
- AWS CDK
- Google Cloud Deployment Manager
- Azure Resource Manager
あたりが挙げられると思います。これらは様々なプログラミング言語、YAML、JSON等で記述されます。
IaCのメリットとして
- 開発期間の短縮
- 信頼性・保守性の向上
がありますが、開発者側はインフラ領域に、インフラ側はコードを書く事に対して苦手意識がある人が多く、導入にはそれなりのコストがかかってしまいます。
これに対してインフラの構成をSQLで記述するものが登場しました。既にいくつかツールやSaaSが出ているようで、
- IaSQL
- CloudQuery
- Steampipe
- trino-cloud
- StackQL
といったものが登場しています。
今年の5、6月くらいにTwitterを中心に一時話題となりましたが、まだまだ認知度はあまり無いようで、Googleトレンドを見るとあまり検索はされていないようです。
特徴
特徴は以下のとおりです。
-
普段コードを触っていない人でも取っ付きやすい
インフラエンジニア等コードよりSQLが慣れている人にとっては最初のハードルが低くなるのではないでしょうか。 -
切り戻し方法はDB Snapshotからrestore
Snapshotからrestoreして過去のインフラ状態を復元します。
DBのsnapshotがインフラのsnapshotになるんですね。Disaster Recoveryの設計等でDBの復旧方法が応用できるかもしれない点面白そうです。 -
システムに組み込みやすい
やっていることはRDBの操作なので、たとえばWebシステムに組み込んでボタン1つでインフラ環境を簡単に変更できる等作り込みがしやすそうです。
他のIaCは独自のツールやコマンド操作が必要でなかなか導入ハードルは高そうな点を考えるとこの特徴は大きな利点になりそうです。
(AWS CDKは組み込みやすそうだが、マルチクラウドな環境を構築するといった場合対応できない)
欠点
欠点は以下が考えられます。
-
既にIaCを導入している組織にあまり旨味が無い
IaCツールをすでに使用している場合、わざわざ乗り換えるメリットはあまり無さそうです。
SQLを扱える人が多い組織で新たにIaCを導入する際候補に挙がるのではないでしょうか。 -
複雑な処理をするのが大変
条件分岐等柔軟な記述ができないため、難読SQLが発生しやすくメンテナンス性が悪くなる等SQLを扱う上での困り事が発生しやすそうです。 -
対応可能なクラウド、リソースが限定的
現在はAWSの一部リソースのみに対応しており、用途が限定的です。
githubを見ると扱えるリソースは増えそうでありマルチクラウドに対応する動きもあるようで将来的には扱えるものは増えると思われますが、現状はまだまだ少ないです。
実際に触ってみた
今回はIaSQLというSaaSを触ってみました。
2022年12月3日時点の画面は以下のようになっており、画面の右はモジュールやスキーマの情報、左はSQLの入力画面、下はSQLの入力結果が表示されていました。
EC2インスタンスを作成
# tableにEC2インスタンスの行を追加
INSERT INTO instance (ami, instance_type, tags)
VALUES ('resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2', 't2.micro', '{"name":"i-1"}');
INSERT後のinstanceテーブル
ID | INSTANCE_ID | AMI | INSTANCE_TYPE | KEY_PAIR_NAME | STATE | USER_DATA | TAGS | HIBERNATION_ENABLED | REGION | ROLE_NAME | SUBNET_ID |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | null | resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 | t2.micro | null | running | null | {"name":"i-1"} | null | ap-northeast-1 | null | null |
挿入されたレコードの情報を元にAWS環境にapply
# AWS環境にapply
SELECT * FROM iasql_apply();
apply後のinstanceテーブル
ID | INSTANCE_ID | AMI | INSTANCE_TYPE | KEY_PAIR_NAME | STATE | USER_DATA | TAGS | HIBERNATION_ENABLED | REGION | ROLE_NAME | SUBNET_ID |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | i-XXXXXXXXXXXXXXXXX | ami-0b73aa7c1d1b2e901 | t2.micro | null | running | null | {"owner":"iasql-engine","name":"i-1"} | null | ap-northeast-1 | null | 29 |
これで実際にAWS環境にインスタンスが作成されていました。
割と簡単に作成できて驚きです。