1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS CloudFormationの概要から基本的なハンズオンまで

Posted at

記事の目的

  • CloudFormationの基本的な仕組みを理解する
  • AWS CLIを使った基本的なスタック操作を学ぶ

AWS CloudFormation とは

image.png

 AWS CloudFormation は、インフラストラクチャに存在するリソースをコードで定義・管理できるサービスのこと。JSON または YAML 形式のテンプレートを使い、AWS リソース(EC2、S3、RDS など)やその設定を記載することで、一貫性と再現性の高い環境を自動的に構築できる。(例:EC2で言えばインスタンスタイプやセキュリティグループ、RDSで言えばインスタンスタイプやSQLエンジンなど)

CloudFormationなどのサービスを用いてインフラをコードで定義・管理することを「Infrastructure as Code」または「IaC」と呼ばれます。
(CloudFormation以外にTerraformやAzure Resource Manager Templatesなどのツールないしサービスが存在する)

CloudFormationを利用するメリット

・一貫性と再現性
テンプレートを元にしたインフラ環境をどのリージョンでも再現することができる。

・自動化による効率化
AWS リソースの作成、更新、削除を自動化し、面倒な手作業を省くことで、迅速な環境構築を実現するだけでなく、手動設定によるミスを防ぐことができる。

・依存関係と安全な更新
リソース間の依存関係を自動で管理し、変更セットによるプレビュー・自動ロールバック機能で、更新作業のリスクを低減する。

・バージョン管理と再利用性
テンプレートはソースコードとして Git などで管理でき、変更履歴の追跡や複数プロジェクトでの再利用を可能にする。

・CI/CD との統合
インフラの変更をコードレビューと自動テストの対象にでき、DevOps パイプラインと連携して継続的な改善が促進できる。

YAMLとJSON

 CloudFormationはコードでインフラストラクチャを管理できる。基本的な形式として「YAML」か「JSON」が選択でき、それぞれの形式には特徴がみられる。

YAML

yaml(例)
AWSTemplateFormatVersion: '2010-09-09'
Description: シンプルな S3 バケットを作成する CloudFormation テンプレート

Resources:
  MyS3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: my-simple-s3-bucket-1234

Outputs:
  BucketName:
    Description: 作成されたS3バケットの名前
    Value: !Ref MyS3Bucket

長所

見やすい
YAML はインデントやシンプルな記法のおかげで、構造が視覚的にわかりやすく、設定内容を直感的に把握できる。これは、運用担当者がファイルを確認・修正する場面で大きなメリットとなる。

コメントが書ける
'#' を使って自由にコメントを入れられるため、なぜその設定になっているのか、運用上の注意点や背景情報をドキュメント内に残すことができる。

JSON

json
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "シンプルな S3 バケットを作成する CloudFormation テンプレート",
  "Resources": {
    "MyS3Bucket": {
      "Type": "AWS::S3::Bucket",
      "Properties": {
        "BucketName": "my-simple-s3-bucket-1234"
      }
    }
  },
  "Outputs": {
    "BucketName": {
      "Description": "作成されたS3バケットの名前",
      "Value": {
        "Ref": "MyS3Bucket"
      }
    }
  }
}

メリット

広くサポートされている
多くのエディタやツールが JSON を標準サポートしているため、運用管理用の自動化ツールやスクリプトとの互換性が高い。

高速なパース
軽量なデータフォーマットであるため、大規模なテンプレートの処理やシステム間の通信でのパフォーマンスに優れ、運用時の自動化が強化される。

いざハンズオンへ

今回はAWS CLIをインストールし、ターミナル上でテンプレートの内容を用いたスタックの作成/更新/削除を実行していきます。

用意するもの
・AWSアカウント
・Visual Studio Code(お好みで)
・メモ帳アプリ
・AWS CLIのインストールも必要です、下記リンクを参考にしてください
https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html

ワークショップへの下準備

IAMユーザーの作成

コンソールからIAMユーザーを作成します。
コンソールへのアクセスを選択し、[AdministratorAccess]ポリシーをアタッチします。
スクリーンショット 2025-03-12 214931.png

スクリーンショット 2025-03-12 215040.png
スクリーンショット 2025-03-12 215450.png

アクセスキーの作成

CLIからアクセスするためのアクセスキーも作成しておきましょう
CLIからのアクセスに必要なので、作成したアクセスキーとシークレットアクセスキーはメモしておきましょう。

今回は管理者権限を持つユーザーを作成したので、AWS CLI上の操作を含めたある程度の操作が可能です。そのため、アクセスキー/シークレットアクセスキーは誰にも見られない場所に保管してください。

スクリーンショット 2025-03-12 220336.png
スクリーンショット 2025-03-12 220353.png
スクリーンショット 2025-03-12 220527.png

CLIでアクセスキーを使用し、デフォルトVPCの存在を確認

CloudFormationで取り込むテンプレートの中身を反映させるためのデフォルトVPCの存在を確かめます。
(今回用いるテンプレートにはリソースを作成する場所を明示的に宣言していないため、リソースを生成するためのデフォルトVPCを作成しておきます)

コマンドプロンプト(ターミナル)でアクセスキーを使用し、VPCの有無を知る

aws configure

