Stateの管理が大変だからTerraformなんか辞めてPulumiを使おう

※この記事は特定のサービスを推奨するものではございません
※Terraform,Pulumiの初学者が書いています

# Terraformの問題点

近年、**Infrastructure as Code**の重要性が広まっており、皆さんもITインフラのコード化をしておられると思います。**AWS**：**CloudFormation**や**GCP**：**Cloud Deployment Manager**のようなクラウドベンダー純正を使っている方もいれば、**Terraform**のようなマルチクラウドベンダーの対応しているサービスを使っている方もいると思います。弊社でも**Terraform**を利用しています。しかし、tfstateの管理が面倒であるという問題があります。[1](https://blog.gruntwork.io/how-to-manage-terraform-state-28f5697e68fa)

git管理するのはなあ、、、
S3などのストレージサービスで管理するのも地味に面倒、、、

そんなあなたのために**Pulumi**というサービスがあります！
https://www.pulumi.com/

# Pulumi とは

**Pulumi**とはIaCを実現するためのサービスです。しかも、デフォルトでstate(現在の構成情報)をクラウド上で保存できる事ができます。もちろんローカルで保存することも可能です。素晴らしい！
他にも特徴があります。

## Terraform との違い

細かな差異は[Terraform vs. Pulumi Experiences](https://medium.com/@kari.marttila/terraform-vs-pulumi-experiences-c41a8774b637)というすごく良い記事がMediumにありましたのでそちらを参照していただくことにして一番大きなLanguageについて今回は紹介します。

###Terraformの言語
[HCL](https://github.com/hashicorp/hcl) (HashiCorp Configuration Language)という**Terraform**専用の言語を使っている。難しくはないが専用言語の学習が必要となる一方、宣言的な記法でインフラストラクチャーコードを綺麗に表すことが可能な強みがある。また、依存関係を明示的に記述しなくても雑に解決してくれる。

```hcl:hcl
# Create a new instance of the latest Ubuntu 14.04 on an
# t2.micro node with an AWS Tag naming it "HelloWorld"
provider "aws" {
  region = "us-west-2"
}

data "aws_ami" "ubuntu" {
  most_recent = true

  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-*"]
  }

  filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }

  owners = ["099720109477"] # Canonical
}

resource "aws_instance" "web" {
  ami           = "${data.aws_ami.ubuntu.id}"
  instance_type = "t2.micro"

  tags = {
    Name = "HelloWorld"
  }
}
```

###Pulumiの言語
専用言語が必要な**Terraform**に対して**Pulumi**ではJavaScript , Python , Go , TypeScriptなど一般的なプログラミング言語で記述することが可能なので開発者に易しい仕様になっている。また、依存関係を明示的に記述する必要がある。

```typescript:typescript
import * as aws from "@pulumi/aws";

let group = new aws.ec2.SecurityGroup("web-sg", {
    description: "Enable HTTP access",
    ingress: [{ protocol: "tcp", fromPort: 80, toPort: 80, cidrBlocks: ["0.0.0.0/0"] }],
});

let server = new aws.ec2.Instance("web-server", {
    ami: "ami-6869aa05",
    instanceType: "t2.micro",
    securityGroups: [ group.name ], // reference the security group resource above
});
```

# なぜ流行らないのか

stateの管理も楽だし言語も開発者にとって学習コストが低い
ので普通に**Terraform**より人気が出てもおかしくない気がする。しかし、あまり聞かないし使っている人を見たことがない。私の見解では以下の理由で流行らないのかなと思っている。

###値段

一人で使うならばfreeなのだが、チームとなると一番安いプランで月額 **\$50**で3人までしか使えない。それ以上の人数となると月額 **\$75/user**が必要になる。githubがチームで月額 **\$4/user** や エンタープライズで月額 **\$21/user** であることと比較すると比較するとすごく高く感じられる。弊社のようなベンチャー企業では導入が厳しい値段設定である。
https://www.pulumi.com/pricing/

### コミュニティ

**Terraform**と比べるとユーザーの数が少なく、ドキュメントやコミュニティが弱いと感じられる。Githubのスターの数を比較すると(2020/06/13現在)**Terraform**が22.4k、 **Pulumi**が5.8kと4倍近い差がある。

# 結論

プログラミング言語がそのまま使えるのでインフラを開発者が担当しているのであれば**Pulumi**は大いに検討の余地があると思います。しかし、弊社のようにある程度分業されているならば**Terraform**を利用するのが良いかもしれないです。しかもなんと**Terraform Cloud**は5人まで無料になったようですね。[2](https://www.hashicorp.com/blog/announcing-terraform-cloud/)
弊社でもState管理に**Terraform Cloud**を検討しようと思います。

#最後に

最後まで読んでいただきありがとうございます。
最初にも記載しましたように浅学なものが書いた記事ですのでご了承ください。
またこの記事は特定のサービスを推奨するものではございません。
建設的な意見や感想お待ちしております。