SOPSをCircleCIで使うサンプル

目次

概要

  • 案件でSOPSを用いた環境変数の連携をCircleCI使ってやったときのメモ
  • コミュニティOrbが禁止されているCircleCIプロジェクトにおいて自分で実装する

コミュニティOrbを使っても良いプロジェクトの場合、そっちで実装したほうが楽です。

サンプルコード

  • 暗号キーはAWS KMSを用いた
  • 対象のアプリケーションはNuxtだったので、.envファイルを暗号化状態でS3に格納し、別リポジトリで復元して連携している
  • 抜粋なのでそのまま動くかの保証はないです。適宜調整のこと

CircleCI

  • workflowは割愛
  • 実環境ではこれらのジョブの他、aws-ecsaws-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を記載すること
目次
閉じる