1Passwordに保持したCredentialを利用コマンドの直前に流し込む方法

手法

.env.deploy に 1Password 参照を並べる。

# .env.deploy
AWS_ACCOUNT_ID=op://your-vault/your-item/AWS_ACCOUNT_ID
AWS_ACCESS_KEY_ID=op://your-vault/your-item/AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY=op://your-vault/your-item/AWS_SECRET_ACCESS_KEY

op run --env-file で実行コマンドを包む。

op run --env-file=.env.deploy -- npx cdk deploy

.env.deploy 自体は secret を含まないのでリポジトリにコミットしてよい。op run 起動時に op:// 参照が解決され、子プロセス (npx cdk) の環境変数として注入される。親シェルや ~/.aws/credentials には書き残らない。

普段使いするなら package.json の scripts に仕込んでおく。

{
  "scripts": {
    "synth":  "op run --env-file=../.env.deploy -- npx cdk synth",
    "diff":   "op run --env-file=../.env.deploy -- npx cdk diff",
    "deploy": "op run --env-file=../.env.deploy -- npx cdk deploy"
  }
}

pnpm deploy を叩いた瞬間にだけ touch ID が出て credential が環境変数に流し込まれる。

動機: 以前書いた .envrc 方式が cd のたびに認証要求してくる

以前 Credentialsを含む環境変数を1passwordで管理しdirenvでディレクトリごとに読み込む方法 という記事を書いた。direnv で .envrc をフックして、op item get + jq でフィールドを抜いて shell に export する方式。

この方法だと、プロジェクトディレクトリに cd するたびに touch ID が要求され、cd 後にプロンプトが返ってくるまで数十秒かかって面倒であった。

credential が必要なのは cdk deploy のような特定コマンドを叩く瞬間だけで、それ以外の時間に process.env へ常駐している必要はない。op run --env-file なら「コマンド単位」でロードできるので、cd は何も起きないままで、pnpm deploy した瞬間だけ touch ID が出る形になる。

注意: サプライチェーン攻撃には無力なので過信しない

最近よくある npm のサプライチェーン攻撃 — postinstall や malicious dependency が process.env を漁って token を盗むタイプ — に対して、この方式は無力。op run -- npx cdk deploy の execution tree の中で npm install の postinstall が走れば、env はそのまま継承されて見えてしまう。

今回の op run 化は cd 時の認証地獄から解放されるというUX改善が目的でありセキュリティ改善には寄与していない。

セキュリティ的に良い方法を知っている方がいたら教えてください。

この記事をシェア

2020-2026
弊社では、一緒に会社を面白くしてくれる仲間を募集しています。
お気軽にお問い合わせください!
P.S. よろしければこちらもどうぞ
新明工業クラシックカーレストア blog — クラシックカーのレストアのお仕事の一部を公開しています。
新明工業コンベア blog — コンベアに関する技術情報を発信しています。