目次
概要
- 案件でSOPSを用いた環境変数の連携をCircleCI使ってやったときのメモ
- コミュニティOrbが禁止されているCircleCIプロジェクトにおいて自分で実装する
コミュニティOrbを使っても良いプロジェクトの場合、そっちで実装したほうが楽です。
サンプルコード
- 暗号キーはAWS KMSを用いた
- 対象のアプリケーションはNuxtだったので、
.env
ファイルを暗号化状態でS3に格納し、別リポジトリで復元して連携している - 抜粋なのでそのまま動くかの保証はないです。適宜調整のこと
CircleCI
- workflowは割愛
- 実環境ではこれらのジョブの他、aws-ecs、aws-ecrのOrbも使用してECRへのイメージpush、ECSの更新を行っている
version: 2.1
orbs:
aws-cli: circleci/aws-cli@2.0.3
jobs:
fetch_dotenv:
executor: aws-cli/default
steps:
- aws-cli/setup
- run:
name: "Get dotenv from S3"
command: |
set -x
mkdir /var/tmp/appname-dotenv
aws s3 cp s3://appname-credentials/dotenv/ /var/tmp/appname-dotenv --recursive
- save_cache:
key: appname-dotenv-{{ .Environment.CIRCLE_SHA1 }}
paths:
- "/var/tmp/appname-dotenv"
decrypt_detenv:
executor: aws-cli/default
steps:
- restore_cache:
key: appname-dotenv-{{ .Environment.CIRCLE_SHA1 }}
- aws-cli/setup:
profile-name: hogehoge
- run:
name: "Download SOPS"
command: |
wget https://github.com/mozilla/sops/releases/download/v3.7.1/sops-v3.7.1.linux -O ~/sops
chmod +x ~/sops
- run:
name: "Decrypt resource"
command: |
~/sops --decrypt "/var/tmp/appname-dotenv/frontend-${CIRCLE_BRANCH}.enc.env" > "/var/tmp/appname-dotenv/frontend-${CIRCLE_BRANCH}.env"
- save_cache:
key: appname-dotenv-{{ .Environment.CIRCLE_SHA1 }}-decrypted
paths:
- "/var/tmp/appname-dotenv"
SOPS
- AWS KMSを用いて暗号化する
- aws_profileはAWS CLIのプロファイル名。開発環境の都合上、明示的に指定した
- 復号環境にも同名のプロファイルが必須なので注意
- このファイルがあるディレクトリにてsops -e hoge.env > hoge.enc.envとすることで暗号化する
creation_rules:
- kms: "arn:aws:kms:ap-northeast-1:123123123:alias/appname_kms_for_sops"
aws_profile: "hogehoge"
実装してみて
- AWS CLI環境は無理せずOrb(CircleCI公式)でサクッと実装するのがベスト
- SOPSはコミュニティOrbがあったが、案件のCircleCIはコミュニティOrbが禁止で使えなかった為、素直に実装した(手順も少ないので)
- リポジトリには、.envは無視するが.enc.envは無視しないという
.gitignore
を記載すること