Apache Airflow 接続を秘密 AWS Secrets Manager を使用して構成する - Amazon Managed Workflows for Apache Airflow

Apache Airflow 接続を秘密 AWS Secrets Manager を使用して構成する

AWS Secrets Manager は、Amazon Managed Workflows for Apache Airflow (Amazon Managed Workflows) 環境でサポートされています。このトピックでは、Amazon Managed Workflows for Apache Airflow 上の Apache Airflow 変数および Apache Airflow 接続のために AWS Secrets Manager を使用して秘密を安全に保存する方法を説明します。

注記

ステップ 1: Amazon MWAA にSecrets Manager のシークレットキーにアクセスする権限を付与する

Amazon MWAA 環境の 実行ロール には、AWS Secrets Manager 内のシークレットキーへの読み取りアクセス権が必要です。次の IAM ポリシーでは、AWS マネージド SecretsManagerReadWrite ポリシーを使用して読み取り/書き込みアクセスを許可します。

実行ロールにポリシーを添付するには
  1. Amazon MWAA コンソールで、環境ページ を開きます。

  2. 環境を選択します。

  3. アクセス許可 ペインで実行ロールを選択します。

  4. ポリシーの添付 を選択します。

  5. [Filter policies] (フィルターポリシー) テキストフィールドに SecretsManagerReadWrite をタイプ。

  6. ポリシーの添付 を選択します。

AWS で管理されたアクセス権限ポリシーを使用したくない場合は、環境の実行ロールを直接更新して、Secrets Manager リソースへの任意のレベルのアクセスを許可できます。例えば、次のポリシーステートメントは、SecretsManager の特定の AWS リージョン で作成したすべてのシークレットへの読み取りアクセスを許可します。

JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:GetResourcePolicy", "secretsmanager:GetSecretValue", "secretsmanager:DescribeSecret", "secretsmanager:ListSecretVersionIds" ], "Resource": "arn:aws:secretsmanager:us-east-1:111122223333:secret:*" }, { "Effect": "Allow", "Action": "secretsmanager:ListSecrets", "Resource": "*" } ] }

ステップ 2: Secrets Manager のバックエンドを Apache Airflow 設定オプションとして作成する

