

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# AWS Secrets Manager シークレットを使用した Apache Airflow 接続の設定
<a name="connections-secrets-manager"></a>

AWS Secrets Manager は、Amazon Managed Workflows for Apache Airflow 環境でサポートされている代替 Apache Airflow バックエンドです。このトピックでは、 AWS Secrets Manager を使用して Apache Airflow 変数のシークレットと Apache Airflow 接続を Amazon Managed Workflows for Apache Airflow に安全に保存する方法を説明します。

**注記**  
作成したシークレットに対して料金が発生します。Secret Manager の価格設定の詳細については、[AWS 料金](https://aws.amazon.com/secrets-manager/pricing/) を参照してください。
[AWS Systems Manager パラメータストア](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store)は、Amazon MWAA のシークレットバックエンドとしてもサポートされています。詳細については、[Amazon プロバイダーパッケージのドキュメント](https://airflow.apache.org/docs/apache-airflow-providers-amazon/stable/secrets-backends/aws-ssm-parameter-store.html) を参照してください。

**Contents**
+ [ステップ 1: Amazon MWAA にSecrets Manager のシークレットキーにアクセスする権限を付与する](#connections-sm-policy)
+ [ステップ 2: Secrets Manager のバックエンドを Apache Airflow 設定オプションとして作成する](#connections-sm-aa-configuration)
+ [ステップ 3: Apache Airflow AWS 接続 URI 文字列を生成する](#connections-sm-aa-uri)
+ [ステップ 4: Secrets Manager に変数を追加する](#connections-sm-createsecret-variables)
+ [ステップ 5: Secrets Manager に接続を追加する](#connections-sm-createsecret-connection)
+ [「サンプルコード」](#connections-sm-samples)
+ [リソース](#connections-sm-blogs)
+ [次のステップ](#connections-sm-next-up)

## ステップ 1: Amazon MWAA にSecrets Manager のシークレットキーにアクセスする権限を付与する
<a name="connections-sm-policy"></a>

Amazon MWAA 環境の [実行ロール](mwaa-create-role.md) には、 AWS Secrets Manager内のシークレットキーへの読み取りアクセス権が必要です。次の IAM ポリシーは、 AWSマネージド [SecretsManagerReadWrite](https://console.aws.amazon.com/iam/home?#/policies/arn:aws:iam::aws:policy/SecretsManagerReadWrite$jsonEditor) ポリシーを使用した読み取り/書き込みアクセスを許可します。

**実行ロールにポリシーを添付するには**

1. Amazon MWAA コンソールで、[環境ページ](https://console.aws.amazon.com/mwaa/home#/environments) を開きます。

1. 環境を選択します。

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

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

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

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

 AWSマネージドアクセス許可ポリシーを使用しない場合は、環境の実行ロールを直接更新して、Secrets Manager リソースへの任意のレベルのアクセスを許可できます。たとえば、次のポリシーステートメントは、Secrets Manager 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 設定オプションとして作成する
<a name="connections-sm-aa-configuration"></a>

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

1. Amazon MWAA コンソールで、[環境ページ](https://console.aws.amazon.com/mwaa/home#/environments) を開きます。

1. 環境を選択します。

1. **編集** を選択します。

1. **次へ** を選択します。

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

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

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

      [ルックアップパターン](https://airflow.apache.org/docs/apache-airflow-providers-amazon/stable/secrets-backends/aws-secrets-manager.html#optional-lookup) を使用すると、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 以上をインストールする必要があります。プロバイダパッケージを新しいバージョンに更新する方法の詳細については、[制約ファイル](connections-packages.md#connections-packages-constraints) を参照してください。

1. **[保存]** を選択します。

## ステップ 3: Apache Airflow AWS 接続 URI 文字列を生成する
<a name="connections-sm-aa-uri"></a>

「[接続](https://airflow.apache.org/docs/stable/howto/connection/index.html)」文字列を作成するには、キーボードの 「tab」 キーを使用して Connection オブジェクトのキーと値のペアをインデントします。また、シェルセッションで `extra` オブジェクト用の変数を作成することをおすすめします。以下のセクションでは、Apache Airflow または Python スクリプトを使用して Amazon MWAA 環境用の [Apache Airflow 接続 URI 文字列を生成する](https://airflow.apache.org/docs/apache-airflow/stable/howto/connection.html#generating-a-connection-uri)手順を順を追って説明します。

------
#### [ Apache Airflow CLI ]

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

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

   ```
   python3
   ```

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

   ```
   >>> import json
   ```

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

   ```
   >>> from airflow.models.connection import Connection
   ```

1. シェルセッションに `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}}'})
   ```

1. 接続オブジェクトを作成します。`myconn` のサンプル値を Apache Airflow 接続の名前に置き換えてください。

   ```
   >>> {{myconn}} = Connection(
   ```

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

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

      ```
      ... conn_id='{{aws}}',
      ```

   1. Apache Airflow データベースオプションを指定します。

      ```
      ... conn_type='{{mysql}}',
      ```

   1. Amazon MWAA の Apache Airflow UI URL を指定してください。

      ```
      ... host='{{288888a0-50a0-888-9a88-1a111aaa0000.a1.us-east-1.airflow.amazonaws.com/home}}',
      ```

   1. Amazon MWAA にログインする AWS アクセスキー ID (ユーザー名) を指定します。

      ```
      ... login='{{YOUR_AWS_ACCESS_KEY_ID}}',
      ```

   1. Amazon MWAA にログインする AWS シークレットアクセスキー (パスワード) を指定します。

      ```
      ... password='{{YOUR_AWS_SECRET_ACCESS_KEY}}',
      ```

   1. `extra` シェルセッション変数を指定します。

      ```
      ... extra=extra
      ```

   1. 接続オブジェクトを閉じます。

      ```
      ... )
      ```

1. 接続 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)
   ```

1. プレースホルダーを {{赤色}} で置き換えてください。

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

   ```
   python3 mwaa_connection.py
   ```

------

## ステップ 4: Secrets Manager に変数を追加する
<a name="connections-sm-createsecret-variables"></a>

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

**シークレットを作成するには**

1. [AWS Secrets Manager コンソール](https://console.aws.amazon.com/secretsmanager/home#/environments) を開きます。

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

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

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

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

   ```
   "{{YOUR_VARIABLE_VALUE}}"
   ```

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

   ```
   14
   ```

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

   ```
   "mystring"
   ```

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

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

   ```
   airflow/variables/{{YOUR_VARIABLE_NAME}}
   ```

   例えば、次のようになります。

   ```
   airflow/variables/test-variable
   ```

1. **次へ** を選択します。

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

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

   1. （オプション）**説明** として、シークレットの説明を入力します。

   **次へ** を選択します。

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

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

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

## ステップ 5: Secrets Manager に接続を追加する
<a name="connections-sm-createsecret-connection"></a>

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

**シークレットを作成するには**

1. [AWS Secrets Manager コンソール](https://console.aws.amazon.com/secretsmanager/home#/environments) を開きます。

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

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

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

1. 接続 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 つの文字列として解析されます。

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

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

   ```
   airflow/connections/{{YOUR_CONNECTION_NAME}}
   ```

   例えば、次のようになります。

   ```
   airflow/connections/myconn
   ```

1. **次へ** を選択します。

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

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

   1. （オプション）**説明** として、シークレットの説明を入力します。

   **次へ** を選択します。

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

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

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

## 「サンプルコード」
<a name="connections-sm-samples"></a>
+ このページの Apache Airflow 接続 (`myconn`) のシークレットキーの使用方法については、[AWS Secrets Manager の Apache Airflow 接続でのシークレットキーの使用](samples-secrets-manager.md) のサンプルコードを参照してください。
+ このページの Apache Airflow 変数 (`test-variable`) のシークレットキーの使用方法については、[Apache Airflow 変数の AWS Secrets Manager におけるシークレットキーの使用](samples-secrets-manager-var.md) にあるサンプルコードを使用して学習してください。

## リソース
<a name="connections-sm-blogs"></a>
+ コンソールと を使用して Secrets Manager シークレットを設定する方法の詳細については AWS CLI、「 *AWS Secrets Manager ユーザーガイド*」の[「シークレットの作成](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html)」を参照してください。
+ Apache Airflowの大量の変数や接続をSecrets Managerに移行するために、Pythonスクリプトを使用して、[Apache Airflowの接続と変数を AWS Secrets Managerに移動してください](https://aws.amazon.com/blogs/opensource/move-apache-airflow-connections-variables-aws-secrets-manager/)。

## 次のステップ
<a name="connections-sm-next-up"></a>
+ [Apache Airflow へのアクセス](access-airflow-ui.md) で Apache Airflow UI にアクセスするトークンを生成する方法について説明します。