AWS MWAA (Amazon Managed Workflows for Apache Airflow) にてSecrets Managerに配置した環境変数を参照する

# はじめに
MWAA内部で使用する秘匿したい環境変数は、Secrets Managerに配置して管理すると安全に利用することができます。
今回はその配置・参照の方法についてまとめていきます。

以下の記事でGCPなど別リソースへの`接続情報`の配置について同様の方法でまとめてあるので、必要であればこちらも確認してみてください。

https://qiita.com/Hisaaki-Kato/items/aec0e110164cfde55ead

※ MWAAで使用するAirflowのバージョンは2.2.2である前提で進めます。

# やってみる
今回は、以下の手順で進めて行きます。

1. MWAAを作成するCloudFormationテンプレートにSecrets Managerを環境変数として参照する設定追記
1. Secrets Managerに秘匿情報を格納
1. 実際に参照する
1. json形式で1つのシークレットに対して複数の環境変数を参照する
1. jinjaテンプレート形式での展開

### MWAAを作成するCloudFormationテンプレートにSecrets Managerを環境変数として参照する設定追記
まずは公式ドキュメントの通りにSecrets Managerを参照先として利用するための設定をしていきます。

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

リソースはCloudFormationによって作成するので、クイックスタートチュートリアルのテンプレートをもとに、template.yamlに以下の部分を追記します。
```yaml
  ・
  ・
  ・
  #####################################################################################################################
  # CREATE MWAA
  #####################################################################################################################

  MwaaEnvironment:
    Type: AWS::MWAA::Environment
    DependsOn: MwaaExecutionPolicy
    Properties:
      AirflowConfigurationOptions:  # 追記
        secrets.backend: airflow.providers.amazon.aws.secrets.secrets_manager.SecretsManagerBackend  # 追記
        secrets.backend_kwargs:  # 追記
          variables_prefix: "airflow/variables"  # 追記
  ・
  ・
  ・
```
これによってSecrets Managerに配置された`airflow/variables`がprefixの環境変数をMWAA内で使用する環境変数として参照することができます。

#### Secrets Managerに秘匿情報を格納
続いて、実際に利用する環境変数を配置します。
先ほど設定した通り、`airflow/variables`をprefixとする必要があるので、変数名を以下のように`airflow/variables/hoge`の形で配置しましょう。
これで、MWAA内で`hoge`という名前の環境変数として利用することができます。

![スクリーンショット 2022-03-13 23.52.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643279/10354ef2-2231-fcff-acb1-a2160bfab408.png)

中身は適当にhoge
![スクリーンショット 2022-03-13 23.53.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643279/adbad3d2-224d-c6d4-472c-67d49a16185d.png)

#### 実際に参照する
参照時は、以下のようにシンプルに参照することが可能です。

```python
from airflow.models import Variable
hoge = Variable.get("hoge")
```

#### json形式で1つのシークレットに対して複数の環境変数を参照する
これまでで環境変数の配置と参照ができましたが、これだとシークレットと変数が1対1の関係になっており、複数の環境変数を配置したい場合にはその分だけシークレットを作成する必要が出てきてしまいます。
さすがにそれでは具合が悪いので、そういった場合にはjson形式でシークレットを作成し、MWAA内で展開してあげることが可能です。

新しく`airflow/variables/json_hoge`というシークレットを作成しました。

![スクリーンショット 2022-03-14 0.03.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643279/69825a20-f4fa-d9fd-e0b2-b1044a9fb468.png)

中身は以下
![スクリーンショット 2022-03-14 0.04.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643279/2e4f3eaf-497f-1611-8e8e-a5e03c93cd61.png)


参照する場合には単純なjson文字列なので、以下のようにパースして利用可能です。

```python
import json
from airflow.models import Variable

envs = json.loads(Variable.get("json_hoge"))

HOGE = envs["hoge"]
FUGA = envs["fuga"]
```

#### jinjaテンプレート形式での展開
pythonコード内での参照だけでなく、jinja形式で展開して環境変数を利用することも可能です。

以下のAirflowの公式ページに環境変数周りの展開方法が記載されています。

https://airflow.apache.org/docs/apache-airflow/stable/templates-ref.html

json形式でないシンプルな変数の場合は、以下のように展開します。
シークレット名`airflow/variables/hoge`の中身`hoge`を展開する
```pyrhon
{{ var.value.hoge }}
```

json形式の場合は以下。
- シークレット名`airflow/variables/json_hoge`の中身の`hoge`がキーの値`foo`を展開する
```
{{ var.json.json_hoge.hoge }}
```
- シークレット名`airflow/variables/json_hoge`の中身の`fuga`がキーの値`bar`を展開する
```
{{ var.json.json_hoge.fuga }}
```

# 最後に
今回はSecrets Managerに配置した変数をMWAA内部で参照する方法についてまとめました。

Secrets Managerからprefixで特定する形がすこし気になるといえば気になりますが、複雑な設定をしなくてもSecrets Managerと連携できるのは非常に便利ですね！

というわけで今回はここまで。