TerraformでPagerDutyをIaC管理してみた 〜Terraform Provider for PagerDutyの紹介〜

TerraformでPagerDutyをIaC管理してみた 〜Terraform Provider for PagerDutyの紹介〜

Clock Icon2025.04.23

あしざわです。

TerraformにはProviderというプラグインがあり、TerraformとProviderと組み合わせることで様々な環境にリソースをプロビジョニングできます。

個人的にTerraform ProviderといえばAWSやGoogle CloudのようなパブリッククラウドのIaC管理をイメージしてしまいますが、その他の多数のSaaS製品のProviderも提供されています。

今回の記事では、そんなSaaS製品のProviderの中でもインシデント管理プラットフォームとして有名なPagerDutyのProvderである『Terraform Provider for PagerDuty 』について取り上げます。

近年クラウドインフラの構築・運用におけるIaC利用は一般的になっていると思いますが、SaaS製品は未だGUIで設定されることが多いのでは、と感じています。

今回の記事を通じて、SaaS製品をIaCで管理するメリットが伝わると嬉しいです。

Terraform Provider for PagerDutyについて

Terraform Provider for PagerDutyは、以下GitHubリポジトリでPagerDuty社を中心にメンテナンスされています。

https://github.com/PagerDuty/terraform-provider-pagerduty

デフォルトブランチであるmasterブランチは毎月のようにPRがマージされており、積極的に更新されていることが伺えます。

image.png
https://github.com/PagerDuty/terraform-provider-pagerduty/activity?ref=master

TerraformのResourceは48個提供されていました(2025年4月22日現在)

PagerDuty API Tokenについて

TerraformはProviderに指定したサービスのAPIを実行することで、リソースをプロビジョニングします。

PagerDutyのAPIにはREST APIとEvents APIの2つがあり、今回利用するのは前者のREST APIです。

REST APIを利用するために、以下2種類のREST API アクセスキーのどちらかを発行します。

  • General Access REST API Keys (一般アクセスAPI キー)
  • User Token REST API Keys (ユーザートークンAPI キー)

一般アクセスAPIキーは、Integration > Developer Tool: API Access Keyから発行しました。

image.png

image.png

ユーザートークンAPI キーは、People > Directory: Usersからユーザーを選択し、User Settingsタブから発行できました。

image.png

image.png

いずれのAPIキーも発行したタイミングでしかAPIキーの文字列を確認できないため、キーを発行したら忘れずに控えておきましょう。

やってみた

前提

ここからやってみたの章に移りますが、以下の項目は準備済みである前提で進めます。

  • PagerDutyドメインの準備
  • ローカルPCへのTerraformのインストール

PagerDutyのドメインがない方は、以下記事を参考にトライアルアカウントを作成してください。

https://dev.classmethod.jp/articles/pagerduty-intro-account-create/

Terraformがインストールできていない方は、以下記事を参考に導入してください。

https://developer.hashicorp.com/terraform/install

参考までに今回の検証で利用している、私のローカルPCで利用しているTerraformのバージョンはこちらです。

> terraform --version
Terraform v1.9.8
on darwin_arm64

それでは検証に移ります!

Terraformの初期化

Terraformを実行するディレクトリに以下3つのファイルを作成します。

provider.tf
terraform {
  required_providers {
    pagerduty = {
      source  = "PagerDuty/pagerduty"
      version = "3.24.1"
    }
  }
}

provider "pagerduty" {
  token = var.pd_token
}
variable.tf
variable "pd_token" {
  description = "The PagerDuty API token"
  type        = string
}
terraform.tfvars
pd_token = "u+xxxxxxxxxxxxxxxxx"

u+xxxxxxxxxxxxxxxxxには、「PagerDuty API Tokenについて」の章で取得したAPIキーを入力してください

terraform initコマンドを実行します。

> terraform init

Initializing the backend...
Initializing provider plugins...
- Finding pagerduty/pagerduty versions matching "3.24.1"...
- Installing pagerduty/pagerduty v3.24.1...
- Installed pagerduty/pagerduty v3.24.1 (signed by a HashiCorp partner, key ID 00000000000000)
Partner and community providers are signed by their developers.
If you'd like to know more about provider signing, you can read about it here:
https://www.terraform.io/docs/cli/plugins/signing.html
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

これでPagerDutyリソースをプロビジョニングする準備ができました。

※APIキーに関する注意

PagerDutyのAPIキーは、対応するPagerDutyドメインが分からなくても利用できてしまいます。流出すると危険です。

こういったクレデンシャル情報の扱いについて他のサービスと同様ですが、GitHubのパブリックリポジトリ上にアップロードしないための対策をしましょう。

  • (対策例)
    • provider.tfにAPIキーを埋め込まずにterraform.tfvarsに記載する
    • terraform.tfvars.gitignoreファイルで管理し、Gitのパブリックリポジトリに誤って上げないようにする

