☁️くもをもくもくまなぶ

クラウドコンピューティングサービスの学んだことを中心につらつらと書いています

CloudFormer2を使ってリソースを抽出してみた

対象読者

  • GUIでリソースを作っていてコードで管理したいけど今さらコードに落とすのは難しい人

CloudFormer2について

AWSは以前、AWS CloudFormationのテンプレートの一つに、
CloudFormer(永遠のβ版)を用意していました。

それがどうも本当に永遠のβ版で開発が止まったとのことです。
私も4年前に「なに?コードで抽出できると?」ということで、
早く正式リリースされないかなーと待っていた一人です。

詳しくは以下のブログを参照してください。

https://dev.classmethod.jp/articles/former2/

CloudFormer2を使ってみての所感

「いい!」の一言でした。
CloudFormation, Terraform, AWS CDK等々色々な形式で出力されるので、
そのプロジェクトに応じて必要な形式に落とし込めるなと思いました。

ちなみにその際は以下のブログを参考にササッと立ち上げて見ました。

https://wing-degital.hatenablog.com/entry/2021/05/08/004507

ここで出てきた疑問が一つ私の中で生まれました。
サクッとやるのは確かにパブリックサブネットで作るのはいいけど、
関わるプロジェクトの多くではプライベートサブネットを中心にリソースを配置するので、
Former2のみパブリックサブネットに置く、そのためにパブリックサブネットを作るのか?というものです。

ということで、プライベートサブネットで実施できるように作ってみました。

環境

このために、Site−to−Site VPN構成を作るのは手段が目的になってしまうなと思ったので、
VPCピアリングで擬似的にプライベートサブネットにあるリソースへアクセスする構成を作りました。
サクッと1時間かからずに構成を練ったので、適当な感じがありますがご了承ください。

Image in a image block

ちなみにVPCピアリングにおいて同一AZ間であれば費用は掛からないというアップデートが今年ありましたので、数年ぶりにVPCピアリングをしてみました。

https://aws.amazon.com/jp/about-aws/whats-new/2021/05/amazon-vpc-announces-pricing-change-for-vpc-peering/

踏み台サーバ
  • WindowsServer2019 Base(Desktop experience)
  • t3.medium / 30GiB
  • Teraterm
  • Google Chrome
Former2
  • Amazon Linux 2 (Arm)
  • t4g.micro / 8GiB
  • Docker / Docker-Compose / Git

ちなみにt4g.microインスタンスは2021年内は無料枠が適用されていますhttps://aws.amazon.com/jp/ec2/instance-types/t4/

Free Trial: All new and existing AWS customers can try the t4g.micro instances free until December 31, 2021. During the free-trial period, customers who run a t4g.micro instance will automatically get 750 hours per month deducted from their monthly bill.

(この時点でArmベースのインスタンスにDocker-Composeが普通にはインストールできないことを知らなかったです)

各サーバのインストール作業

踏み台サーバ編

WindowsのTeraterm/Google Chromeについてインストール作業の説明をするまでもないので省略します。
それぞれの配布サイトからダウンロードして進めるだけです。

https://ja.osdn.net/projects/ttssh2/

https://www.google.com/intl/ja_jp/chrome/

Former2編

Docker のインストール

公式ドキュメントの通りでOKです。

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/docker-basics.html

Docker-Composeのインストール

そのままではNGです。

https://docs.docker.jp/compose/install.html#linux

Github上のリリースを見たのですが確かに該当するファイルは存在しませんでした。

https://github.com/docker/compose/releases/

そこで以下の記事を参考にしてEC2のユーザデータを作りました。

https://qiita.com/kure/items/d691bc6afd912bbbc545

以下をAmazonLinux2(Arm)で起動用ユーザデータとして作りました。
Former2のGit Cloneまで行うのですが、一気に実行すると起動に失敗したので、
時間の間隔制御でsleepを入れています。

#!/bin/bash
yum update -y
yum install git -y
amazon-linux-extras install docker -y
service docker start
usermod -a -G docker ec2-user
curl -L --fail <https://raw.githubusercontent.com/linuxserver/docker-docker-compose/master/run.sh> -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
/usr/local/bin/docker-compose -v
sleep 30
git clone <https://github.com/iann0036/former2.git> /home/ec2-user/former2

以下は起動後に踏み台サーバからSSHで接続後に入力します。
chownはユーザデータに盛り込んでみたんですが、上手く動かなったのと、
私がsed職人ではないため、後述するIPアドレスを書き換えるところも手動作業にしました。

sudo chown -R ec2-user:ec2-user /home/ec2-user/former2
cd former2/
vi docker-compose.yml
sudo /usr/local/bin/docker-compose up -d

上記の途中、docker-compose.yml編集箇所はIPアドレスを、
Former2を実行しているEC2のプライベートIPアドレスに変更する箇所です。

version: '3'
services:
  former2:
    image: nginx:1.17.8-alpine
    ports:
      - "${EC2のプライベートIP}:80:80"
    volumes:
    - .:/usr/share/nginx/html

Former2のCredentials用意

特に指定なければ、AWS Managed Policyの「ReadOnlyAccess」が推奨となります。
アクセスキー、シークレットアクセスキーが必要となるので、
今回はIAM Userに直接アタッチする形で払い出しています。

Image in a image block

IAM Policyを直接アタッチするのですが、「ReadOnlyAccess」と前後検索されると今は数がかなり多かったです。結局アルファベット順ですので、下部の方にあります。

Image in a image block

この形で作成します。

Image in a image block

アクセスキー、シークレットアクセスキーは言わずもがな厳重管理してください。

Image in a image block

Former2の設定

Credential編

前段で用意したアクセスキー、シークレットアクセスキーを入力して、「Continue to Parameters」で次に進みます。

Image in a image block
Parameters編

出力するテンプレートに汎用パラメータ適用する場合は入力してください。
起動するEC2のインスタンスタイプとかですね。

Image in a image block
Settings編

ここまで設定が問題なければ、試しに[Account Scannning]で途中いくつかエラーが表示されますが、一通り進めばOKです。

Image in a image block

Former2の使用

リソース選択編

カテゴリ別にリソースを選択する形になります。

Image in a image block
出力形式選択編

CloudFormation,Terraform,AWS CDK,Pulumiと様々な形式が選択可能です。
それぞれの現場で管理したい手法に合わせていくとよいです。

Image in a image block

CDK/Pulumiで出力するプログラミング言語も標準はTypeScript/JavaScriptですが、
Python,Java, C#/.NET, Goを選択可能なので得意な言語に設定するとよいです。

Image in a image block
β版

Diagramでは、draw.ioの形式で表示されますが、
画像にある通り、β版なのでリソース間の結合などは頑張って繋げてくれるのですが、
ソレジャナイ...となります。

Image in a image block

Raw Output (Debug)は、JSON形式で出力するので全行を目視での確認は推奨できませんが、
他のテンプレートに出力した結果でおかしい部分があった場合の確認には必要なものですね。

Image in a image block

まとめ

CloudFormer2をプライベート環境で動かす設定を記載しました。
IaCは便利である一方、まずはGUIでリソースを触ってみないことには、
定義するためのパラメータとして適切なものがどれかわからないという形で、
GUIで作成したあとに、Former2で抽出すると手間が省けるなと思います。

ユーザデータをもう少し一度ですべて動かせるといいのですが、力及ばず残念でした。