導入したきっかけ
元々terraform applyはgithub actionsで実行していて、
その場合、pull requestをmargeしてから、applyが実行されるので、
applyが失敗したときにmarge元branchが汚れる、再度pull requestを作るのは手間という問題があり、それらを解決するためにAtlantisを導入しました。
デプロイした構成
Atlantis公式のdocker imageをECS Fargateでdeployしました。
Atlantis実装の流れ
1. github appを設定
- 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な文字列を作成し、WebhookのWebhook secret (optional)の部分に入力
Private keysのGenerate 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 accessでOnly 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