
【VPC外リージョンサービス】
CloudFormation は、IaC(Infrastructure as Code) を実現するサービスであり、AWSリソースを テンプレート(YAML/JSON) 形式でコード化して管理します。これにより、リソース間の 依存関係 を考慮しながら、インフラを自動的かつ一貫して構築することができます。
作成されたテンプレートは、Stack(スタック) としてデプロイされ、リソース群をまとめて宣言的に
作成・更新・削除 できます。スタックを更新する際には、Change Sets(変更セット) を使用して、
実際に変更を適用する前に影響範囲を事前確認することができます。
Drift Detection(ドリフト検出) 機能を利用することで、テンプレートで定義された構成と、実際にデプロイされたリソースの状態との不整合を検出し、運用中の構成ずれを防止できます。
複数アカウントや複数リージョンに対して一括展開を行う場合は、StackSet(スタックセット) を活用します。これにより、組織全体で統一されたインフラ管理・展開が可能になります。
テンプレートには パラメータ や 出力(Outputs) を定義でき、環境ごとの可変値設定や、他のスタックとの連携を容易にします。
開発者は CDK(Cloud Development Kit) を用いて、TypeScript や Python などの一般的なプログラミング言語からテンプレートを自動生成することもでき、CloudFormation と連携した柔軟な IaC 運用を実現します。
重要用語
関連サービス
CDK
ユースケース
| インフラ構成のコード化(IaC) | VPC・サブネット・EC2・RDSなどのリソース構成をテンプレートとして定義し、同じ構成を何度でも自動で再現できるようにする。 |
| 複数環境の一貫した構築 | 開発・検証・本番環境を同じテンプレートからデプロイし、設定のばらつきをなくして環境差異によるトラブルを減らす。 |
| 変更セットによる安全な更新 | テンプレート変更前に変更セットを作成して差分を確認し、想定どおりのリソース変更になるか事前にチェックしてから本番適用する。 |
ベストプラクティス
| スタック分割とモジュール化 | ネットワーク・アプリ・監視など用途でスタックを分ける。 |
| 変更セットの利用 | 適用前に変更内容を確認し、誤った更新を防ぐ。 |
| パラメータとマッピング管理 | 環境ごとの差分はパラメータやマッピングで吸収する。 |
セキュリティ
| 関連サービス | 設定内容 |
|---|---|
| KMS(データの暗号化と鍵の安全管理) | - |
| Secrets Manager(機密情報の安全管理) | - |
| SSM Parameter Store(設定情報の一元管理) | パラメータ(Parameter)の作成が推奨 パラメータ値(例:AMI ID、環境名など) |
| CloudTrail(操作履歴の記録・監査・追跡) | 【自動記録】 作成・更新・削除・設定変更は自動記録される。(コントロールプレーンAPI) データ操作は追跡できない(データプレーンAPI) |
| Config(リソースの構成状態・設定変更を記録) | 【Configが有効な場合】 スタック構成の変更履歴・Stack Drift 検知ルールによる逸脱検出 |
| GuardDuty(脅威を自動検出) | 【GuardDutyが有効な場合】 テンプレート実行・リソース削除のAPI異常検知 |
CloudFormationが実行ロールを引き受ける典型的な連携パターン
| 実行ロールを介して連携するサービス | 実行ロールにアタッチするポリシー |
|---|---|
| CloudWatch Logs | cloudwatch:PutMetricAlarm cloudwatch:DeleteAlarms cloudwatch:DescribeAlarms logs:CreateLogGroup logs:DeleteLogGroup logs:PutRetentionPolicy logs:DescribeLogGroups logs:PutSubscriptionFilter logs:DeleteSubscriptionFilter |
| EC2 | ec2:CreateVpc ec2:DeleteVpc ec2:CreateSubnet ec2:DeleteSubnet ec2:CreateSecurityGroup ec2:DeleteSecurityGroup ec2:AuthorizeSecurityGroupIngress ec2:RevokeSecurityGroupIngress ec2:RunInstances ec2:TerminateInstances ec2:CreateTags ec2:DeleteTags ec2:DescribeInstances ec2:DescribeVpcs ec2:DescribeSubnets ec2:DescribeSecurityGroups ec2:CreateInternetGateway ec2:AttachInternetGateway ec2:CreateRouteTable ec2:CreateRoute ec2:AssociateRouteTable ec2:DetachInternetGateway ec2:DeleteInternetGateway ec2:DeleteRouteTable ec2:DisassociateRouteTable ec2:CreateNatGateway ec2:DeleteNatGateway ec2:DescribeNatGateways ec2:CreateVpcEndpoint ec2:DeleteVpcEndpoint ec2:DescribeVpcEndpoints ec2:ModifyVpcEndpoint |
| ECS | ecs:CreateCluster ecs:DeleteCluster ecs:RegisterTaskDefinition ecs:DeregisterTaskDefinition ecs:CreateService ecs:UpdateService ecs:DeleteService ecs:DescribeClusters ecs:DescribeServices ecs:UpdateCluster ecs:TagResource |
| EKS | eks:CreateCluster eks:DeleteCluster eks:DescribeCluster eks:CreateNodegroup eks:DeleteNodegroup eks:UpdateClusterConfig eks:UpdateNodegroupConfig eks:DescribeNodegroup eks:TagResource |
| IAM | iam:CreateRole iam:DeleteRole iam:PutRolePolicy iam:DeleteRolePolicy iam:AttachRolePolicy iam:DetachRolePolicy iam:GetRole iam:PassRole iam:CreatePolicy iam:DeletePolicy iam:CreateInstanceProfile iam:DeleteInstanceProfile iam:AddRoleToInstanceProfile iam:RemoveRoleFromInstanceProfile iam:UpdateAssumeRolePolicy iam:TagRole iam:UntagRole |
| ALB/NLB | elasticloadbalancing:CreateLoadBalancer elasticloadbalancing:DeleteLoadBalancer elasticloadbalancing:CreateTargetGroup elasticloadbalancing:DeleteTargetGroup elasticloadbalancing:CreateListener elasticloadbalancing:DeleteListener elasticloadbalancing:ModifyLoadBalancerAttributes elasticloadbalancing:DescribeLoadBalancers elasticloadbalancing:DescribeTargetGroups elasticloadbalancing:DescribeListeners elasticloadbalancing:RegisterTargets elasticloadbalancing:DeregisterTargets elasticloadbalancing:ModifyTargetGroupAttributes elasticloadbalancing:AddTags elasticloadbalancing:RemoveTags |
| ACM | acm:RequestCertificate acm:DescribeCertificate acm:DeleteCertificate |
| Route53 | route53:CreateHostedZone route53:DeleteHostedZone route53:ChangeResourceRecordSets route53:GetHostedZone route53:ListResourceRecordSets |
| RDS | rds:CreateDBInstance rds:DeleteDBInstance rds:ModifyDBInstance rds:CreateDBSubnetGroup rds:DeleteDBSubnetGroup rds:DescribeDBInstances rds:DescribeDBSubnetGroups rds:AddTagsToResource rds:RemoveTagsFromResource rds:CreateDBParameterGroup rds:ModifyDBParameterGroup rds:DeleteDBParameterGroup rds:DescribeDBParameterGroups |
| DynamoDB | dynamodb:CreateTable dynamodb:DeleteTable dynamodb:UpdateTable dynamodb:DescribeTable dynamodb:TagResource dynamodb:UntagResource |
| S3 | s3:CreateBucket s3:DeleteBucket s3:PutBucketPolicy s3:DeleteBucketPolicy s3:PutBucketVersioning s3:PutBucketEncryption s3:PutObject s3:DeleteObject s3:GetObject s3:ListBucket s3:PutBucketTagging s3:PutLifecycleConfiguration s3:PutBucketNotification |
| Lambda | lambda:CreateFunction lambda:DeleteFunction lambda:UpdateFunctionCode lambda:UpdateFunctionConfiguration lambda:AddPermission lambda:RemovePermission lambda:GetFunction lambda:InvokeFunction lambda:PublishVersion lambda:CreateAlias lambda:DeleteAlias lambda:GetFunctionConfiguration lambda:ListVersionsByFunction lambda:PublishLayerVersion lambda:DeleteLayerVersion lambda:GetLayerVersion |
| SNS | sns:CreateTopic sns:DeleteTopic sns:SetTopicAttributes sns:Subscribe sns:Unsubscribe sns:GetTopicAttributes |
| EventBridge | events:PutRule events:PutTargets events:DeleteRule events:RemoveTargets events:DescribeRule |
| Step Functions | states:CreateStateMachine states:DeleteStateMachine states:UpdateStateMachine states:DescribeStateMachine states:TagResource |
| API Gateway | apigateway:GET apigateway:CreateRestApi apigateway:DeleteRestApi apigateway:UpdateRestApi apigateway:CreateDeployment apigateway:CreateStage apigateway:DeleteStage apigateway:UpdateStage apigateway:TagResource |
| CloudFront | cloudfront:CreateDistribution cloudfront:DeleteDistribution cloudfront:UpdateDistribution cloudfront:GetDistribution cloudfront:TagResource |
| CodePipeline | codepipeline:CreatePipeline codepipeline:DeletePipeline codepipeline:UpdatePipeline codepipeline:GetPipeline codepipeline:StartPipelineExecution |
| CodeBuild | codebuild:CreateProject codebuild:DeleteProject codebuild:UpdateProject codebuild:BatchGetProjects codebuild:StartBuild codebuild:BatchGetBuilds |
| SQS | sqs:CreateQueue sqs:DeleteQueue sqs:SetQueueAttributes sqs:GetQueueAttributes sqs:GetQueueUrl sqs:TagQueue sqs:UntagQueue |
| Secrets Manager | secretsmanager:CreateSecret secretsmanager:DeleteSecret secretsmanager:UpdateSecret secretsmanager:GetSecretValue secretsmanager:DescribeSecret secretsmanager:PutSecretValue |
| KMS | kms:CreateKey kms:DescribeKey kms:EnableKey kms:DisableKey kms:ScheduleKeyDeletion kms:CreateAlias kms:DeleteAlias kms:PutKeyPolicy kms:TagResource kms:UpdateKeyDescription |
信頼ポリシー:CloudFormation
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "cloudformation.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
CloudFormation が使用する SLR の連携パターン
SLR名 : AWSServiceRoleForCloudFormationStackSetsOrgAdmin SLR名 : AWSServiceRoleForCloudFormationStackSetsOrgMember
| SLR が操作するサービス | 用途 |
|---|---|
| Organizations | 組織内の複数アカウントへのスタックデプロイ |
| STS | クロスアカウントでのスタック操作 |
| S3 | テンプレートファイルの取得 |
| 各種AWSサービス | スタックで定義されたリソースの作成/更新/削除 |
ログ・監視
| ログ出力先 | ログの種類 |
|---|---|
| CloudWatch Logs | スタックイベントログ |
標準メトリクス
| メトリクス名 | 説明 |
|---|---|
制限値(固定値/ハードリミット/ソフトリミット)
| ハードリミット | 制限値 |
|---|---|
| パラメータ数/スタック | 200 |
| 出力数/スタック | 200 |
| マッピング数/テンプレート | 200 |
| テンプレートボディサイズ | 1 MB(直接)、460 KB(S3) |
| 同時スタック操作数 | 10 |
| ソフトリミット | 制限値 |
|---|---|
| スタック数/リージョン | 2,000 |
| リソース数/スタック | 500 |
| スタックセット数/管理者アカウント | 100 |
| スタックインスタンス数/スタックセット | 2,000 |
AWS CLIのサンプルコード
CloudFormationのサンプルコード
Terraformのサンプルコード
料金計算
| 課金項目 | 説明 |
|---|---|
| CloudFormation自体は無料 | 作成されるリソースに課金 |
| ハンドラー操作 | サードパーティリソースのハンドラー操作 |