Terraform aws-wafのwebacl (cloudfront)をimportするメモ

# 概要

* AWS WAFにて手動でリソース（WebAcl)を作成した
* WAF ACLはCloudFront用
* importしようとしたがうまく行かなくてハマった
* 解決したのでメモ


# 詳細

* 以下のようなリソースに対してimportを行う

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/f6da6343-140d-d99b-e95b-bce7c8a1e185.png)

## エラー例

* 以下のようなエラーが出た

```
╷
│ Error: WAFInvalidParameterException: Error reason: The scope is not valid., field: SCOPE_VALUE, parameter: CLOUDFRONT
│ {
│   RespMetadata: {
│     StatusCode: 400,
│     RequestID: "74801f48-cfdc-41f8-adfd-99db932e64e7"
│   },
│   Field: "SCOPE_VALUE",
│   Message_: "Error reason: The scope is not valid., field: SCOPE_VALUE, parameter: CLOUDFRONT",
│   Parameter: "CLOUDFRONT",
│   Reason: "The scope is not valid."
│ }
```

## 設定例

* 調査したところScopeが"CLOUDFRONT"の場合はリージョンをus-east-1に設定してimportする必要がある

https://registry.terraform.io/providers/babylonhealth/aws-babylon/latest/docs/resources/wafv2_web_acl#scope

```
# ---------------------------------------------
# Main Setting
# ---------------------------------------------
//最低限の設定を記述
provider "aws" {
  #region = "ap-northeast-1"
  region = "us-east-1"　# <--New!
}
terraform {
  required_version = ">= 1.1"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = ">= 4.16.0"
    }
  }
}

//importする対象の空リソース定義を記載
resource "aws_wafv2_web_acl" "app_stg_waf_acl_cf_wafcharm_cloudfront" {}
```

## 成功例

### コマンドラインでオブジェクトを指定しない場合

```
$ terraform import 

aws_wafv2_web_acl.app_stg_waf_acl_cf_wafcharm_cloudfront a26d77b6-3654-4e67-b5bd-182771b1e521/app-stg-waf-acl-wafcharm-cloudfront/CLOUDFRONT  
aws_wafv2_web_acl.app_stg_waf_acl_cf_wafcharm_cloudfront: Importing from ID "a26d77b6-3654-4e67-b5bd-11111111111/app-stg-waf-acl-wafcharm-cloudfront/CLOUDFRONT"...
aws_wafv2_web_acl.app_stg_waf_acl_cf_wafcharm_cloudfront: Import prepared!
  Prepared aws_wafv2_web_acl for import
aws_wafv2_web_acl.app_stg_waf_acl_cf_wafcharm_cloudfront: Refreshing state... [id=a26d77b6-3654-4e67-b5bd-11111111111]

Import successful!
```
* 以下のようにimport完了

```
$ cat terraform.tfstate
{
  "version": 4,
  "terraform_version": "1.2.0",
  "serial": 1,
  "lineage": "1f1b97e2-dc7d-45fe-c119-0d8f161db2a7",
  "outputs": {},
  "resources": [
    {
      "mode": "managed",
      "type": "aws_wafv2_web_acl",
      "name": "stg_waf_acl_cf_wafcharm_cloudfront",
      "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
      "instances": [
        {
:
:
}
```

### コマンドラインでオブジェクトを指定する場合

- 以下の作成済みAWSリソース(WAF)をインポートする場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/6004fa76-5773-2002-b703-5b5472234b2b.png)

```main.tf
provider "aws" {
  region = "ap-northeast-1"
}
provider "aws" {
  alias  = "virginia"
  region = "us-east-1"
}
```

```waf.tf
resource "aws_wafv2_web_acl" "stg_waf_acl_wafcharm_cf" {

}
```

```
$ terraform import aws_wafv2_web_acl.stg_waf_acl_wafcharm_cf a26d77b6-3654-xxxxxxxxx-182771b1e521/stg-waf-acl-wafcharm-cloudfront/CLOUDFRONT

Import successful!
```

* 他にも

```
//rule groupの場合
$ terraform import aws_wafv2_rule_group.stg_waf_rule_group 83911eed-XXXXXXXXXX-1ab44516b7ac/stg-waf-rule-group-ip-set/CLOUDFRONT
```

# 感想

* terraform importをするとコード化の助けになる場合が多いが、特殊なimport方法があると難しい場合もあり、逆に時間がかかったかもしれない。