3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

terraform applyの内部実装

Posted at

※この記事はあくまで僕の備忘録であり、内容の整合性を保証するものではありません。

モチベーション

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を読もうと思う。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?