神戸学院大学 経営学部 林坂ゼミ

Docker 入門トップページ

« 戻る 次へ »

Docker 入門

Elasticsearch で全文検索を実行する(Windows PowerShell 7 版)

API キーのシェル変数化

これまでに示したコマンドでは curl コマンドの中に API キーを含めていました.この API キーはインストールするたびに異なる値になります.したがって,この Web ページから利用するコマンドをコピーしても毎回 API キーを編集しなければコマンドを実行できないという面倒な部分があります.

ここでは .env ファイルに記載された API キーをシェル変数に読み込んで変数化します.その上で,curl コマンドには API キーの変数名を入力するようにします.これによって,API キーが異なっていてもこの Web ページに記載されたコマンドをそのままコピー&ペーストすれば検索などの様々な処理を実行できるようになります.

まず,次のとおり .env ファイルに API キーが記載されていることを確認します.

.env
# Copy this file to .env and replace placeholder values with actual secrets.
START_LOCAL_VERSION=0.12.0
ES_LOCAL_VERSION=9.2.1
ES_LOCAL_CONTAINER_NAME=es-local-dev
ES_LOCAL_PASSWORD=rs8O0QpW
ES_LOCAL_PORT=9200
ES_LOCAL_URL=http://localhost:${ES_LOCAL_PORT}
ES_LOCAL_DISK_SPACE_REQUIRED=1gb
ES_LOCAL_JAVA_OPTS="-Xms128m -Xmx2g"
ES_LOCAL_API_KEY=NlZGY3pwb0IyT1FPR1RNREtrRlc6WG1VUmZnVnYxSmYyMlpFMDQwTHJ6UQ==

この Web サイトからはコマンドをコピーできますが,その後毎回のように API キーを書き換えるのは面倒です.

curl -H "Authorization: ApiKey NlZGY3pwb0IyT1FPR1RNREtrRlc6WG1VUmZnVnYxSmYyMlpFMDQwTHJ6UQ==" "http://localhost:9200/"

まず,シェル変数 Env:ES_LOCAL_API_KEY などに値がセットされていないことを確認します.なお,シェル変数の詳細はこちらを参照してください.

PS C:\...\elastic202511> Write-Output "${Env:ES_LOCAL_API_KEY}" ⏎

PS C:\...\elastic202511>

次のようなコマンドでシェル変数に値を設定することはできますが,やはりコマンドの一部を .env に記載された値に変更しなければなりません(その後は利用しないので,別の変数名にしています).

PS C:\...\elastic202511> Write-Output "${Env:API_KEY}" ⏎

PS C:\...\elastic202511> ${Env:API_KEY} = "NlZGY3pwb0IyT1FPR1RNREtrRlc6WG1VUmZnVnYxSmYyMlpFMDQwTHJ6UQ==" ⏎
PS C:\...\elastic202511> Write-Output "${Env:API_KEY}" ⏎
NlZGY3pwb0IyT1FPR1RNREtrRlc6WG1VUmZnVnYxSmYyMlpFMDQwTHJ6UQ==
PS C:\...\elastic202511>

PowerShell で .env ファイルからシェル変数に読み込むためのスクリプトを作成します.

load-env.ps1
# load-env.ps1(5.1/7 互換)
Get-Content .env | ForEach-Object {
    $_ = $_.Trim()
    if (-not $_ -or $_.StartsWith('#')) { return }  # 空行・コメント

    if ($_ -match '^(.*?)=(.*)$') {
        $name  = $matches[1].Trim()
        $value = $matches[2].Trim()

        # 値が "..." で囲われていたら外す(必要に応じて)
        if ($value -match '^"(.*)"$') { $value = $matches[1] }

        # ${VAR} を既存の環境変数で展開(順次設定していく前提)
        $pattern = '\$\{([A-Za-z_][A-Za-z0-9_]*)\}'
        $value   = [regex]::Replace($value, $pattern, {
            param($m)  # ← .NET の Match オブジェクトが入る(5.1/7 どちらもOK)
            $varName = $m.Groups[1].Value
            $item    = Get-Item -Path "Env:$varName" -ErrorAction Ignore
            if ($item) { $item.Value } else { '' }  # 未定義なら空文字
        })

        # 同一セッションに反映(動的名対応)
        Set-Item -Path "Env:$name" -Value $value
    }
}

このスクリプトを動作させるとシェル変数が利用できるようになります.

PS C:\...\elastic202511> .\load-env.ps1 ⏎
PS C:\...\elastic202511> Write-Output "${Env:ES_LOCAL_API_KEY}" ⏎
NlZGY3pwb0IyT1FPR1RNREtrRlc6WG1VUmZnVnYxSmYyMlpFMDQwTHJ6UQ==
PS C:\...\elastic202511>

API キーをそのまま埋め込むコマンドをもう一度示します.

curl -H "Authorization: ApiKey NlZGY3pwb0IyT1FPR1RNREtrRlc6WG1VUmZnVnYxSmYyMlpFMDQwTHJ6UQ==" "http://localhost:9200/"

上のコマンドに含まれる API を変数 ${Env:ES_LOCAL_API_KEY} に書き換えたコマンドを示します.

curl -H "Authorization: ApiKey ${Env:ES_LOCAL_API_KEY}" "http://localhost:9200/?pretty"

上のコマンドを実行するとこれまでと同様に接続できることが分かりました.

PS C:\...\elastic202511> curl -H "Authorization: ApiKey ${Env:ES_LOCAL_API_KEY}" "http://localhost:9200/?pretty" ⏎
{
  "name" : "64a6250ff75e",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "eV0E_uSCRPSQH0_NXae1hA",
  "version" : {
    "number" : "9.2.1",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "4ad0ef0e98a2e72fafbd79a19fa5cae2f026117d",
    "build_date" : "2025-11-06T22:07:39.673130621Z",
    "build_snapshot" : false,
    "lucene_version" : "10.3.1",
    "minimum_wire_compatibility_version" : "8.19.0",
    "minimum_index_compatibility_version" : "8.0.0"
  },
  "tagline" : "You Know, for Search"
}
PS C:\...\elastic202511>

なお,PowerShell においてコマンドの途中で改行したい場合は,改行の直前に「`」を入力します.

curl -H "Authorization: ApiKey ${Env:ES_LOCAL_API_KEY}" `
  `
  "http://localhost:9200/?pretty"

以降の説明では変数を用いたコマンドを利用します.これにより API キーをその都度書き換える必要がなくなり,コマンドをコピー&ペーストするだけで動作するようになります.

目次に戻る