次のセクションでは、Amazon MWAA コンソールで AWS Secrets Manager バックエンド用の Apache Airflow 設定オプションを作成する方法について説明します。airflow.cfg で同じ名前の設定を使用している場合は、次のステップで作成した設定が優先され、設定よりも優先されます。

  1. Amazon MWAA コンソールで、環境ページ を開きます。

  2. 環境を選択します。

  3. 編集 を選択します。

  4. 次へ を選択します。

  5. Airflow 設定オプション ペインで カスタム設定を追加 を選択します。以下のキーと値のペアを追加します。

    1. secrets.backend: airflow.providers.amazon.aws.secrets.secrets_manager.SecretsManagerBackend

    2. secrets.backend_kwargs: {"connections_prefix" : "airflow/connections", "variables_prefix" : "airflow/variables"} これにより、Apache Airflow は接続文字列と変数を airflow/connections/* および airflow/variables/* のパスで検索するように設定されます。

      ルックアップパターン を使用すると、Amazon MWAA がユーザーに代わって Secrets Manager に対して行う API 呼び出しの数を減らすことができます。検索パターンを指定しない場合、Apache Airflow は設定されたバックエンドのすべての接続と変数を検索します。パターンを指定することで、Apache Airflow が検索する可能性のあるパスを絞り込むことができます。これにより、Amazon MWAA でSecrets Manager を使用する場合のコストを削減できます。

      ルックアップパターンを指定するには、connections_lookup_pattern および variables_lookup_pattern パラメータを指定します。これらのパラメータは、RegEx 文字列を入力として受け入れます。例えば、test で始まるシークレットを検索するには、secrets.backend_kwargs に次のように入力します。

      { "connections_prefix": "airflow/connections", "connections_lookup_pattern": "^test", "variables_prefix" : "airflow/variables", "variables_lookup_pattern": "^test" }
      注記

      connections_lookup_pattern および variables_lookup_pattern を使用するには、apache-airflow-providers-amazon バージョン 7.3.0 以上をインストールする必要があります。プロバイダパッケージを新しいバージョンに更新する方法の詳細については、制約ファイル を参照してください。

  6. 保存 を選択します。

ステップ 3: Apache Airflow AWS 接続の URI 文字列を生成します。

接続」文字列を作成するには、キーボードの 「tab」 キーを使用して Connection オブジェクトのキーと値のペアをインデントします。また、シェルセッションで extra オブジェクト用の変数を作成することをおすすめします。以下のセクションでは、Apache Airflow または Python スクリプトを使用して Amazon MWAA 環境用の Apache Airflow 接続 URI 文字列を生成する手順を順を追って説明します。

Apache Airflow CLI

次のシェルセッションでは、ローカル Airflow CLI を使用して接続文字列を生成します。CLI がインストールされていない場合は、Python スクリプトの使用をお勧めします。

  1. Python シェルセッションを開きます。

    python3
  2. 次のコマンドを入力します。

    >>> import json
  3. 次のコマンドを入力します。

    >>> from airflow.models.connection import Connection
  4. シェルセッションに extra オブジェクト用の変数を作成します。YOUR_EXECUTION_ROLE_ARN のサンプル値を、実行ロール ARN と us-east-1 内のリージョン (us-east-1 など) に置き換えてください。

    >>> extra=json.dumps({'role_arn': 'YOUR_EXECUTION_ROLE_ARN', 'region_name': 'us-east-1'})
  5. 接続オブジェクトを作成します。myconn のサンプル値を Apache Airflow 接続の名前に置き換えてください。

    >>> myconn = Connection(
  6. キーボードの tab キーを使用して、接続オブジェクト内の以下のキーと値のペアをそれぞれインデントします。サンプル値をで置き換えてください。

    1. AWS 接続タイプを指定します。

      ... conn_id='aws',
    2. Apache Airflow データベースオプションを指定します。

      ... conn_type='mysql',
    3. Amazon MWAA の Apache Airflow UI URL を指定してください。

      ... host='288888a0-50a0-888-9a88-1a111aaa0000.a1.us-east-1.airflow.amazonaws.com/home',
    4. Amazon MWAA にログインするための AWS アクセスキー ID (ユーザー名) を指定します。

      ... login='YOUR_AWS_ACCESS_KEY_ID',
    5. Amazon MWAA にログインするための AWS シークレットアクセスキー (パスワード) を指定します。

      ... password='YOUR_AWS_SECRET_ACCESS_KEY',
    6. extra シェルセッション変数を指定します。

      ... extra=extra
    7. 接続オブジェクトを閉じます。

      ... )
  7. 接続 URI 文字列を出力します。

    >>> myconn.get_uri()

    レスポンスの接続 URI 文字列を参照します。

    'mysql://288888a0-50a0-888-9a88-1a111aaa0000.a1.us-east-1.airflow.amazonaws.com%2Fhome?role_arn=arn%3Aaws%3Aiam%3A%3A001122332255%3Arole%2Fservice-role%2FAmazonMWAA-MyAirflowEnvironment-iAaaaA&region_name=us-east-1'
Python script

次の Python スクリプトは、Apache Airflow CLI を必要としません。

  1. 以下のコードサンプルの内容をコピーし、ローカルに mwaa_connection.py として保存します。

    import urllib.parse conn_type = 'YOUR_DB_OPTION' host = 'YOUR_MWAA_AIRFLOW_UI_URL' port = 'YOUR_PORT' login = 'YOUR_AWS_ACCESS_KEY_ID' password = 'YOUR_AWS_SECRET_ACCESS_KEY' role_arn = urllib.parse.quote_plus('YOUR_EXECUTION_ROLE_ARN') region_name = 'us-east-1' conn_string = '{0}://{1}:{2}@{3}:{4}?role_arn={5}&region_name={6}'.format(conn_type, login, password, host, port, role_arn, region_name) print(conn_string)
  2. プレースホルダーを 赤色 で置き換えてください。

  3. 次のスクリプトを実行して、接続文字列を生成します。

    python3 mwaa_connection.py

ステップ 4: Secrets Manager に変数を追加する

次のセクションでは、Secrets Manager で変数のシークレットを作成する方法について説明します。

シークレットを作成するには
  1. AWS Secrets Manager コンソール を開きます。

  2. 新しいシークレットを保存 を選択します。

  3. 他の種類のシークレット を選択します。

  4. このシークレットに保存するキーと値のペアを指定してください ペインで、プレーンテキスト を選択します。

  5. 変数値を次の形式で プレーン テキストとして追加します。

    "YOUR_VARIABLE_VALUE"

    例えば、整数を指定するには:

    14

    例えば、文字列を指定には:

    "mystring"
  6. 暗号化キーでは、ドロップダウンリストから AWS KMS キーオプションを選択します。

  7. シークレット名 のテキストフィールドに、次の形式で名前を入力します。

    airflow/variables/YOUR_VARIABLE_NAME

    例:

    airflow/variables/test-variable
  8. 次へ を選択します。

  9. シークレットの設定 ページの シークレットの名前と説明 ペインで、次の操作を行います。

    1. シークレット名 には、シークレットの名前を入力します。

    2. (オプション)説明 として、シークレットの説明を入力します。

    次へ を選択します。

  10. ローテーションの設定-オプション では、デフォルトオプションのままにして、次へ を選択します。

  11. 追加したい変数があれば、Secrets Manager でこれらの手順を繰り返します。

  12. レビュー ページで、自分の秘密を確認し、ストア を選択します。

ステップ 5: Secrets Manager に接続を追加する

次のセクションでは、Secrets Manager で接続文字列 URI のシークレットを作成する方法について説明します。

シークレットを作成するには
  1. AWS Secrets Manager コンソール を開きます。

  2. 新しいシークレットを保存 を選択します。

  3. 他の種類のシークレット を選択します。

  4. このシークレットに保存するキーと値のペアを指定してください ペインで、プレーンテキスト を選択します。

  5. 接続 URI 文字列を次の形式で プレーンテキスト として追加します。

    YOUR_CONNECTION_URI_STRING

    例:

    mysql://288888a0-50a0-888-9a88-1a111aaa0000.a1.us-east-1.airflow.amazonaws.com%2Fhome?role_arn=arn%3Aaws%3Aiam%3A%3A001122332255%3Arole%2Fservice-role%2FAmazonMWAA-MyAirflowEnvironment-iAaaaA&region_name=us-east-1
    警告

    Apache Airflow は接続文字列の各値を解析します。一重引用符や二重引用符は使用 しない でください。そうしないと、接続が 1 つの文字列として解析されます。

  6. 暗号化キー では、ドロップダウンリストから AWS KMS キーオプションを選択します。

  7. シークレット名 のテキストフィールドに、次の形式で名前を入力します。

    airflow/connections/YOUR_CONNECTION_NAME

    例:

    airflow/connections/myconn
  8. 次へ を選択します。

  9. シークレットの設定 ページの シークレットの名前と説明 ペインで、次の操作を行います。

    1. シークレット名 には、シークレットの名前を入力します。

    2. (オプション)説明 として、シークレットの説明を入力します。

    次へ を選択します。

  10. ローテーションの設定-オプション では、デフォルトオプションのままにして、次へ を選択します。

  11. 追加したい変数があれば、Secrets Manager でこれらの手順を繰り返します。

  12. レビュー ページで、自分の秘密を確認し、ストア を選択します。

サンプルコード

リソース

次のステップ