ブログ

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]

$ 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 を編集します。

$ cd former2
$ vi docker-compose.yml

docker-compose.yml

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

コンテナを起動します。

$ 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 を起動し、一時的なセキュリティ認証情報を用意します。
出力される各種情報をメモしておいてください。

[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

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 を実行してみます。

$ 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」

https://former2.com/

*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日