ユーザー作成と通知ルールの設定をする

準備ができたので、初めにPagerDutyのユーザーを作成し、ユーザーの通知ルールを設定します。

カレントディレクトリにuser-notification.tfを追加します。

user-notification.tf
# Create a PagerDuty team
resource "pagerduty_team" "engineering" {
  name        = "Engineering"
  description = "All engineering"
}

# Create a PagerDuty user
resource "pagerduty_user" "example" {
  name  = "Hiroaki Ashizawa"
  email = "example@example.com"
}

# Create a team membership
resource "pagerduty_team_membership" "example_engineering" {
  user_id = pagerduty_user.earline.id
  team_id = pagerduty_team.engineering.id
}

pagerduty_user.earline.emailに記載のメールアドレスは受信可能なものに変更してください

※設定値は、PagerDuty Provider ドキュメントのExample Usageを参考にしています。

terraform planでDry-Runしてから、terraform applyコマンドでリソースを作成します。

> terraform plan
.....
Plan: 3 to add, 0 to change, 0 to destroy.

──────────────────────────────────────────────────────────────────────────────

Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run
"terraform apply" now.

> terraform apply
.....
Plan: 2 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes
.....
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

リソース作成に成功すると、指定したTeamに所属したユーザーが作成されていました。

image.png

指定したメールアドレスへ招待メールが届いていることも確認できました。

image.png

サービスを作成する

同じディレクトリにservice.tfを作成します

service.tf
resource "pagerduty_escalation_policy" "foo" {
  name      = "Engineering Escalation Policy"
  num_loops = 2

  rule {
    escalation_delay_in_minutes = 10

    target {
      type = "user_reference"
      id   = pagerduty_user.example.id
    }
  }
}

resource "pagerduty_service" "example" {
  name                    = "My Web App"
  auto_resolve_timeout    = 14400
  acknowledgement_timeout = 600
  escalation_policy       = pagerduty_escalation_policy.foo.id
  alert_creation          = "create_alerts_and_incidents"

  auto_pause_notifications_parameters {
    enabled = true
    timeout = 300
  }
}

※PagerDuty Provider ドキュメントのServiceのExample Usageで提示されている設定を参考に作成しています。

https://registry.terraform.io/providers/PagerDuty/pagerduty/latest/docs/resources/service

再度、terraform planterraform applyコマンドでリソースを作成しました。

PagerDutyコンソールを確認すると、サービスが作成できていました。

image.png

descriptionは.tfファイルに定義していませんでしたが、デフォルトで「Managed by Terraform」がセットされているようです。些細なことですが嬉しい仕様ですね。

サービスにはエスカレーションポリシーも作成、関連付けできていました。こちらも「Managed by Terraform」のDesctiption付きです。

image.png

以上でやってみたを終わります。

その他

Terraform Provider for PagerDutyは、CDK for Terraform(cdktf)にも対応しています。

https://github.com/cdktf/cdktf-provider-pagerduty

AWSなどメインのインフラをCDKで管理していて、PagerDutyのみをTerraformで管理することに抵抗がある方はこちらもおすすめできそうです。

DevIOでは以下記事で紹介されています。

https://dev.classmethod.jp/articles/pagerduty-deploy-with-cdk-for-terraform/

私もまだ触ったことがないですが気になったので、次回以降の記事で触ってみようと思います。

まとめ

今回は、Terraform Provider for PagerDutyを使って、PagerDutyのユーザーやサービスなどのリソースをコードで管理する方法を紹介しました。

従来、SaaS製品の設定はGUIで個別に行うことが多く、設定の再現性や管理の一元化に課題がありました。しかし、Terraform Providerを活用することで、PagerDutyのリソースもインフラと同様にIaCで管理できるようになります。これにより、設定の変更履歴の管理や、複数環境への展開、再現性の担保、属人化の防止など多くのメリットが得られます。

いきなり全面的にIaCを導入するのはハードルが高く感じる方もいるかもしれません。今回紹介したユーザー追加から始めてみるなど、定期的かつ頻繁に作業が発生するタスクを見極めて少しずつIaCを導入していくことも1つの手です。

今後は、皆さんの組織で利用している他のSaaS製品でTerraform Providerが提供されているか確認し、提供されている場合は積極的に活用、インフラリソースと合わせて統合的なIaC管理を目指していくことをおすすめしたいです。

どのような製品がTerraform Providerでサポートされているか知りたい方は、以下ドキュメントから確認してください。

SaaSの設定もコードで管理することで、より強固で効率的な運用体制を構築していきましょう。

以上です。最後まで読んでいただきありがとうございました。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.