よ〜んです、書き初めをします。

書き初めと言っても、習字ではなくAWS CDK書き初めをします。

本記事ではまず、AWS CDKで書き初めを行い、その後cf2tfというツールを使ってTerraformに変換してTerraform入門してみようと思います。

cf2tf

正式名称Cloudformation 2 Terraform

名前の通り、AWS CloudFormationをTerraformに変換することを試みるツール。

プロジェクトのREADMEにもある通り、100% の精度で変換することは不可能だからだそうです。

書き初め

ApplicationLoadBalancedFargateServiceで、ケチケチ構成のシンプルなECSを作成します。

そういえばL3コンストラクト使って書くこと自体、初めてな気がします。

import * as cdk from 'aws-cdk-lib/core'
import { Construct } from 'constructs'
import * as ecsPatterns from 'aws-cdk-lib/aws-ecs-patterns'
import * as ecs from 'aws-cdk-lib/aws-ecs'
import * as ec2 from 'aws-cdk-lib/aws-ec2'

export class Cf2TfStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props)

    new ecsPatterns.ApplicationLoadBalancedFargateService(this, 'EcsService', {
      cluster: new ecs.Cluster(this, 'Cluster', {
        vpc: new ec2.Vpc(this, 'Vpc', {
          maxAzs: 2,
          natGateways: 1,
        })
      }),
      memoryLimitMiB: 512,
      cpu: 256,
      desiredCount: 1,
      taskImageOptions: {
        image: ecs.ContainerImage.fromRegistry("amazon/amazon-ecs-sample"),
      },
    })
  }
}

デプロイ完了しました、書き初めにもってこいですね

PHPのバージョンめちゃくちゃ古いw

Terraformへ入門してみる

今回はスタック名がCf2TfStackなので、デプロイが完了するとcdk.out/Cf2TfStack.template.jsonが生成されます。

cf2tf cdk.out/Cf2TfStack.template.json > Cf2Tf.tf

こちらで、Terraformへの変換を試してくれます。

resource "aws_subnet" "vpc_public_subnet1_subnet5_c2_d37_c4" {
  availability_zone = element(// Unable to resolve Fn::GetAZs with value: "" because cannot access local variable 'az_data' where it is not associated with a value, 0)
  cidr_block = "10.0.0.0/18"
  map_public_ip_on_launch = true
  vpc_id = aws_vpc.vpc8378_eb38.arn
  tags = {
    aws-cdk:subnet-name = "Public"
    aws-cdk:subnet-type = "Public"
    Name = "Cf2TfStack/Vpc/PublicSubnet1"
  }
}

Terraformのコードが生成されましたが、ところどころ解決できていないところがあります。

どうやらCloudFormationの組み込み関数Fn::GetAZsをいい感じに処理できないようです。

他にも

  • AWS::ElasticLoadBalancingV2::LoadBalanceraws_elasticsearch_domain_policy
  • AWS::EC2::VPCGatewayAttachmentaws_vpn_gateway_attachment

とマッチしていたりしました、なのでterraform validateはもちろんコケます。

一旦、terraformに入門することは諦めて、cf2tfを触り尽くします。

mkdir Cf2Tf-tf
cf2tf cdk.out/Cf2TfStack.template.json -o Cf2Tf-tf

-oで出力するディレクトリを指定すると、いい感じにファイルを分割してくれます。

ls Cf2Tf-tf
data.tf         locals.tf       output.tf       resource.tf     variable.tfls 

Terraformはこんな感じで分割するのがお作法なのでしょうか(?)

まとめ

cf2tf

少し複雑なパターンで試してしまったことを反省、もっと簡単なパターンで試すべきでしたね。

実際に、CloudFormationからTerraformへ移行する際は、cf2tfを使って大まかに変換後、あとはterraform planの結果から手動で調整していくのが良いのかなと思っていたり。

cf2tfはコントリビューションを受け付けていそうなので、直せそうならPR投げていきたいです。

Terraform入門

Terraformの入門については入門できてないので、近道せずにじっくり学んでいこうと思います。

ではでは