※この記事はあくまで僕の備忘録であり、内容の整合性を保証するものではありません。
モチベーション
terraform applyの内部実装を調べたことがなかった。Go言語で実装されているので、コードを読んだ。
なお、今回読んだコードは、hashicorp/terraformである。
1.コマンド
各コマンドは、commands.goで設定されている。
すべてのコマンドを網羅的に調べるのはしんどいので、以下ではapplyに絞ってコードを読む。なお、applyはこのように設定されている。
Commands = map[string]cli.CommandFactory{
"apply": func() (cli.Command, error) {
return &command.ApplyCommand{
Meta: meta,
}, nil
},
2.terraform apply
terraform applyの挙動はinternal/command/apply.goに書いてある。
実際にresourceの変更を行うのは、恐らくRunOperationである。
op, err := c.RunOperation(be, opReq)
if err != nil {
diags = diags.Append(err)
view.Diagnostics(diags)
return 1
}
3.RunOperation
RunOperationは、internal/command/meta.goで定義されている。RunOperationのうち、実際にリソース変更などを行うのは、b.Operationである。
func (m *Meta) RunOperation(b backend.Enhanced, opReq *backend.Operation) (*backend.RunningOperation, error) {
if opReq.View == nil {
panic("RunOperation called with nil View")
}
if opReq.ConfigDir != "" {
opReq.ConfigDir = m.normalizePath(opReq.ConfigDir)
}
op, err := b.Operation(context.Background(), opReq)
if err != nil {
return nil, fmt.Errorf("error starting operation: %s", err)
}
4.backend.Enhanced.Operation
backend.Enhanced.Operationは、interfaceとしてinternal/backend/backend.goで定義されている。
あくまでinterfaceとして定義しているだけなので、具体的にAWSやGCPに対してどのような操作を行っているのかを知りたい場合は、プロバイダを実装している他レポジトリを調べる必要がある。
最後に
今回は、hashicorp/terraformを読んだが、このレポジトリ内で完結していないため、不明点が多い。次回はhashicorp/hclを読もうと思う。