AWS CloudFormationを使ってはじめてのIaC実践という事で引き続き前回からの続きとなります。
目標としてはAWSアカウントを取得したゼロの状態から、IaCでVPCやRole、SecurotyGroupなどの最低限のリソースを作成して、EC2インスタンスを作成するというところまで実行するということにしています。
前回(第3回)はこちら
https://syachiku.net/awscloudformationiac3-sg/
AWSのCloudFormationでIaCを実践してみる(すべての記事一覧)
第1回 – VPC https://syachiku.net/awscloudformationiac1-vpc/
第2回 – Role https://syachiku.net/awscloudformationiac2-iam-role/
第3回 – SecurityGroup https://syachiku.net/awscloudformationiac3-sg/
第4回 – EC2 https://syachiku.net/awscloudformationiac4-ec2/
第5回 – VPC FlowLogs https://syachiku.net/awscloudformationiac5-flowlogs/
第6回 – CloudTrail https://syachiku.net/awscloudformationiac6-trail/
第7回 – R53 HostedZone https://syachiku.net/awscloudformationiac7-r53-hosted/
今回はいよいよこれまでに作成したVPCやRole、SecurityGroupなどのリソースを使って
EC2インスタンス作成を行ってみたいと思います。
※ec2インスタンスについては利用料金が発生する可能性がありますので、自分の環境を確認しながら実施ください。あくまで自己責任でお願いします。
1. 前提条件
- AWSアカウントが取得できていること
- 適切な権限(=Admin相当)をもったIAMユーザーを作成していること
- ルーティングなどの最低限のネットワークの知識があること
- YAMLの書きかたを知っていること(CloudFormationはjsonもしくはyamlで書けますが、今回はyamlで書いていきます。)
- AWSのIAMやRoleについて最低限の知識があること
2. 今回作成するAWS環境
まずはEC2に紐づけるKeypairを作成します。
これはマネージメントコンソールから手動で作成します。
その後、AmazonLinuxのec2インスタンスを作成するCloudFormation Templateを書きます。
これまでに作成してきたProfileやSecurityGroupなどを幾つか紐づけしながらec2をpublicサブネットに作成します。
最終的にsshとSSMのセッションマネージャでログオンできることを確認します。
- Keypair
- ec2インスタンス(AmazonLinux)
3. 構成図

4. Keypairの作成
まずはKeyPairを用意します。KeypairはEC2インスタンスにsshなどで接続するために必要な鍵の事です。
EC2のページから左側のキーペアを選択して「キーペアを作成」をクリックします。

適当な名前を付けてキーペアを作成します。この時に秘密鍵のファイル(aws-infra-keypair.pem)のダウンロードが実施されます。このファイルは大切に保存してください。

5. CloudFormation Template
では、実際のEC2インスタンスを作成するTemplateを作っていきます。
以下のgithub上に保管していますので参照ください。
https://github.com/gogoloon/aws-cfn-setup/tree/aws-infra-03
今回は少し補足します。
EC2インスタンスを作成する際に、ベースとなるAMIの指定が必要です。今回はAmazon Linuxの最新のAMIをベースにしています。
手動でEC2を作成すると一番最初に表示される以下の画面から確認できます。

6. スタックの作成
それでは先ほど作成したコードを使って、リソースを作成していきます。
マネージメントコンソールにログオンして、リージョンを大阪に切り替えたのち、CloudFormationを開きます。
「スタックの作成」→「新しいリソースを使用」を選択します。
「テンプレートファイルをアップロード」からコードのファイルを選択してアップします。
スタックの名称やネットワーク設定値を入力(デフォルトから変更したい場合には変更してください)してスタックの作成まで進めます。
あとは適切にパラメータファイルを指定していきます。

※このコードだと少しベタ打ちの部分が多いので後日に改善したいと思っています
7. 作成されたリソースの確認
しばらくするとステータスが「CREATE_COMPLETE」となりスタック作成が完了します。

それでは作成されたリソースを確認してみます。
7.1. ec2インスタンス
正常にEC2インスタンスが作成されていることが確認できます。
PublicIPも正しく付与されています。

8. ec2インスタンスへの接続での確認
8.1. sshでの接続
パブリックIPをメモしてSSHで接続してみます。まずTeratermです。
ユーザ名をec2-userと指定して、先ほどのkeypairのpemファイルを指定して接続してください。


こちらはRLogonでの画面です。設定値は同じです。

無事にログオンができれば接続完了です。

8.2. ssmセッションマネージャでの接続
インターネット上に「sshアクセス可能な穴」があることは確認できましたが、認証が必要とはいえ、セキュリティ的には閉じておきたいです。
そこで、第2回で作成していたRoleでSSMのアクセス許可をしておいたことを思い出しましょう。
ではセッションマネージャ経由で接続してみます。
AWS Systems Manager -> Session Manager をクリックすると、先ほど作成したec2インスタンスが対象に表示されていると思います。

セッションを開始をするとそのままコンソール画面が開いてsshで接続したようにEC2インスタンスの操作を行うことができます。しかしAWSも便利になりましたね。

※運用上sshではなくSessionManagerで問題がないようでしたらssh(22)の公開は閉じておきましょう。
9. まとめ
今回でとりあえずの目標だったAWSアカウントを取得したゼロの状態からIaCでVPCやRole、SecurotyGroupなどの最低限のリソースを作成して、EC2インスタンスを作成するというところまでは完了しました。
一旦区切りとしてつけれると思いますが、まだまだやることはあります。
次回はPrivateサブネットへのアクセスの際によく使われるOpenVPNサーバをPublicサイトに構築したいと思います。
今回は以上となります。
コメント