y-ohgi's blog

TODO: ここになにかかく

AWS ProviderとAWSCC Providerの併用

TL;DR

  • CDKからOpenTofu(/Terraform)へ移行の課題として、互換性の問題がある。
  • AWS ProviderにはCloudFormationと互換性のあるresourceが存在しないことがある。
  • AWS ProviderとAWSCC Providerの2つのProviderを使用することでCloudFormationと同等のAPIを呼び出して解決する。

About

CDKからOpenTofuに移行するにあたり、AWS Providerと互換性のないresourceが存在しました。
該当するリソースは AWS::EC2::KeyPair で、このリソースは「key pairの作成と同時にParameter Storeにprivate keyを登録」する挙動があります。

When you create a new key pair, the private key is saved to AWS Systems Manager Parameter Store, using a parameter with the following name: /ec2/keypair/{key_pair_id}. For more information about retrieving private key, and the required permissions, see Create a key pair using AWS CloudFormation in the Amazon EC2 User Guide. AWS::EC2::KeyPair - AWS CloudFormation

この対応のために、AWSCC ProviderでCloud Control API経由でresourceを作成します。

Version

  • OpenTofu
    • v1.9.0
  • opentofu/aws
    • 4.0.0
  • opentofu/awscc
    • 1.35.0

Code

learn-opentofu/multiple-provider at main · y-ohgi/learn-opentofu

How to

Code

terraform {
  required_providers {
    # AWS Providerの定義
    aws = {
      source  = "opentofu/aws"
      version = ">= 4.0.0"
    }
    # AWSCC Providerの定義
    awscc = {
      source  = "opentofu/awscc"
      version = "1.35.0"
    }
  }
  required_version = ">= 1.0.0"
}

# AWSCC Providerでキーペアを作成
resource "awscc_ec2_key_pair" "this" {
  key_name   = "tmp"
  key_format = "pem"
  key_type   = "rsa"
}

# AWS ProviderでEC2インスタンスを作成
resource "aws_instance" "this" {
  ami           = "ami-05506fa68391b4cb1" # AL 2023
  instance_type = "t3.micro"
  key_name      = awscc_ec2_key_pair.this.key_name # AWSCC Providerのキーペアを参照
}
$ tofu init
$ tofu apply

確認

キーペアが作成されていることを確認

Parameter Storeに保管されていることを確認

EC2にキーペアが登録されていることを確認

所感

前回のブログで「AWSCC Providerを業務で使用することはない」と書きましたが、CDKからの移行で早速使用することになりました。
CDK(/CFn)からの移行にAWSCC Providerを使用する選択肢を持っておくことの重要性を実感しました。