AWSCC Provider も HCP Terraform の動的認証ができそうなので理由を調べてみた

## AWS Cloud Control (AWSCC) provider とは？

AWS Cloud Control (AWSCC) provider は、簡単にいうと AWS provider がまだ対応していないリソースの構築を迅速にサポートする provider です。

https://www.hashicorp.com/ja/blog/terraform-aws-cloud-control-api-provider-now-generally-available

例えば Amazon Q Developer in chat applications (旧称: AWS Chatbot) を Slack 通知する構成 `aws_chatbot_slack_channel_configuration` は AWS provider だと 2024 年 8 月 2 日に登場した v5.61.0 でサポートされました。

https://github.com/hashicorp/terraform-provider-aws/releases/tag/v5.61.0

AWSCC provider の場合、これに対応する `awscc_chatbot_slack_channel_configuration` は 2021 年 12 月 3 日の時点で使用できる状態になっていました。

https://github.com/hashicorp/terraform-provider-awscc/releases/tag/v0.8.0

このため、新しいサービスが登場してからできるだけ早く IaC 化したい際には必要不可欠な provider です。

## HCP Terraform 利用時の疑問

HCP Terraform を利用する場合、AWS provider の認証にはセキュリティ面を考慮し Dynamic Provider Credentials を利用したいです。
下記に利用方法が示されていますが、これはあくまで AWS provider の手順であり、AWSCC provider に関する言及はありません。

https://developer.hashicorp.com/terraform/cloud-docs/workspaces/dynamic-provider-credentials/aws-configuration

他に AWSCC provider 向けの Dynamic Provider Credentials のドキュメントが見当たらないので、AWSCC provider では Dynamic Provider Credentials は利用できないのでしょうか？

## やってみたらできた

下記のようなコードを用意し、Workspace には AWS provider 向けの Dynamic Provider Credentials の設定を実施しました。

```hcl
terraform {
  required_providers {
    awscc = {
      source  = "hashicorp/awscc"
      version = "1.33.0"
    }
  }
}

provider "awscc" {
  region = "ap-northeast-1"
}

resource "awscc_ec2_vpc" "example" {
  cidr_block           = "10.0.0.0/16"
  enable_dns_support   = true
  enable_dns_hostnames = true
}
```

するとなんと、すんなり plan / apply できるではありませんか！

## なぜ認証できる？

公式の情報が見つからないので調査してみました。

[AWSCC provider のドキュメント](https://registry.terraform.io/providers/hashicorp/awscc/latest/docs)を見ると、AWS provider と同様に様々な認証手段が用意されています。

実験に利用した terraform コードでは認証手段を明示していなかったので、環境変数経由で認証情報が渡されている可能性があります。
このため下記の null_resource で AWS の Dynamic Provider Credentials 設定がある場合にどのような環境変数がセットされているか確認しました。

```hcl
resource "null_resource" "print_aws_env" {
  provisioner "local-exec" {
    command = "env | grep AWS_"
  }
}
```

Apply すると下記が出力されました。

```
Executing: ["/bin/sh" "-c" "env | grep AWS_"]
  TFC_AWS_PROVIDER_AUTH=true
  AWS_SHARED_CREDENTIALS_FILE=/home/tfc-agent/.tfc-agent/component/terraform/runs/run-xxx/tfc-aws-shared-config
  TFC_AWS_RUN_ROLE_ARN=<Dynamic Provider Credentials 用 IAM ロールの ARN>
```

このうち、`TFC_` から始まる 2 つの環境変数は AWS の Dynamic Provider Credentials 設定であり Workspace の Variables 経由で引き渡しているものです。
`AWS_SHARED_CREDENTIALS_FILE` が追加されているようですね。
この内容を見てみたいので、別の null_resource を試します。

```hcl
resource "null_resource" "print_aws_env" {
  provisioner "local-exec" {
    command = "cat $AWS_SHARED_CREDENTIALS_FILE"
  }
}
```

Apply すると下記が出力されました。

```
  [default]
  role_arn=<Dynamic Provider Credentials 用 IAM ロールの ARN>
  web_identity_token_file=/home/tfc-agent/.tfc-agent/component/terraform/runs/run-xxx/tfc-aws-token
  role_session_name=terraform-run-xxx
```

これらの内容は、AWSCC provider の認証方法の一つである [Assume Role Using Web Identity](https://registry.terraform.io/providers/hashicorp/awscc/latest/docs#assume-role-using-web-identity) の記述と対応しています。

つまり、AWS provider 向けの Dynamic Provider Credentials の設定を実施することで、(少なくとも現時点では) AWSCC provider も HCP Terraform で Dynamic Provider Credentials が利用できることが分かりました。

:::note warn
これはドキュメントで明らかになっていない内容ですので、今後変更される可能性があることに注意が必要です。
:::