クラウド事業部 インフラエンジニアの吉岡です。
1月にJANOG45 ミーティングというイベントに行った際に、Console Recorder for AWS という拡張機能のことを知り、実際に使ってみましたので、ご紹介いたします。
目次
Console Recorder for AWSとは?
AWSのコンソール画面での操作を記録し、コードとして出力することができる拡張機能です。
Crome,Firefoxで利用でき、 Boto3, CloudFormation, Terraform, AWS CLI(v1)など、複数の形式で出力することができます。
※すべての操作が記録できるわけではありません
Console Recorder for AWSの起動・停止
利用する際は、拡張機能を起動し、コンソール操作の開始前に、「Start Recording」, 操作の完了後に「Stop Recording」を実行するだけです。
「Stop Recording」を実行すると、新しいタブが開き、下記の様に記録した操作の再現コードが出力されます。
今回は操作の前に、拡張機能の「Go To Dashboard」⇒「Settings」内の「Intercept Responses」にチェックを入れておきます。
このチェックが入っている場合は、各操作でリソース間の関連付けが行われます。 テンプレートとして利用する場合、各idが直接指定されている状態では修正が必要になってしまうため、関連付けを行う設定にしておきます。
例として、VPCを作成⇒サブネットを作成を行った場合に下記の様に出力が異なります。
vpc_id = “vpc-XXXXXXXXXXXXXXXXX” #チェックを付けない場合
vpc_id = “${aws_vpc.ec2XXXXXXX.id}” #チェックを付けた場合
操作後に、「Settings」内の「Recorded Data」から記録を削除できます。
※記録は上書きではなく追記されるため、削除は手動で行う必要があります。
出力されたコードと、修正後のコード
今回はVPCの作成から始め、ルートテーブルを設定し、パブリックサブネットにインスタンスを1台起動、自分のIPから全ての接続を許可するセキュリティグループを設定する。という操作を行い、出力されたコードを元にterraformのテンプレートを作成してみます。
出力されたコードは下記の通りとなります。
1# 操作後の出力
2#id等は書き換えています。
3
4provider "aws" {
5 region = "ap-northeast-1"
6}
7
8resource "aws_vpc" "ec2aaaaaaa" {
9 cidr_block = "10.0.0.0/16"
10}
11
12resource "aws_subnet" "ec2bbbbbbb" {
13 vpc_id = "${aws_vpc.ec2aaaaaaa.id}"
14 cidr_block = "10.0.0.0/24"
15 availability_zone = "ap-northeast-1a"
16}
17
18resource "aws_internet_gateway" "ec2ccccccc" {
19}
20
21resource "aws_route_table" "ec2ddddddd" {
22 vpc_id = "${aws_vpc.ec2aaaaaaa.id}"
23}
24
25resource "aws_route" "ec2eeeeeee" {
26 route_table_id = "rtb-XXXXXXXXXXXXXXXXX"
27 destination_cidr_block = "0.0.0.0/0"
28 gateway_id = "${aws_internet_gateway.ec2ccccccc.id}"
29}
30
31resource "aws_network_interface" "ec2fffffff" {
32 subnet_id = "${aws_subnet.ec2bbbbbbb.id}"
33 description = "Primary network interface"
34 security_groups = [
35 "sg-XXXXXXXXXXXXXXXXX",
36 "sg-XXXXXXXXXXXXXXXXX"
37 ]
38}
39
40resource "aws_instance" "ec2ggggggg" {
41 ami = "ami-XXXXXXXXXXXXXXXXX"
42 key_name = "Mykey"
43 instance_type = "t2.micro"
44 tenancy = "default"
45 monitoring = false
46 disable_api_termination = false
47 instance_initiated_shutdown_behavior = "stop"
48 credit_specification {
49 cpu_credits = "standard"
50 }
51
52 tags {
53 Name = "record-ec2"
54 }
55
56 ebs_optimized = false
57 root_block_device {
58 volume_type = "gp2"
59 volume_size = 8
60 }
61
62 network_interface {
63 device_index = 0
64 network_interface_id = "${aws_network_interface.ec2XXXXXXX.id}"
65 delete_on_termination = true
66 }
67
68}
コンソールで行った操作を再現するコードが出力されましたが、このままのコードを利用してもエラーが出てしまいますので、修正を加えます。
- terraformのバージョンが異なるため、○○= “${XX.YY.id}”を○○=XX.YY.idに書き換え
- 同じ理由でtags {} をtags={}に書き換え
- AWSのアクセスキー、シークレットキーを作成、変数ファイル(terraform.tfvars)に記載し読み込むように設定
- インターネットゲートウェイの作成時にVPCのidを指定
- ルートテーブルの作成とルール設定を一括で行う
- ルートテーブルをサブネットに関連付け
- セキュリティグループを作成
- ネットワークインターフェースの作成処理を削除
- インスタンス作成時にセキュリティグループ、サブネット、パブリックIPの自動割り当ての有効化
修正後のコードは下記の通りとなります。
1#変数の宣言
2variable "aws_access_key" {}
3variable "aws_secret_key" {}
4
5
6#アクセスキーとシークレットキーの情報を追加
7provider "aws" {
8 access_key = var.aws_access_key
9 secret_key = var.aws_secret_key
10 region = "ap-northeast-1"
11}
12
13#変更なし
14resource "aws_vpc" "ec2aaaaaaa" {
15 cidr_block = "10.0.0.0/16"
16}
17
18#変更なし
19resource "aws_subnet" "ec2bbbbbbb" {
20 vpc_id = aws_vpc.ec2aaaaaaa.id
21 cidr_block = "10.0.0.0/24"
22 availability_zone = "ap-northeast-1a"
23}
24
25#VPCidを指定して作成する。
26#VPCへのアタッチ操作が記録されてないため
27resource "aws_internet_gateway" "ec2ccccccc" {
28 vpc_id = aws_vpc.ec2aaaaaaa.id
29}
30
31#ルートテーブルとルートの作成処理を一つにまとめる
32resource "aws_route_table" "ec2ddddddd" {
33 vpc_id = aws_vpc.ec2aaaaaaa.id
34
35 route {
36 cidr_block = "0.0.0.0/0"
37 gateway_id = aws_internet_gateway.ec2ccccccc.id
38 }
39}
40
41#ルートテーブルをサブネットに関連付け
42#操作が記録されないため追加
43resource "aws_route_table_association" "ec2yyyyyyy" {
44 subnet_id = aws_subnet.ec2bbbbbbb.id
45 route_table_id = aws_route_table.ec2ddddddd.id
46}
47
48#デフォルトセキュリティグループを作成
49resource "aws_default_security_group" "default" {
50 vpc_id = aws_vpc.ec2aaaaaaa.id
51
52 ingress {
53 protocol = -1
54 self = true
55 from_port = 0
56 to_port = 0
57 }
58 egress {
59 from_port = 0
60 to_port = 0
61 protocol = "-1"
62 cidr_blocks = ["0.0.0.0/0"]
63 }
64
65}
66
67#セキュリティグループを作成
68#操作が記録されないため追加
69resource "aws_security_group" "ec2zzzzzzz" {
70 name = "record-SG"
71 vpc_id = aws_vpc.ec2aaaaaaa.id
72 ingress {
73 from_port = 0
74 to_port = 0
75 protocol = "tcp"
76 cidr_blocks = ["210.171.136.254/32"]
77 }
78 egress {
79 from_port = 0
80 to_port = 0
81 protocol = "-1"
82 cidr_blocks = ["0.0.0.0/0"]
83 }
84}
85
86#インスタンス起動時に作成されるため、ネットワークインターフェースの作成は不要
87
88#インスタンス作成時にセキュリティグループの指定・サブネットの指定処理・パブリックIPの付与を追加
89#操作が記録されないため
90resource "aws_instance" "ec2ggggggg" {
91 ami = "ami-XXXXXXXXXXXXXXXXX"
92 key_name = "MYkey"
93 instance_type = "t2.micro"
94 tenancy = "default"
95 monitoring = false
96 disable_api_termination = false
97 instance_initiated_shutdown_behavior = "stop"
98 vpc_security_group_ids = [
99 aws_default_security_group.default.id,
100 aws_security_group.ec2zzzzzzz.id
101 ]
102 subnet_id = aws_subnet.ec2bbbbbbb.id
103 associate_public_ip_address = true
104 credit_specification {
105 cpu_credits = "standard"
106 }
107
108 tags = {
109 Name = "record-ec2"
110 }
111
112 ebs_optimized = false
113 root_block_device {
114 volume_type = "gp2"
115 volume_size = 8
116 }
117
118}
119
120
上記のコード内にコメントで記載しているように、拡張機能により出力されたコードからの変更点は結構ありましたが、terraformで構成用のファイルを作成したことがなかった私でも、VPCの作成からインスタンスの起動までを行うテンプレートファイルを作成することができました。
まとめ
今回は、VPCの作成~インスタンス起動までの操作を一度に出力したため、記録が取れていない部分の調整に手間取ってしまいました。
記録が取れない操作のことを考えると、テンプレートを1から作成するために利用するというよりも、テンプレートに新しい処理を追加するときの補助や、メインに使う形がよさそうですね。