AWS CloudFormation | Former2 で既存リソースを CloudFormation テンプレート化しよう

既存 AWS リソース。。コード化したくないですか!?
これまでマネジメントコンソールでポチポチで作成してきた AWS リソースたち。。
色々な思い出が詰まった AWS リソースたち。。そろそろ管理大変だよ。。
エンジニアの横田です。ぶつぶつ言っても仕方ないので、本ブログでは既存 AWS リソースを CloudFormation のテンプレートに出力してみたいと思います。
目次
AWS CloudFormation | Former2 とは?
Former2 とは、既存AWSリソースをスキャンし、CloudFormationやTerraform等のテンプレートを出力するオープンソースソフトウェアです。詳しくは公式サイト[*1]をご確認ください。
CloudFormation って何?って方は こちら のブログ記事をご参照ください。
AWS CloudFormation | Former2 を使う準備
Former2 の公式サイト[*1]からでも利用はできるのですが、AWS の認証情報を入力する必要があります。外部サイトに認証情報を入力しておくのは少々抵抗があるので Docker でローカルにホストし、認証情報も一定時間で無効化されるようにしておこうと思います。
GitHub でリポジトリが公開されているのでクローンします。[*2]
1 2 3 4 5 6 7 8 | $ git clone https://github.com/iann0036/former2.git Cloning into 'former2'... remote: Enumerating objects: 12277, done. remote: Counting objects: 100% (1688/1688), done. remote: Compressing objects: 100% (450/450), done. remote: Total 12277 (delta 1297), reused 1443 (delta 1231), pack-reused 10589 Receiving objects: 100% (12277/12277), 64.55 MiB | 4.94 MiB/s, done. Resolving deltas: 100% (5798/5798), done. |
コンテナが127.0.0.1:8080で起動するよう docker-compose.yml を編集します。
1 2 | $ cd former2 $ vi docker-compose.yml |
docker-compose.yml
1 2 3 4 5 6 7 8 9 | version: '3' 2 services: 3 former2: 4 image: nginx:stable-alpine 5 ports: 6 - "127.0.0.1:8080:80" 7 volumes: 8 - .:/usr/share/nginx/html 9 |
コンテナを起動します。
01 02 03 04 05 06 07 08 09 10 11 12 13 | $ docker-compose up -d Creating network "former2_default" with the default driver Pulling former2 (nginx:stable-alpine)... stable-alpine: Pulling from library/nginx 9b18e9b68314: Pull complete e78d13e7546a: Pull complete 404fe4e73af4: Pull complete 341b0b8c46a1: Pull complete d642a3b33566: Pull complete e80328dec171: Pull complete Digest: sha256:d24e098389beed466ea300d5473cdda939bf6e91a93873d0fd1dd18e138c2f13 Status: Downloaded newer image for nginx:stable-alpine Creating former2_former2_1 ... done |
起動できました!
起動した状態でお使いのブラウザのアドレスバーに「127.0.0.1:8080」と入力・押下すると Former2 のサービス画面が表示されます。

次に Former2 で使用する IAM ロールを作成します。
IAM ロールを作成できる権限を持ったユーザーで AWS マネジメントコンソールにログインし、「IAM > ロール > ロールを作成」 と押下していきます。
信頼されたエンティティタイプは「AWS アカウント」を指定し、Former2 でテンプレート化したいAWS リソースが存在するアカウントを入力後、[次へ]を押下します。

許可ポリシーには「ReadOnlyAccess」を指定します。
制限がさらに必要な方は、テンプレート化するAWSリソースの読み取り権限のみを選択してください。

ロールの名前を決めてあげて、作成しましょう。

IAM ロールの用意が完了したので、Former2 に認証情報を入力します。
CloudShell を起動し、一時的なセキュリティ認証情報を用意します。
出力される各種情報をメモしておいてください。

01 02 03 04 05 06 07 08 09 10 11 12 13 | [cloudshell-user@ip-10-0-95-51 ~]$ aws sts assume-role --role-arn arn:aws:iam::【アカウントID】:role/【作成したロール名】 --role-session-name "【お好きなセッション名】" { "Credentials": { "AccessKeyId": "xxxxxxxxxxxxxxxxxxxxx", "SecretAccessKey": "xxxxxxxxxxxxxxxxxxxxx", "SessionToken": "xxxxxxxxxxxxxxxxxxxxx", "Expiration": "yyyy-MM-ddThh:mm:ss+00:00" }, "AssumedRoleUser": { "AssumedRoleId": "xxxxxxxxxxxxxxxxxxxxx:SessionForFormer2", "Arn": "arn:aws:sts::【アカウントID】:assumed-role/【作成したロール名】/【お好きなセッション名】" } } |
用意したセキュリティ認証情報を Former2 に登録します。
「http://127.0.0.1:8080/」へアクセスします。

