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を使用する選択肢を持っておくことの重要性を実感しました。