記事の目的
- CloudFormationの基本的な仕組みを理解する
- AWS CLIを使った基本的なスタック操作を学ぶ
AWS CloudFormation とは
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]ポリシーをアタッチします。
アクセスキーの作成
CLIからアクセスするためのアクセスキーも作成しておきましょう
CLIからのアクセスに必要なので、作成したアクセスキーとシークレットアクセスキーはメモしておきましょう。
今回は管理者権限を持つユーザーを作成したので、AWS CLI上の操作を含めたある程度の操作が可能です。そのため、アクセスキー/シークレットアクセスキーは誰にも見られない場所に保管してください。
CLIでアクセスキーを使用し、デフォルトVPCの存在を確認
CloudFormationで取り込むテンプレートの中身を反映させるためのデフォルトVPCの存在を確かめます。
(今回用いるテンプレートにはリソースを作成する場所を明示的に宣言していないため、リソースを生成するためのデフォルトVPCを作成しておきます)
コマンドプロンプト(ターミナル)でアクセスキーを使用し、VPCの有無を知る
aws configure
上記のコマンドを実行後、アクセスキー→シークレットアクセスキー→リージョン→出力形式をどうするか聞かれます。
アクセスキーとシークレットアクセスキーを入力することで、キーの持ち主である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が出力されています)
上記のコマンドを実行し、デフォルトVPCが存在すればIDが出力され、デフォルトVPCがない場合は何も出力されません。
もしデフォルトVPCが返されなかった方は、以下のコマンドを実行し、デフォルトVPCを作成しましょう。
aws ec2 create-default-vpc --region ap-northeast-1
デフォルト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を返します。
コンソール上でもしっかりS3バケットが作成され、スタックの中身を反映してくれていることが確認できます。
スタックを更新する
次にテンプレートを書き加え、スタックを更新します。
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
出力されたAMI IDをメモしておき、「S3Bucket.yaml」を編集・更新します。
ターミナルに戻り、スタックを更新するコマンドを実行します。
aws cloudformation update-stack --stack-name CloudFormation-workshop-template-and-stack --template-body file://C:/Users/Wabis/S3Bucket.yaml
正常実行されると、インスタンスの詳細情報を記載したARNが出力されます。
実際にEC2コンソール上でも稼働が確認できます。
スタックの削除
最後に以下のコマンドを実行し、スタックを削除しましょう!
aws cloudformation delete-stack --stack-name CloudFormation-workshop-template-and-stack
特に出力等はしてくれませんが、CloudFormationのコンソール上でしっかりと削除の工程が確認できます。
「コンソールで見たくないけど本当に消えたかな・・・」と心配な方は以下のコマンドを実行してみてください。削除したスタックの詳細を参照することができます。
aws cloudformation list-stacks --stack-status-filter DELETE_COMPLETE
以上でワークショップは終了です!
参考資料置き場