SOPSで「aws_profile」パラメータを埋め込んで暗号化すると復号時に使うプロファイル名が固定される

記事タイトルとURLをコピーする

技術1課の水本です。

最近変わったIssueに出会いましたので備忘録です。またSOPSの記事です。

SOPSが何なのかは以下の記事からどうぞ。

blog.serverworks.co.jp

TL;DR

  • 暗号化ファイルにaws_profieというパラメータが含まれると、復号時にこのプロファイル名しか見ない
  • GitHub Actionのメジャーなクレデンシャル取得方法だと、プロファイル名の指定はできないためSOPSで復号ができない
  • 暗号化ファイルからaws_profieを消せば解決する

事象について

とあるデプロイワークフローをGitHub Actionsで作っている時に出会いました。

暗号化時の環境では、.sops.yamlを使ってAWS CLIのプロファイル名を指定しなくても使えるようにしていました。

このパラメータは暗号化ファイルにaws_profileをして埋め込まれます。

そして、このaws_profileが埋め込まれたファイルは、復号時にプロファイル名指定オプションを渡したとしても、必ずaws_profileを見に行くという挙動のようです。

具体的には下記のメッセージが出ます。

    - | Error decrypting key: NoCredentialProviders: no valid
      | providers in chain. Deprecated.
      |     For verbose messaging see
      | aws.Config.CredentialsChainVerboseErrors

何が問題なのか

プロファイル名を暗号化時のものに合わせれば解決するのですが、環境によってはそう簡単ににいかない場合があります。

特にGitHub Actionsで用いられるクレデンシャル取得のAction「aws-actions/configure-aws-credentials」はプロファイル名を指定できません。

例えば、環境設定ファイルを格納したリポジトリからファイルを取ってきたものの、復号できないということになります。

どうやら既にIssueが存在し、結論は出ていないようです。

github.com

回避方法

残念ですが、aws_profileの要素を削除してください。

暗号済みファイルを除いて中身がjsonなら、jqで削除可能です。

要素を削除した中間ファイルは、適切なKMS権限を有するプロファイルなら名前を問わず復号が可能です。

cat myfile.enc | jq '. | del(.sops.kms[0].aws_profile)' > myfile.temp

さいごに

Issueに出会ったときは絶望しましたが、何とかやりようがあって良かったです。

最後までお読みいただき、ありがとうございました。

水本 正敏(執筆記事の一覧)

クラウドインテグレーション部 技術1課

国内ITベンダーのカスタマーエンジニアからAWSに魅了されサーバーワークスへ。