IaCが簡単に! AWS Console-to-Code
投稿日: 2024/03/18
はじめに
こんにちは、高橋です。
皆さんはIaCという言葉をご存じでしょうか?数年前から出回っている用語ですのでご存じの方は多いとは思いますが、IaCはInfrastructure as Codeの略で、言葉の通りサーバ、ストレージ、ネットワークなどのインフラのコードを用いて自動的に構築する手法で、オンプレの仮想化の時代の頃から実現可能で一部の方々で利用されていましたが、全てのリソースを構成可能なクラウド環境でその真価が発揮できる技術と言えます。IaCのメリットとしては下記が上げられます。
- インフラ構築時間を大幅に短縮できる
- 人の手が介在しないため、設定時のミスがなくなる
- インフラがコードで記述されているため、同じ環境を簡単に構築できる
AWSではCloudFormationを用いてIaCを実現することができますが、課題が存在します。それは当然のことながら、実現したい構成をコード化しなければならず、そこには高いプログラミング技術が必要である点です。そこに昨年のAWS re:Invent2023にてこの問題を将来的に解決してくれるAWS Console-to-Codeが発表されました。今回はこのAWS Console-to-Codeを深堀して行きます。
1.AWS Console-to-Codeとは?
AWS Console-to-CodeはAWSコンソールにて行われた操作をコード化してくれる機能です。AWS Console-to-Codeは2024/3時点でプレビュー版としてバージニアリージョンでしか使用できませんが、AWSコンソール上で実行された結果を記録し、サンプルコードを出力してくれます。現在提供される言語は以下のものとなります。
- CDK (Java, Python, TypeScript)
- CloudFormation (JSON, YAML)
- AWS CLI
対応している操作は現時点ではEC2に対する操作のみとなっていますが、将来的には拡張され、AWSのさまざまなサービスに対応していくことが予想されます。
2.操作のコード化
ここからは実際にEC2を操作してサンプルコードを取得してみます。
それを行うためにはまず実際に操作を行う必要があります。今回は以下の内容で1台EC2インスタンスを作成します。
インスタンスタイプ:t2.micro
キーペア:既存を使用
ネットワーク設定:デフォルトVPCのus-east-1a
パブリックIPの自動割り当て:無効
セキュリティグループ:既存を使用(default)
ストレージ:8GB
インスタンスが作成されたら、コンソールのECの画面の左のメニューから「Console-to-Code」を選択します。

操作はAPI単位で出力され、その中からコード化したい操作を選択しなければなりません。今回はインスタンスの作成ですので、Runinstancesを選択し、右上のプルダウンメニューから「YAMLコードの生成」を選択します。

すると画面が遷移し、今回の操作のAWS CLIのコマンドとサンプルコードが生成されます。

上記の画面でダウンロードをクリックすると、YAMLファイルがダウンロードできました。
Resources:
EC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-0440d3b780d96b29d
InstanceType: t2.micro
KeyName: virginia_key
NetworkInterfaces:
- AssociatePublicIpAddress: false
DeviceIndex: 0
GroupSet:
- sg-XXXXXXXX
SubnetId: subnet-XXXXXXXX
TagSpecifications:
- ResourceType: instance
Tags:
- Key: Name
Value: sample01
MetadataOptions:
HttpTokens: required
HttpEndpoint: enabled
HttpPutResponseHopLimit: 2
PrivateDnsNameOptions:
HostnameType: ip-name
EnableResourceNameDnsARecord: false
EnableResourceNameDnsAAAARecord: false
UserData:
Fn::Base64: !Sub |
コードの中には先程作成したインスタンスの情報はそのまま記載されており、こちらで指定していない、メタデータオプション等も記載されています。リージョンに関する情報は記載されていないので、セキュリティグループ、サブネット、keypairの値を変更すればどのリージョンでも使用できそうですし、これらをパラーメータに置き換えればコードとして利用できるかと思います。
3.コードのデプロイ
先程ダウンロードしたコードでkeypair、セキュリティグループ、サブネットを東京リージョンのものに変更し、Nameタグの値も変更してローカルに保存しておきます。
これを使用してEC2を作成するにはCloudFormationの画面に移動し、「新しいリソースを使用(標準)」をクリックします。

次に「テンプレートファイルのアップロード」を選択し、テンプレートファイルのアップロードから先程作成したサンプルファイルを編集したものを選択して、次へ進みます。

任意のスタック名を入力し、次に進みます。

あとは全てデフォルトで実行するとEC2インスタンスが作成されると思ったのですが、下記の通り失敗してしまいました。

エラーメッセージから「TagSpecification」がサポートされていないということが分かりますが、調べてみると確かに「AWS::EC2::Instance」では「TagSpecification」はサポートされていないようです。
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-instance.html
他にも「MetadataOptions」がサポートされていないので、下記のように修正したらEC2のデプロイに成功しました。
Resources:
EC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-0440d3b780d96b29d
InstanceType: t2.micro
KeyName: testenvkey
NetworkInterfaces:
- AssociatePublicIpAddress: false
DeviceIndex: 0
GroupSet:
- sg-XXXXXXXX
SubnetId: subnet-XXXXXXXX
Tags:
- Key: "Name"
Value: "cocdtest"
PrivateDnsNameOptions:
HostnameType: ip-name
EnableResourceNameDnsARecord: false
EnableResourceNameDnsAAAARecord: false
UserData:
Fn::Base64: !Sub |

また、他のリージョンに展開しようとしましたが、その場合AMIがないとエラーとなったため、他のリージョンで使用したい場合は、AMIの値も変更する必要があるようです。
4.さいごに
コードを書くのに苦労している私はこの機能を見つけたとき、だいぶ労力が減るなと非常に喜ばしく思いました。今回試してみると確かに操作をそのままコードとして落とすことができたので、その効果は十分実感できたと思います。確かに、現状ではEC2しか対応しておらず、また生成されたコートの一部に不備はありましたが、まだプレビュー版ということもあり、今後正式版に移行していく中でこういった不具合の修正や対応サービスの拡張は期待できる機能ですので、正式版のリリースを楽しみに待ちたいと思います。
CTCは、AWSのビジネス利活用に向けて、お客様のステージに合わせた幅広い構築・運用支援サービスを提供しています。
経験豊富なエンジニアが、ワンストップかつ柔軟にご支援します。
ぜひ、お気軽にお問い合わせください。