■ はじめに
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