Github Actions Environmentにおける注意点
GitHub Environmentとは
Github Actionsでは、Yamlファイル外から参照できる変数(secretとvariable)が提供されてます。
Actions内で頻繁に再利用される変数はここでまとめよう、という便利機能です。
しかし、例えば、開発環境と検証環境で同じCIを回す場合、異なる変数をさす必要があるが、変数名だけが違う同じYamlを量産するのはDRYじゃないですね。
そこで、CIの起動時にどの環境(environment)の変数を指すか指定することで、クールなCIが可能になる。
正式名称がEnvironmentっていうふわっとした名前なのでここではActions変数
と呼称します。
問題点その1 : Production環境での変数アクセスを制限している場合、何かと不便
例えば、本番環境の操作をリリースブランチでのActionsのみ許可している、といったことはよくあると思います。
(CIは条件が整えば勝手にキックされてしまうので、もしもの安全バーは大事ですね)
terraform plan
を実行する際ProductionのActions変数
にアクセスし、認証情報を取得する必要があります。
しかし、PRの段階(開発ブランチ)でPlanの結果を
などで参照できる仕組みを実現したい場合、変数アクセスする必要があり、矛盾が生じます。
解決策
正直、スマートな解決策はあまりなく、妥協案として
Github Environmentに
- 本番環境
- 本番環境(読み取りのみ) ←New
- 検証環境
を作りましょう。
ただ、実際TerraformなどAWSやGCPに読み取りでアクセスするし、本番環境に影響がないことを保証することは難しく、CIで使用するIAMを作り込む必要があります。
問題点その2:Workload Identityだと厳密にアクセスコントロールができない。
最近の認証方法としてトークンを介さないWorkload Identity認証が主流になりつつあります。
簡単に言うと、認証側がホワイトリスト的にドメインなどを指定して、許可する方法で、アクセスする側(CI)は非認証情報であるIDをもとに認証する仕組みです。
これを使うと、CI全体として許可されるため、
IDを知ってしまえば、どのブランチでも認証できてしまう。
(とはいえ、過剰に気にしすぎているきもしますが)
解決策
Workload Identityはドメインだけでなく、Gitのリポジトリ、ブランチ、Actionsワークフローなどを指定できます。
厳密にやる or モノリポでやる、などの要件でやる場合は検討しましょ
結論
Github Environment 微妙じゃない?
Discussion