上記のコマンドを実行後、アクセスキー→シークレットアクセスキー→リージョン→出力形式をどうするか聞かれます。

image.png

アクセスキーとシークレットアクセスキーを入力することで、キーの持ち主であるIAMユーザー/ロールが持つ権限を用いて、AWS CLIでAPIリクエストを送信することができます。

aws ec2 describe-vpcs --filters Name=isDefault,Values=true --query "Vpcs[].VpcId" --region ap-northeast-1

aws ec2 describe-vpcs →EC2のVPC情報を取得する
--filters Name=isDefault,Values=true
→取得するVPCの情報を「デフォルトのVPC」のみを対象とする
--query "Vpcs[].VpcId" 
→クエリを用いて、取得した結果から各VPCのIDのみを抽出して表示する
--region ap-northeast-1 →リージョンの場所を指定できる

このような感じでVPCIDが送信されます
(一部隠しておりますが、一番下にVPCIDが出力されています)
image.png

上記のコマンドを実行し、デフォルトVPCが存在すればIDが出力され、デフォルトVPCがない場合は何も出力されません。

もしデフォルトVPCが返されなかった方は、以下のコマンドを実行し、デフォルトVPCを作成しましょう。

aws ec2 create-default-vpc --region ap-northeast-1

(実行例:一部隠しておきます)
image.png

デフォルトVPCが完成したら準備完了です

CloudFormationを使ってみる

テンプレートを作成する

メモ帳アプリがありましたら、以下のコマンドを記述し、名前を[S3Bucket.yaml]に設定し[.txt]形式ではなく[.yaml]形式で保存しましょう。

私は以下の方法で成功しました。
1.メモ帳でテンプレートを記入し、名前を付けて保存を選択
2.ファイル名に「~.yaml」と入力
3.ファイル名の下にあるファイル形式を押し、「すべてのファイル」を選択し保存

↓メモ帳に記述するコード

AWSTemplateFormatVersion: "2010-09-09"

Description: AWS CloudFormation workshop - Template and stack (uksb-1q9p31idr) (tag:template-and-stack).

Resources:
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketEncryption:
        ServerSideEncryptionConfiguration:
          - ServerSideEncryptionByDefault:
              SSEAlgorithm: AES256

ターミナルでスタックを作成する

ターミナル上で、テンプレートを保存したディレクトリに移動します。
私は C:\Users\Wabis に置いたので、以下のコマンドを実行します

cd C:\Users\Wabis

次にスタックを作成するコマンドを実行します。

aws cloudformation create-stack --stack-name CloudFormation-workshop-template-and-stack --template-body file://C:/Users/Wabis/S3Bucket.yaml

コマンドの意味はこのような感じです

aws cloudformation create-stack
→AWS CLIのCloudFormationコマンドの中でも「create-stack」を実行して、
新しいスタックを作成するコマンドです。

--stack-name CloudFormation-workshop-template-and-stack 
スタックの名前を付けられます、名前は一意でなければなりません。
今回はスタックに「CloudFormation-workshop-template-and-stack」という名前を付けます。

--template-body file://C:/Users/Wabis/S3Bucket.yaml
スタックの中身どうする?というコマンドです。
テンプレートの内容が書かれたファイルを指定して、中身をどうするか教えてあげましょう。

コマンドが正常に実行された場合、CloudFormationはスタックIDを返します。
image.png

コンソール上でもしっかりS3バケットが作成され、スタックの中身を反映してくれていることが確認できます。
image.png

スタックを更新する

次にテンプレートを書き加え、スタックを更新します。
EC2を追加しようと思いますが、AMI IDが必要になってきます。
(AMIID:EC2のOSや初期設定をどうするかを指定するもの)

EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-xxxxxxxx
      InstanceType: t2.micro

EC2ダッシュボードでもAMI IDを見ることはできますが、せっかくですので、AWS Systems Manager (SSM) パラメータストアを利用します。

ターミナルでコマンドを実行し、AMI IDを確認します。

aws ssm get-parameters --names /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 --region ap-northeast-1 --query "Parameters[0].Value" --output text

image.png

出力されたAMI IDをメモしておき、「S3Bucket.yaml」を編集・更新します。
image.png

ターミナルに戻り、スタックを更新するコマンドを実行します。

aws cloudformation update-stack --stack-name CloudFormation-workshop-template-and-stack --template-body file://C:/Users/Wabis/S3Bucket.yaml

正常実行されると、インスタンスの詳細情報を記載したARNが出力されます。
実際にEC2コンソール上でも稼働が確認できます。
image.png
image.png

スタックの削除

最後に以下のコマンドを実行し、スタックを削除しましょう!

aws cloudformation delete-stack --stack-name CloudFormation-workshop-template-and-stack

特に出力等はしてくれませんが、CloudFormationのコンソール上でしっかりと削除の工程が確認できます。
image.png
スクリーンショット 2025-03-16 161325.png
「コンソールで見たくないけど本当に消えたかな・・・」と心配な方は以下のコマンドを実行してみてください。削除したスタックの詳細を参照することができます。

aws cloudformation list-stacks --stack-status-filter DELETE_COMPLETE

image.png

以上でワークショップは終了です!

参考資料置き場

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?