①の Indroduction は S3 や IAM 等の CORS 欠如を回避するために必要な設定となりますが、今回はスキップします。必要に応じてお使いのブラウザの拡張機能をインストールください。
②の Credentials に先程メモしたセキュリティ認証情報を入力します。

赤枠内を入力し、[Continue to Parameters]を押下ください。

③ Parameters と④Setting はデフォルトのまま進めます。


④Setting の[Go to Dashboard]を押下すると、ダッシュボード画面に移動します。
これで準備は完了です!

AWS CloudFormation | Former2 を使ってみよう
それでは早速既存リソースを CloudFormation テンプレートとして出力してみましょう。
今回は こちら のブログ記事で作成した AWS リソースをテンプレート化します。
画面右上のプルダウンリストから対象のリソースが存在するリージョンを指定し、[Scan Account]を押下します。
※エラーがいくつか表示されますが、前述の拡張機能をインストールしていないためです。

出力したい AWS リソースを選択し、[⊕ Add Selected]を押下していきます。

すべて押下し終えたら、画面左上の[Generate (n)]を押下します。

Outputs として、CloudFormation のテンプレートが出力されますので、former2_vpc.yml として[Import]します。

former2_vpc.yml
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | AWSTemplateFormatVersion: "2010-09-09" Metadata: Generator: "former2" Description: "" Resources: EC2VPC: Type: "AWS::EC2::VPC" Properties: CidrBlock: "10.0.0.0/16" EnableDnsSupport: true EnableDnsHostnames: true InstanceTenancy: "default" Tags: - Key: "Name" Value: "vpc_cloud_link" EC2Subnet: Type: "AWS::EC2::Subnet" Properties: AvailabilityZone: !Sub "${AWS::Region}a" CidrBlock: "10.0.0.0/24" VpcId: !Ref EC2VPC MapPublicIpOnLaunch: false Tags: - Key: "Name" Value: "subnet_cloud_link" EC2RouteTable: Type: "AWS::EC2::RouteTable" Properties: VpcId: !Ref EC2VPC Tags: - Key: "Name" Value: "cloud_link_rtb" EC2SubnetRouteTableAssociation: Type: "AWS::EC2::SubnetRouteTableAssociation" Properties: RouteTableId: !Ref EC2RouteTable SubnetId: !Ref EC2Subnet |
Import したテンプレートファイルで CloudFormation を実行してみます。
01 02 03 04 05 06 07 08 09 10 11 | $ rain deploy former2_vpc.yml CloudFormation will make the following changes: Stack former2-vpc: + AWS::EC2::RouteTable EC2RouteTable + AWS::EC2::SubnetRouteTableAssociation EC2SubnetRouteTableAssociation + AWS::EC2::Subnet EC2Subnet + AWS::EC2::VPC EC2VPC Do you wish to continue? (Y/n) Deploying template 'former2_vpc.yml' as stack 'former2-vpc' in ap-northeast-1. Stack former2-vpc: CREATE_COMPLETE Successfully deployed former2-vpc |
作成が完了しました!
(rain コマンドについては こちら のブログをご参照ください。)
AWS CloudFormation | Former2(まとめ)
いかがでしたでしょうか?
想像以上に簡単に既存 AWS リソースが CloudFormation テンプレート化されることを実感いただけたのではないでしょうか?
実際に画面をさわった方はお気づきかと思いますが、CloudFormation 以外にも Terraform や CDK のテンプレートファイルとしても出力できますのでぜひお試しください!
今回は作成した CloudFormation テンプレートでエラーは発生しませんでしたが、場合によっては必須パラメータの欠如やその他細かいエラーによってリソースの作成に失敗することがあります。
「Former2でテンプレート化したから大丈夫!」ではなく、毎回出力内容を確認し、必要に応じて微調整してください。
とはいえ、便利なツールであることに変わりはないので Former2 を有効活用していきましょう!
CloudFormation に限らず、「AWS でこんなことできないかな?」「自社サーバーを AWS に引っ越したいな。」等々ございましたら、右上の[お問い合わせ]からお気軽にご相談ください。
AWS CloudFormation | Former2(ご参考)
*1 「Former2」
*2「iann0036/former2」
https://github.com/iann0036/former2
【筆者実行環境】
PC:MacBook Air (M1, 2020)
OS:macOS Monterey 12.6
aws cli :aws-cli/2.2.44 Python/3.8.8 Darwin/21.5.0 exe/x86_64 prompt/off
Docker:version 20.10.16
docker-compose:version 1.29.2
Rain:Rain v1.2.0 darwin/arm64

元記事発行日: 2022年12月26日、最終更新日: 2023年11月09日