CloudFormation

【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 Logscloudwatch:PutMetricAlarm
cloudwatch:DeleteAlarms
cloudwatch:DescribeAlarms
logs:CreateLogGroup
logs:DeleteLogGroup
logs:PutRetentionPolicy
logs:DescribeLogGroups
logs:PutSubscriptionFilter
logs:DeleteSubscriptionFilter
EC2ec2: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
ECSecs:CreateCluster
ecs:DeleteCluster
ecs:RegisterTaskDefinition
ecs:DeregisterTaskDefinition
ecs:CreateService
ecs:UpdateService
ecs:DeleteService
ecs:DescribeClusters
ecs:DescribeServices
ecs:UpdateCluster
ecs:TagResource
EKSeks:CreateCluster
eks:DeleteCluster
eks:DescribeCluster
eks:CreateNodegroup
eks:DeleteNodegroup
eks:UpdateClusterConfig
eks:UpdateNodegroupConfig
eks:DescribeNodegroup
eks:TagResource
IAMiam: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/NLBelasticloadbalancing: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
ACMacm:RequestCertificate
acm:DescribeCertificate
acm:DeleteCertificate
Route53route53:CreateHostedZone
route53:DeleteHostedZone
route53:ChangeResourceRecordSets
route53:GetHostedZone
route53:ListResourceRecordSets
RDSrds: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
DynamoDBdynamodb:CreateTable
dynamodb:DeleteTable
dynamodb:UpdateTable
dynamodb:DescribeTable
dynamodb:TagResource
dynamodb:UntagResource
S3s3: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
Lambdalambda: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
SNSsns:CreateTopic
sns:DeleteTopic
sns:SetTopicAttributes
sns:Subscribe
sns:Unsubscribe
sns:GetTopicAttributes
EventBridgeevents:PutRule
events:PutTargets
events:DeleteRule
events:RemoveTargets
events:DescribeRule
Step Functionsstates:CreateStateMachine
states:DeleteStateMachine
states:UpdateStateMachine
states:DescribeStateMachine
states:TagResource
API Gatewayapigateway:GET
apigateway:CreateRestApi
apigateway:DeleteRestApi
apigateway:UpdateRestApi
apigateway:CreateDeployment
apigateway:CreateStage
apigateway:DeleteStage
apigateway:UpdateStage
apigateway:TagResource
CloudFrontcloudfront:CreateDistribution
cloudfront:DeleteDistribution
cloudfront:UpdateDistribution
cloudfront:GetDistribution
cloudfront:TagResource
CodePipelinecodepipeline:CreatePipeline
codepipeline:DeletePipeline
codepipeline:UpdatePipeline
codepipeline:GetPipeline
codepipeline:StartPipelineExecution
CodeBuildcodebuild:CreateProject
codebuild:DeleteProject
codebuild:UpdateProject
codebuild:BatchGetProjects
codebuild:StartBuild
codebuild:BatchGetBuilds
SQSsqs:CreateQueue
sqs:DeleteQueue
sqs:SetQueueAttributes
sqs:GetQueueAttributes
sqs:GetQueueUrl
sqs:TagQueue
sqs:UntagQueue
Secrets Managersecretsmanager:CreateSecret
secretsmanager:DeleteSecret
secretsmanager:UpdateSecret
secretsmanager:GetSecretValue
secretsmanager:DescribeSecret
secretsmanager:PutSecretValue
KMSkms: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スタックイベントログ
CloudWatch Logs優先の原則
標準メトリクス
メトリクス名説明

制限値(固定値/ハードリミット/ソフトリミット)

ハードリミット制限値
パラメータ数/スタック200
出力数/スタック200
マッピング数/テンプレート200
テンプレートボディサイズ1 MB(直接)、460 KB(S3)
同時スタック操作数10

ソフトリミット制限値
スタック数/リージョン2,000
リソース数/スタック500
スタックセット数/管理者アカウント100
スタックインスタンス数/スタックセット2,000

AWS CLIのサンプルコード

CloudFormationのサンプルコード

Terraformのサンプルコード

料金計算

課金項目説明
CloudFormation自体は無料作成されるリソースに課金
ハンドラー操作サードパーティリソースのハンドラー操作

公式ページ

AWSドキュメント CloudFront