はじめに
インフラストラクチャーをコードで定義する際(IaC)、複数のリソース間に明確な依存関係がある場合があります。
個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。
depends_on
は、TerraformやCloudFormationといったIaCツールで、リソース間の作成順序を明示的に指定するために使用されます。
Terraformにおける depends_on
resource "aws_instance" "app" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
depends_on = [aws_security_group.app_sg]
}
解説:
Terraformは基本的にリソースの参照から依存関係を自動的に判断しますが、自動では検知されない関係を明示的に定義したいときに depends_on
を使用します。この例では、EC2インスタンスはセキュリティグループが作成された後に作成されます。
参考文献
CloudFormationにおける DependsOn
Resources:
MyBucket:
Type: AWS::S3::Bucket
MyBucketPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref MyBucket
PolicyDocument: ...
DependsOn: MyBucket
解説:
CloudFormationも通常は !Ref
や !GetAtt
で依存関係を推測できますが、こちらも手動で順番を指定したい場合に DependsOn
を利用します。たとえば、ポリシーは対象のバケットが先に存在していなければなりません。
参考文献
よくある使いどころ
シチュエーション | なぜ depends_on が必要か |
---|---|
IAM Role が必要な Lambda 関数 | Roleが存在しないとLambda作成に失敗する |
S3 バケットのあとに BucketPolicy を設定 | バケットが存在していないとポリシーの適用に失敗する |
VPC → Subnet → EC2 インスタンス | サブネットやSGよりも先にインスタンスを作るとエラーになる可能性 |
Terraform の null_resource などで順序制御 | 明示的な順序が必要な場合に使用される |
まとめ
ここまで読んでいただきありがとうございました。以下に簡単にまとめてみましたので、参考にしてみてください...!
-
depends_on
の使用は最小限にとどめることが推奨されます。 - 自動で推測される依存関係に任せ、どうしても必要な場合のみ明示する方が保守性の高いテンプレートになります。
ツール | ディレクティブ名 | 用途 |
---|---|---|
Terraform | depends_on |
作成順序の明示的な制御 |
CloudFormation | DependsOn |
リソース間の明示的な依存関係 |