【トラブル】【Airflow】MWAA で Secrets Manager の設定追加後にAirflow CLIからエラー

■ はじめに

MWAA で 軽微なトラブルだったが
学びが色々とあったので、メモっておく

今日の教訓

Python 製 で JSON は、
シングルクォーテーション(')ではなく
ダブルクォーテーション(")で囲んだ方が
トラブル少なく済みそう

【1】現象

 MWAA で Secrets Manager を使用したかったので
以下の公式ドキュメント

https://docs.aws.amazon.com/mwaa/latest/userguide/connections-secrets-manager.html

を参考にAirflow configuration optionsに以下の設定を追加した。
Key Value
secrets.backend airflow.providers.amazon.aws.secrets.secrets_manager.SecretsManagerBackend
secrets.backend_kwargs {'connections_prefix' : 'airflow/connections', 'variables_prefix' : 'airflow/variables'}
その後、以下の関連記事にあるやり方で、
Airflow CLIで Airflow VariablesにKEY1=VALUE1を追加したところ
(以下「1)使用したスクリプト」および「2)実行したコマンド」を参照)
意図した値は反映されていたのだが、エラー出力に値が返却されてきた

https://dk521123.hatenablog.com/entry/2023/12/28/002530

1)使用したスクリプト

https://medium.com/dnx-labs/how-to-use-apache-airflow-cli-with-amazon-mwaa-a773edfa0a45

と同じスクリプト。

airflow-cli-for-mwaa.sh

#!/bin/bash

# Check if user provided arguments
if [ "$*" = "" ]; then
     echo "Provide at least one argument to the Airflow CLI";
     exit 1;
fi

# Check if environment variable MWAA_ENVIRONMENT is provided
if [ "$MWAA_ENVIRONMENT" = "" ]; then
     echo "Provide the name of your environment in variable \$MWAA_ENVIRONMENT";
     exit 1;
fi

# Get CLI token and web server hostname from AWS MWAA CLI
CLI_JSON=$(aws mwaa create-cli-token --name $MWAA_ENVIRONMENT)

# Parse results
CLI_TOKEN=$(echo $CLI_JSON | jq -r '.CliToken')
WEB_SERVER_HOSTNAME=$(echo $CLI_JSON | jq -r '.WebServerHostname')

# Trigger request of Airflow CLI from Amazon MWAA
RESPONSE=$(curl -s --request POST "https://$WEB_SERVER_HOSTNAME/aws_mwaa/cli" \
     --header "Authorization: Bearer $CLI_TOKEN" \
     --header "Content-Type: text/plain" \
     --data-raw "$*")

# Check if we have a valid JSON to be parsed...
if jq -e . >/dev/null 2>&1 <<<"$RESPONSE"; then
     # If JSON is valid then get stdout and stderr
     STDOUT=$(echo $RESPONSE | jq -r '.stdout')
     STDERR=$(echo $RESPONSE | jq -r '.stderr')

     # Decode the results from Base64
     echo $STDOUT | base64 -d

     if [ "$STDERR" != "" ]; then
          echo "Error:"
          echo $STDERR | base64 -d
     fi
else
     # In case of invalid JSON just return the message to the terminal
     echo $RESPONSE
fi

2)実行したコマンド

# export MWAA_ENVIRONMENT="MWAA名"
export MWAA_ENVIRONMENT="your-mwaa-name"

# Airflow CLIで Airflow VariablesにKEY1=VALUE1を追加
./airflow-cli-for-mwaa.sh variables set KEY1 VALUE1

【2】エラー内容

Error:
Failed to parse [secrets] backend_kwards as JSON, defaulting to no kwargs.

【3】原因

Airflow configuration options の JSON部分は、
シングルクォーテーション(')で囲っていたため

【誤】

secrets.backend_kwargs:
{'connections_prefix' : 'airflow/connections', 'variables_prefix' : 'airflow/variables'}

【正】

secrets.backend_kwargs:
{"connections_prefix" : "airflow/connections", "variables_prefix" : "airflow/variables"}

もう少し深堀りすると、、、

以下の関連記事でも触れたが、少し触れたが

https://dk521123.hatenablog.com/entry/2019/10/19/104805

Pythonだと、シングルクォーテーションではないとJSONとして取り扱われず
JSONをパースするときに例外が発生する可能性がある

【4】解決案

Airflow configuration options の JSON部分は、
ダブルクォーテーション(")で囲む

secrets.backend_kwargs:
{"connections_prefix" : "airflow/connections", "variables_prefix" : "airflow/variables"}

関連記事

MWAA ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2021/09/29/131101
MWAA ~ Variable ~
https://dk521123.hatenablog.com/entry/2023/12/28/002530
MWAA に関するトラブルシュート
https://dk521123.hatenablog.com/entry/2021/10/08/145311
Python ~ 基本編 / JSON
https://dk521123.hatenablog.com/entry/2019/10/19/104805