JavaScriptを有効にしてください

【Docker】LocalStackでAWS Secrets Managerを使用、初期設定のメモ

 ·  ☕ 3 分で読めます

【Docker】LocalStackでAWS Secrets Managerを使用、初期設定のメモ

Dockerを使用してLocalStackを設定し、起動時にJSONファイルからシークレットを読み込んでAWS Secrets Managerに設定するシェルスクリプトを紹介します。

LocalStackはAWSクラウドのスタブをローカルで実行できるツールで、開発およびテスト環境に最適です。また、AWS CLIを使用してシークレットの設定と確認を行うコマンドも紹介します。

Docker Composeファイルの作成

まず、LocalStackを設定するためのdocker-compose.ymlファイルを作成します。このファイルでは、LocalStackサービスを定義し、必要な環境変数を設定します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
version: '3.8'

services:
  localstack:
    image: localstack/localstack
    ports:
      # シークレットマネージャー用ポート
      - "4566:4566"
    environment:
      # 使用サービス(シークレットマネージャー
      - SERVICES=secretsmanager
      # AWS 設定値
      - AWS_ACCESS_KEY_ID=dummy
      - AWS_SECRET_ACCESS_KEY=dummy
      - AWS_DEFAULT_REGION=us-east-1
      - AWS_DEFAULT_OUTPUT=json
    volumes:
      # localstack データを永続化
      - ../.data/localstack:/var/lib/localstack
      # localstack hook
      # https://docs.localstack.cloud/references/init-hooks/
      - ./localstack:/etc/localstack/init

hook

初期化スクリプトの前にhookの設定ディレクトリの説明です。
コンテナ側のディレクトリにシェルスクリプトもしくはPythonを配置することで各タイミングで実行してくれるとのことです。

/etc
└── localstack
    └── init
        ├── boot.d           <-- コンテナ実行時(LocalStack開始前
        ├── ready.d          <-- LocalStack リクエスト準備完了
        ├── shutdown.d       <-- LocalStack シャットダウン時
        └── start.d          <-- Python プロセスが実行中、LocalStack開始

初期化シェルスクリプトの作成

次に、LocalStack起動時に実行される初期化スクリプトを作成します。このスクリプトは、JSONファイルからシークレットを読み込み、AWS Secrets Managerに登録します。

/etc/localstack/init/start.d/init_secrets.sh

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/bin/bash

echo 'START INIT SECRET!!'

# Install jq
apt-get update && apt-get install -y jq

# Wait for LocalStack to be ready
until curl -s http://localhost:4566/health | jq -e '.services.secretsmanager == "running"' > /dev/null; do
  echo "Waiting for LocalStack to be ready..."
  sleep 5
done

# Get the current directory
CURRENT_DIR=$(dirname "$0")

# Load JSON configuration file
CONFIG_FILE="${CURRENT_DIR}/config.json"
CONFIG_CONTENT=$(cat $CONFIG_FILE)

# Iterate over keys and create secrets
for key in $(echo "${CONFIG_CONTENT}" | jq -r 'keys[]'); do
    value=$(echo "${CONFIG_CONTENT}" | jq -r ".${key}")
    
    # Check if the value is an array or an object
    if echo "${value}" | jq -e 'type == "array" or type == "object"' > /dev/null; then
        # JSON format: no double quotes
        echo "key:${key}"
        echo "value:${value}"
        aws --endpoint-url=http://localhost:4566 secretsmanager create-secret --name "${key}" --secret-string "${value}"
    else
        # String format: add double quotes
        echo "key:${key}"
        echo "value:${value}"
        aws --endpoint-url=http://localhost:4566 secretsmanager create-secret --name "${key}" --secret-string "\"${value}\""
    fi
done


echo 'END INIT SECRET!!'
exit 0

JSON設定ファイルの準備

初期化スクリプトが読み込むJSON設定ファイルを作成します。このファイルには、登録したいシークレットを定義します。

/etc/localstack/init/start.d/config.json

シェルと同一の場所に配置します。

最上位の名前 MySecretKey1 がシークレット名になるようにしています。

1
2
3
4
5
6
7
8
{
    "MySecretKey1": "MySecretValue1",
    "MySecretKey2": "MySecretValue2",
    "MySecretKey3": {
        "username": "myuser",
        "password": "mypassword"
    }
}

コンテナの起動とシークレットの初期化

すべてのファイルを準備したら、以下のコマンドを実行してDocker Composeを使用してコンテナを起動します。LocalStackが起動し、初期化スクリプトが実行されてシークレットが設定されます。

1
docker-compose up

AWS CLIでのシークレットの設定と確認

シークレットが正しく設定されていることを確認するために、AWS CLIを使用してシークレットのリストと詳細を取得するコマンドを実行します。

シークレットのリストを取得

以下のコマンドを実行して、登録されているすべてのシークレットのリストを取得します。

1
aws --endpoint-url=http://localhost:4566 secretsmanager list-secrets

シークレットの詳細を取得

特定のシークレットの詳細を確認するために、シークレット名を指定して以下のコマンドを実行します。

1
aws --endpoint-url=http://localhost:4566 secretsmanager describe-secret --secret-id MySecretKey1

シークレットの値を取得

シークレットの値を取得するには、以下のコマンドを実行します。

1
aws --endpoint-url=http://localhost:4566 secretsmanager get-secret-value --secret-id MySecretKey1

これで、LocalStack上のAWS Secrets Managerにシークレットが設定されていることを確認できます。

参考

共有

こぴぺたん
著者
こぴぺたん
Copy & Paste Engineer