
CloudFormationを使用したEC2インスタンスの作成手順
こんにちは。新入社員の田島です。
皆さんはAWS環境でインフラを構築する際、恐らくコンソールから手作業で行うことが多いでしょう。しかし、こういった手作業に設定ミスや抜け漏れはつきものです。大規模であるほどその作業の煩雑さは倍増し、作業効率も落ちてしまいます。
そんなときに便利なのが、AWSのリソースをコードで定義し、自動でまとめて構築・管理できるサービス、AWS CloudFormationです。
今回はCloudFormationを使って最低限のEC2インスタンスを作成する手順についてまとめて行こうと思います。
EC2インスタンスの作成自体は簡単なものですが、これを基礎としてCloudFormationを使ったリソースの構築に役立てていただければと思います。
【目次】
①CloudFormationとは
②テンプレートの作成
③スタック作成ステップ
④確認
①CloudFormationとは
AWS CloudFormationは、AWSリソースをコードで定義・管理するためのInfrastructure as Code(IaC)サービスです。
これにより、S3バケットやEC2インスタンス、VPCなどのAWSリソースを一貫性のある方法でプロビジョニングできます。
テンプレート(YAMLまたはJSON形式)を用いて、構成情報を定義しCloudFormationスタックとしてデプロイすることで、インフラの自動化が可能になり、再現性も高まります。
例えば、本番環境とテスト環境で全く同じリソース構成を高速かつ確実に複製したいときや、繰り返し同じリソースをデプロイする必要があるときに効果的です。
また、テンプレートはバージョン管理(Gitなど)と相性が良く、コードとして変更履歴を残すことも可能です。
AWS CDK(Cloud Development Kit)との違いは?
AWSリソースの構築を効率的に行うと聞いて、AWS CDKを思い浮かべた方もいるでしょう。ここではCDKとの違いに触れ、そこからCloudFormationの意義について考えます。
一言でいうと、CloudFormationとCDKは、”記述スタイル”が異なります。
AWS CDKは、主要なプログラミング言語(JavaScript, Python, Java, C# etc...)を使ってリソースの構築が可能です。そのため習得済みの言語を使用してスムーズに記述でき、新たに記述言語を学ぶ必要はありません。
また動的な構成を自由に記述できるため、複雑な構成も可能です。
一方、CloudFormationは後述しますがJSONかYMAL形式を使ってテンプレートを記述することが出来ます。構成を静的に宣言するためCDK程の複雑な構成は出来ずとも、明示性・可読性が比較的高くなります。
CDKならプログラミングの経験者にとっては、慣れた言語で容易に構成できますが、プログラミング言語よりも明示性高く構築できるCloudformationが好ましい点もあるでしょう。
②テンプレートの作成
まずは、テンプレートファイルを作ることから始まります。テンプレートとは、AWS上に作成したいリソース(例:EC2インスタンス、S3バケット、VPCなど)の構成を定義した設計図のようなものです。
このテンプレートを使って、CloudFormationで必要なリソースを一気に構築することが可能になります。
テンプレートを一度作成してしまえば、それを元にインフラの自動構築、再現(再デプロイ)、変更の適用(更新)などを容易に行うことができます。
テンプレートは「.yaml」か「.json」のどちらかで作成します。どちらでも構いませんが、ほとんどのケースでYAML形式の方が読みやすく、書きやすいためおすすめです。
以下は今回作成するシンプルなEC2インスタンスのテンプレートです。 EC2インスタンスを作成し、SSH接続が出来るようにします。
AWSTemplateFormatVersion: "2010-09-09"
Description: Create a simple EC2 instance with SSH access
Parameters:
KeyName:
Description: Name of an existing EC2 KeyPair to SSH into the instance
Type: AWS::EC2::KeyPair::KeyName
Resources:
EC2Instance:
Type: AWS::EC2::Instance
Properties:
InstanceType: t2.micro
ImageId: ami-004935a1983dccece
KeyName: !Ref KeyName
SecurityGroups:
- !Ref InstanceSecurityGroup
Tags:
- Key: Name
Value: blog-test1
InstanceSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Allow SSH access from anywhere
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 0.0.0.0/0
・AWSTemplateFormatVersion
テンプレートの形式バージョンを記載します。現在は常に“2010-09-09”を指定します。
・Description
テンプレートの説明文です。目的や用途を簡潔に書いておきます。
AWSTemplateFormatVersion: "2010-09-09"
Description: Create a simple EC2 instance with SSH access
・Parameters
Parametersセクションでは、スタック作成時にユーザーから入力を受け取る設定ができます。ここではEC2インスタンスへSSH接続するためのキーペア名をユーザーに指定してもらうようにしています。
「Type: AWS::EC2::KeyPair::KeyName」によって、スタック作成時に既存のキーペアを選択することになります。キーペアが無ければスタックの作成時までに作っておきます。
Parameters:
KeyName:
Description: Name of an existing EC2 KeyPair to SSH into the instance
Type: AWS::EC2::KeyPair::KeyName
・Resources
CloudFormationで重要な部分です。このテンプレートではEC2インスタンスと、そのためのセキュリティグループを定義しています。
「Type」には構築するリソースを書き込みます。構築したいリソースによって書き換えます。
リソース
|
入力コード
|
EC2インスタンス
|
Type: AWS::WC2::Instance
|
S3バケット
|
Type: AWS::S3::Bucket
|
Lambda関数
|
Type: AWS::Lambda::Function
|
RDBデータベース
|
Type: AWS::RDS::DBInstance
|
「ImageId」には構築するリージョンで有効なAMI IDを入力し、「InstanceType」は選択したAMI IDに対応しているインスタンスタイプを選んで書き込みます。
仮に対応していないインスタンスタイプを選択するとスタックの作成時にエラーとなり、リソースが作成されません。
AWSマネジメントコンソールでAMIのアーキテクチャを確認する際には以下の手順で行います。 1.マネジメントコンソールにログインし、リージョンを選択。 2.EC2を開き左のメニューからAMIを選択。 3.確認したいAMIを選択し詳細欄の「アーキテクチャ」を確認。 4.「arm64」ならt4g.* , c6g.* , m8g.* 等が対応。 「x86_64」ならt2.* , t3.* , m5.* , c5.* 等が対応 |
KeyNameセクションでSSHで接続する際のキーペア名を設定します。今回は!Ref KeyNameによって、Parametersを参照するように設定しています。
SecurityGroupsセクションでセキュリティグループを設定します。
今回のようにインスタンスと同時にセキュリティグループを作成する場合は、
!Ref InstanceSecurityGroup によってテンプレート内で定義したセキュリティグループを参照します。
既存のセキュリティグループを使用する際は、SecurityGroupsではなくSecurityGroupIdsを使って、グループのID(例:sg-xxxxxxxx)を直接指定する必要があります。
TagsセクションでEC2インスタンスにタグを付けます。NameタグのValueには作成するインスタンスの名前(ここでは"blog-test1")を入力します。これによりインスタンスを識別しやすくします。
Resources:
EC2Instance:
Type: AWS::EC2::Instance
Properties:
InstanceType: t2.micro
ImageId: ami-004935a1983dccece
KeyName: !Ref KeyName
SecurityGroups:
- !Ref InstanceSecurityGroup
Tags:
- Key: Name
Value: blog-test1
・InstanceSecurityGroup
新たにセキュリティグループを作る際は、以下のように同じテンプレート内に記述します。
これによりセキュリティグループがインスタンスとともに作成されます。
今回はブログ用に作成しているため22番ポートをフルオープンにしていますが、実際に利用する際には、フルオープンにせず状況に応じて設定してください。
InstanceSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Allow SSH access from anywhere
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 0.0.0.0/0
③作成ステップ
まず画面左のメニューから「スタック」を選択し、「スタックの作成」をクリックします。
ステップ1
前提条件-テンプレートの準備で、今回のように作成したテンプレートを使用する場合は、「既存のテンプレートを使用」を選択します。
Infrastructure Composerを使って作成する方法もありますが、今回は割愛します。
そのまま下に行き、「テンプレートファイルのアップロード」を選択してファイルをアップロードします。
ステップ2
スタック名に使用したい名前を入力します。今回は「test-stack」にします。
「KeyName」で使用したいキーペアを選択します。こちらは事前にマネジメントコンソール等で作成しておく必要があります。
ステップ3
スタックオプションの設定では、タグの追加やスタックの失敗オプション等の各種詳細設定が可能です。必要に応じて設定してください。
ステップ4
ここまでのスタック作成過程での設定を確認できます。
確認が完了したら送信をクリックして、スタックの完成です。スタック一覧から問題なく作成できているか確認しましょう。
問題なければ送信を押して完了です。スタックが作成されると自動的にリソースの作成も開始します。
「ステータス」がCREATE_COMPLETEになっていれば成功です。
ROLLBACK_*やFAILEDになっている場合はスタックを選択し、「イベント」タブから原因を特定できます。
④確認
CloudFormationでスタックの作成が成功したことを確認し、次はEC2インスタンスが作成できているかを確認します。
AWSマネジメントコンソールから「EC2」に移動し、左のメニューで「インスタンス」をタブを開きます。
先ほど作成したインスタンス(ここではblog-test1)が「実行中」になっていれば正常に作成されています。
SSH接続のため「パブリックIP」が割り当てられているかを確認しましょう。
作成したインスタンスにSSH接続できるかも実際に試してみてください。
LinuxやMacOS環境、もしくはWindowsのPowerShellからであれば以下のコマンドで確認できます。
ssh -i my-key.pem ec2-user@<パブリックIPアドレス>
「my-key.pem」には作成時に指定したキーペアの秘密鍵ファイルを、「パブリックIPアドレス」はEC2の詳細画面から確認して入力します。
上手く作成できたことを確認した後は、無駄なコストが発生しないようEC2インスタンスを停止しておきましょう。
またCloudFormationのスタックを削除するとそのスタックで作成したリソースを一括削除することも可能です。
まとめ
以上が、AWS CloudFormationを使用したEC2インスタンスの作成手順です。
大規模なインフラ構築においてこそ、CloudFormation はその真価を発揮します。しかし規模が大きいほどインフラの構築のためにコードを書くのは大変なものになるでしょう。
しかし近年の発達した生成AIを使えば、生成AIが直接にインフラを構築することは出来ずとも、テンプレートをある程度作成させることは出来ます。
またテンプレートの作成をInfrastructure Composerで行えば、視覚的に分かりやすく作成することも可能です。
今回のような簡単な構成であればCloudFormationを使うまでもないですが、大規模な構成を作成する際には是非CloudFormationを利用してみてください。