sacloud / terraform-provider-sakuracloud

Terraform provider for SakuraCloud
https://docs.usacloud.jp/terraform
Apache License 2.0
71 stars 22 forks source link

親子リソースでの同時実行制御 #550

Closed yamamoto-febc closed 4 years ago

yamamoto-febc commented 4 years ago

related: #485

親子型リソースにて親リソースがアイコンIDを持つ、かつ子リソースが独立したAPIエンドポイントを持たず親リソースと共通のAPIエンドポイントを用いる場合にエラーとなるケースがある。

詳細/再現

  1. 以下のようなリソースを作成
resource sakuracloud_icon "icon" {
  name = "icon"
  # ...
}

resource sakuracloud_mobile_gateway "mgw" {
  name = "example"
  icon_id = sakuracloud_icon.icon.id
  # ...
}

resource sakuracloud_mobile_gateway_static_route "r1" {
  mobile_gateway_id = sakuracloud_mobile_gateway.mgw.id
  prefix = "192.168.10.0/24"
  next_hop = "192.168.11.1"
}
  1. iconと子リソースを同時に削除
# 以下を残して以外は削除
resource sakuracloud_mobile_gateway "mgw" {
  name = "example"
  # ...
}

この時、以下のAPIが呼ばれる。

この時、A-B、B-Cはtfファイル 上の依存関係が存在するため操作順序は確定的となるが、 A-Cは直接依存関係になく同時に実行されうる。

Cについて、libsacloud v1ではUpdateSettingなどの対象の値のみを指定するメソッドを利用していたが、libsacloud v2では直接対応する対象となるメソッドが存在せず、代わりにPatchメソッドが提供されている。

しかし、Patchメソッドは内部的にRead->Updateを呼び出しているため、以下のような順でAPI呼び出しが行われる可能性がある。

  1. モバイルゲートウェイのRead GET /appliance/:id
  2. アイコンのDelete Delete /icon/:id
  3. モバイルゲートウェイのUpdate PUT /appliance/:id

1で取得したアイコンIDを3で用いてしまうことで以下のようなエラーとなる。

&sacloud.APIErrorResponse{
  IsFatal:true, 
  Serial:"xxx", 
  Status:"400 Bad Request", 
  ErrorCode:"param_res_not_found", 
  ErrorMessage:"不適切な要求です。パラメータで指定されたリソースが存在しません。IDをご確認ください。"
}

対象リソース

対象バージョン

開発中のv-next系のみ。 現在リリースされているterraform-provider-sakuracloud v1系では発生しない。

yamamoto-febc commented 4 years ago

10c28517b313da5058eb1886a6fbbd44c988db12 にてモバイルゲートウェイが対応。 他のリソースにも同様の対応を行う。

yamamoto-febc commented 4 years ago

他のリソースも対応済みなためクローズ