LINEで送る
Pocket

[DigitalOcean]Terraform開発環境構築とterraform applyをCircleCIのAPI経由でリリースするように実装してみた

先日書いたブログで、Terraformの開発環境は特に問題ないのですが、誰でもterraform applyをCircleCIのAPIで叩けてしまうことに対して懸念点がありました。その際inamuuさんにアドバイスをもらったところ、Orbsの path-filtering を利用すればTerraformのコードに差分が出ればterraform applyを実行できるとのことなので早速実装してみました。


構成

push時には terraform validate,plan が実行されて、terraformのディレクトリである terraform/env/prd に差分があれば path-filtering が検知して、masterマージすると terraform apply を実行してくれます。それでは以下CircleCIの修正箇所説明したいと思います。

https://discuss.circleci.com/t/setup-workflow/39578

ちなみにこの path-filteringsetup workflow(CircleCI 2.1)と呼ばれており、今年の3月にプレビュー版が出ていたようで現在は本リリース済みとなっています。@mfunakiさんが以下のようにまとめてもらっています。

・ダイナミック コンフィグ: 実行時にニーズに合うコンフィグを生成するようなスクリプトを定義できます。

・プレビルド ステップ: プレビルド ステップとして、実行時に何をビルドするのかを分析し、決定可能なステップを先行して実行できます。

 

セットアップ・ワークフローが有効であることが期待される領域の一つに、モノリポ(モノレポ)を活用いただいているお客様のサポートが挙げられます。Bazelのようなビルドツールを利用して、gitコマンドを実行して、変更のあったファイルを検出し、複雑な依存関係を分析した上で、複数あるコンフィグファイルを組み合わせて実行しているといった、さまざまなモノリポのユースケースにおいて、それぞれ異なるジョブを利用することが可能になります。各機能はOrbsの中に組み込んでおくことで、必要な機能を再利用することが容易になります。CircleCIでは、パス フィルタリングを行うOrbを今回リリースします。このOrbを使うことで、Push時にどのファイルが変更されたのかに応じて、パラメータを設定することが可能になります。例えば、どのワークフローを実行するのかを、引き続き実行されるワークフローに対してパラメータとして渡すことが可能になります。


CircleCI

https://circleci.com/developer/ja/orbs/orb/circleci/path-filtering

  • 準備

Project Settings > Advanced Settings

  • .circleci/config.yml

まずはOrbsを追加しましょう。~省略~ の部分はjobsを使ってterraform validate,planの宣言と処理を書いている想定とします。workflowsに path-filtering の処理を追加します。path-filteringを利用する場合は必ず別ファイルでconfigファイルが必要となります。そのファイルにはterraform applyを実行する処理を以下のファイルに移行しました。base-revisionではデフォルトはmainブランチなのでmasterブランチのコードと比較するように指定します。またmappingには検知して欲しいディレクトリ配下を指定して以下に出てくる pipeline.parameterstrue つまり差分があればapplyするように仕込みます。

  • .circleci/terraform_apply.yml

ここでは新たに terraform_difference というjobを作成しました。これはCircleCIの仕様で以下差分がないときにmappingに検知されず、全てのパラメータはdefaultのfalseが返ってきてしまうという動作になってしまうため、実行するworkflowがない場合はエラーとなります。なのでわざわざechoでtrueを返すように作りました。ここはわざわざjob作る工程をなくしてほしい…それ以外はworkflowsでpipeline.parametersによるmasterマージ後に発動するように作るだけです。

All Workflows have been filtered from this Pipeline.No Jobs have been run.


Test

差分がないときはpath-filteringとcheck_terraform_differenceが動作してmaster merge時にterraform applyが実行されていません。

そして差分がある場合はmasterマージでterraform applyされていることが分かります。

ちなみに以下 Max number of workflows exceeded." error というエラーが出る場合は setup: true が付いていることによって複数のworkflowが無効化になります。その場合はデプロイ系は全て別ymlに移行して、single workflowにすれば可能です。

https://support.circleci.com/hc/en-us/articles/360060934851–Max-number-of-workflows-exceeded-error


まとめ

これはめちゃくちゃ便利でした!このpath-filteringを利用することでTerraformのリリースもより安全に運用することができました。他にも、例えば一つのリポジトリに複数のコードが存在した場合(モノレポ)、差分があればリリースするような仕組みも簡単に応用できますね。わざわざリポジトリ分割もする必要がありません。(Lambdaとか)あとはTerraform CIはOrbsに移行するかな…

それとハマったのは以下のエラーでworkflowsではなくjobs配下にpath-filteringの設定を書かないととまったく動かないので注意しましょう。

Cannot find a definition for command named path-filtering/filter

ちなみに以前書いたブログでもpath-filteringに移行すればシンプルになるじゃん!

[CircleCI]特定のディレクトリに差分があったらcircleci step haltでjobを終了する

LINEで送る
Pocket

カテゴリー: CircleCITerraform

adachin

1989年生まれのLancers SRE。 ホスティングから大規模なアドテクなどのインフラエンジニアとして携わる。好きなツールはAnsible,Terraform,CircleCIで、ECS/Fargateでのインフラ構築を得意とする。副業では数社サーバー保守とベンチャー企業のインフラ改善やMENTAで未経験者にインフラのコーチングを実施している。また、「脆弱性スキャナVuls」のOSS活動もしており、自称エバンジェリスト/技術広報/テクニカルサポート/コントリビュータでもある。現在はサービスの信頼性向上、可用性、レイテンシ、パフォーマンス、モニタリング、緊急対応、インフラコード化、リファクタリング、セキュリティ強化、新技術の検証、Docker開発環境の提供、AWSでのインフラ構築、ECS/Fargateへ移行、CakePHP4での管理画面作成、メンター、分析基盤の運用を担当している。

0件のコメント

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください