iimon TECH BLOG

iimonエンジニアが得られた経験や知識を共有して世の中をイイモンにしていくためのブログです

Atlantisを導入しました

導入したきっかけ

元々terraform applyはgithub actionsで実行していて、

その場合、pull requestをmargeしてから、applyが実行されるので、

applyが失敗したときにmarge元branchが汚れる、再度pull requestを作るのは手間という問題があり、それらを解決するためにAtlantisを導入しました。

デプロイした構成

Atlantis公式のdocker imageをECS Fargateでdeployしました。

Atlantis実装の流れ

  1. github appを設定する
  2. ECSにatlantisをデプロイ
  3. リポジトリにatlantis.yamlを配置

1. github appを設定

Build software better, together

上記のリンクにアクセス

(組織用に作成する場合はhttps://github.com/settings/organizationsのsettingsから、設定を行う)

General, Permissions, Subscribe to eventsを設定し、Create Github Appをクリック

General 入力値(例)
GitHub App name myapp
Homepage URL https://example.com
Webhook URL https://example.com/events

example.comの部分にRoute 53で作成したAtlantis用のurlを入れる

Permissions 設定値
Administration Read-Only
Checks Read and Write
Commit statuses Read and Write
Contents Read and Write
Issues
Read and Write
Metadata Read-Only
Pull requests Read and Write
Webhooks Read and Write
Subscribe to events
Check run
Create
Delete
Issues
Issue comment
Pull request
Pull request review
Pull request review comment
Push
  • コンテナで利用する変数を取得

github app作成後の画面(https://github.com/settings/apps/myapp)で

24 文字以上のrandomな文字列を作成し、WebhookWebhook secret (optional)の部分に入力

Private keysGenerate a private keyをクリックし、public keyを生成

コンテナ側の環境変数で使うのでApp ID, Webhook secret, public keyはSecrets managerに保存しておく。

  • インストール

Install App(https://github.com/settings/apps/myapp/installations)に移動し、github appをインストール

settingsのinstallationsに移動(https://github.com/settings/installations)し、先ほどインストールしたgithubのconfigureをクリック、

Repository accessOnly select repositoriesを選択しAtlantisを利用するリポジトリを選択

2. ECSにAtlantisをデプロイ

ATLANTIS_ALLOW_REPO_CONFIG true
ATLANTIS_ATLANTIS_URL https://example.com
ATLANTIS_GH_APP_ID 1で作成したgithub appのid
ATLANTIS_GH_APP_KEY 1で生成したpublic key
ATLANTIS_GH_WEBHOOK_SECRET 1で生成したwebhook secret
ATLANTIS_GITLAB_HOSTNAME gitlab.com
ATLANTIS_HIDE_PREV_PLAN_COMMENTS false
ATLANTIS_LOG_LEVEL debug
ATLANTIS_PORT 4141
ATLANTIS_REPO_ALLOWLIST github.com/組織名/*
ATLANTIS_REPO_CONFIG_JSON {"repos":[{"allow_custom_workflows":true,"allowed_overrides":["apply_requirements","workflow","delete_source_branch_on_merge","repo_locking","import_requirements"],"id":"/.*/","repo_config_file":"atlantis.yaml"}]}
ATLANTIS_WRITE_GIT_CREDS true
ATLANTIS_WEB_PASSWORD basic認証用のpassword
ATLANTIS_WEB_USERNAME basic認証用のusername

ATLANTIS_REPO_CONFIG_JSONではサーバー側のリポジトリ設定をインラインのJSONにして設定している

basic認証を行う場合は、albのtarget groupのhealth checkのpathを/healthzに設定しておく

3. リポジトリのrootにatlantis.yamlを配置

atlantis.yamlではbranch毎の設定や、自動plan、applyするための条件等の設定をお好みで行う。

ここまで完了したなら、あとはpull requestを出してコメントでatlantis versionと入力するとterraformのversionが返ってくるはず。

導入後の変更点

databaseのpasswordなどterraform実行時にgithub secretsから渡していたものを、terraformのコード上でSecrets ManagerやParameter Storeから取得するようにした。

Atlantisが便利な点

applyが失敗した時の変更が楽

githubのpull requestのapproveがないとapplyできない設定等もできる

atlantis apply等のコマンドの挙動をカスタムできる

github actionsに比べて、複数のrepogitoryに対して少ない重複でworkflowを設定できる

参考url

https://www.runatlantis.io/

https://github.com/runatlantis/atlantis

https://docs.github.com/ja/github-ae@latest/developers/apps/building-github-apps/creating-a-github-app

https://www.browserling.com/tools/random-string