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