Terraform で予測可能なサーバーレス デプロイを実現
Google Cloud Japan Team
※この投稿は米国時間 2021 年 4 月 16 日に、Google Cloud blog に投稿されたものの抄訳です。
ソフトウェア開発者として、自分が作成したコードを確実に動作させたいと考えるのは当然のことです。しかし、コードがなんらかの複雑なアーキテクチャにデプロイされる場合、コードが正しくてもデプロイの構成に誤りがあれば、システム全体が機能しなくなる可能性があります。つまり、インフラストラクチャが複雑でも確実にデプロイできる能力が不可欠となります。詳細なドキュメントがあると便利ですが、それでもたった 1 つの構成ミスで多くの問題が引き起こされることがあります。
このような場合、確実に再現性のあるデプロイを実現する方法として Infrastructure as Code をご検討ください。このアプローチを採用しているツールの一つが、現在広く使用されている Terraform であり、Google Cloud をはじめとした多くの主要なクラウド プラットフォームをサポートしています。
Terraform がどのように役立つのか、次の gcloud コマンドを簡単な例に挙げて考えてみましょう。
このコマンドは新しいストレージ バケットを作成します。ただし、再実行すると、バケットがすでに存在することを示すエラー メッセージが表示されます。このコマンドに、バケットの有無を確認し、存在していなければ作成するという手動チェックを追加することもできますが、すべてのスクリプトにこうしたチェックを追加し始めると、スクリプトは複雑になり保守しにくくなってしまいます。
誤りが起きやすいシェルを信頼性の高い Terraform に置換
Terraform では、目的とする状態を記述(ここでは、バケットがプロジェクトに存在すること)すると、その状態が満たされるよう必要な手順を実行します。
バケットがすでに存在する場合、Terraform は何の処理も行いません。しかし、バケットが存在しない場合には、Terraform はバケットの作成に必要な手順を実行します。
Terraform マニフェストは HCL(Hashicorp Configuration Language)で記述でき、変数や計算フィールドのような複雑さにも対応できます。
また、Terraform は複数のリソースを扱う場合に、依存関係グラフ自体も作成します。一部のリソースは、他のリソースよりも先に作成する必要があります。また、リソースの中には、他のリソースが使用するデータを作成するものもあります。たとえば、Cloud Storage バケットに依存する Cloud Run サービスがある場合、最初にそのバケットが存在する必要がありますが、Terraform がこれを解決します。仮に、互いに独立した 5 つの Cloud Functions の関数をデプロイしている場合、Terraform はこれらの作成を並行して実行するため、1 つずつ作成していくよりもはるかに高速に行えます。
このテクノロジーは、サーバーレス プロダクトに限定されるものではありません。Google Terraform プロバイダを使用して、仮想マシン、ネットワーキング、その他の複雑なインフラストラクチャをデプロイできます。このようなインフラストラクチャは、何度も手動でデプロイするのは非常に煩わしいものです。
Terraform を使用して開発環境をプロビジョニングする場合、本番環境と比較して異なる点を考慮する必要があります。いくつかの変数を追加して、本番環境仕様のインスタンスではなく、小規模な Cloud SQL インスタンスを作成する場合、Terraform なら重複する設定を簡単に作成できます。
制約に関する注意
Infrastructure as Code は、インフラストラクチャや、コンテナまたはコンパイル済みコードなどの既存のアセットのデプロイに適しています。コンテナの構築に使用するツールは他にあり、Terraform はそのようなツールとは異なります。Terraform は、既存の設定において、コンテナが構築された後で行う手動デプロイの代わりとなります。もしくは、Cloud Build 構成のステップとして、既存の自動化に統合することも可能です。これは、継続的デプロイによる社内開発を行う場合に役立ちます。この構成の実装例については、「Terraform、Cloud Build、GitOps を使用してインフラストラクチャをコードとして管理する」をご確認ください。
複雑なデプロイについては、Terraform の使用をご検討ください。デプロイの信頼性が向上するだけでなく、実際のインフラストラクチャの構成設定をコードと一緒にソース管理に保存できます。
Terraform の活用例
デプロイ例として、Katie と Martin が Terraform を使用してサンプルの猫の識別サービスをデプロイする方法をご覧ください。
この動画と投稿で紹介されているアプリケーションは、GitHub の Serverless-Expeditions レポジトリの terraform-serverless フォルダで入手できます。
この動画では、Cloud Functions の関数と Cloud Run サービスを Cloud Storage バケットとともにデプロイし、さまざまな IAM 構成を使用してプロジェクトを迅速に稼働させます。続けて Google Cloud プロジェクトで何が作成されたかを確認し、Terraform によって再アサートされる変更を加えます。最後に、作成されたすべての Terraform リソースを破棄し、それらを再作成して、アプリケーションを復元します。
詳細:
https://cloud.google.com/solutions/managing-infrastructure-as-code
https://registry.terraform.io/providers/hashicorp/google/latest/docs
Serverless Expeditions シリーズのその他の動画も視聴してみる
Serverless Expeditions は、サーバーレスとは何か、そして Google Cloud を使用してサーバーレス アプリを構築する方法について、楽しく説明している動画シリーズです。
動画ホストの @glasnt と @martinomander をぜひフォローしてください。
-サーバーレス担当デベロッパー アドボケイト Katie McLaughlin