Autonomous Database：AWS Secrets Managerに保存されているシークレットを使用してクレデンシャルを作成してみた

# はじめに
Autonomous Databaseではマルチクラウド環境向けの様々な機能が実装されています。
先日の機能強化で、Azure Key Vault、AWS Secrets Manager、GCP Secret Managerといった各クラウドベンダーのシークレット管理サービスに格納されたシークレットを使用してクレデンシャルが作成できるようになりました。

そこで今回は、AWS Secrets Managerに格納されているシークレットを使用してクレデンシャルを作成してみました。

Azure Key Vaultに格納されているシークレットを使用してクレデンシャルを作成する手順の記事はこちら。

https://qiita.com/500InternalServerError/items/f1242c1af315fd6a719e

Google Cloud Secret Managerに格納されているシークレットを使用してクレデンシャルを作成する手順の記事はこちら。

https://qiita.com/500InternalServerError/items/d84d30868e5e7b6d30bf

# 1. AWS Secrets Managerへのシークレットの保存
AWSのコンソールにサインインして「Secrets Manager」に移動し、「新しいシークレットを保存する」をクリックします。
![スクリーンショット 2023-11-02 17.49.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/b535395a-122b-a3b3-a008-69029fbef2df.png)

シークレットのタイプとして「その他のシークレットのタイプ」を選択し、Autonomous Databaseで作成するクレデンシャルのパスワードとして使用する文字列をプレーンテキストとして入力します。

ここでは、S3にアクセス可能なAWS IAMユーザのシークレット・アクセスキーをシークレットに保存しました。
![スクリーンショット 2023-11-02 17.50.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/1425385a-a4f5-de61-b6c4-0416071668d3.png)

シークレットの名前を入力します。
ここではMySecretとしました。
![スクリーンショット 2023-11-02 17.51.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/c305028e-0de1-8dfe-392d-8b62cd5fe14f.png)

ローテーションの設定画面では、そのまま「次」をクリックします。
![スクリーンショット 2023-11-02 17.52.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/f78eedbf-6abc-86bc-1b49-e9effbd9f48f.png)

設定内容に問題がないことを確認したら、「保存」をクリックしてシークレットを保存します。
![スクリーンショット 2023-11-02 17.52.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/4b24c56b-1936-0841-1018-1bbb5eaaac8c.png)

シークレットが作成できたら、シークレットのARNをコピーしてメモしておきます。
![スクリーンショット 2023-11-02 18.00.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/b36f7348-c203-8aea-84df-85dcbf6f00b1.png)



# 2. AWS IAMロールの作成に必要な情報の確認

以下のSQLでARNを確認します。
```
SQL> SELECT param_value FROM cloud_integrations
  2* WHERE param_name = 'aws_user_arn';

PARAM_VALUE                                 
___________________________________________ 
arn:aws:iam::XXXXXXXXXXXX:user/oraclearn    

SQL>
```

以下のSQLでAutonomous DatabaseのOCIDを確認します。
```
SQL> SELECT JSON_VALUE(cloud_identity, '$.DATABASE_OCID') AS adb_ocid FROM v$pdbs;

ADB_OCID                                                                                                
_______________________________________________________________________________________________________ 
OCID1.AUTONOMOUSDATABASE.OC1.AP-TOKYO-1.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX    

SQL> 
```

# 3. AWS IAMロールの作成

AWSのコンソールにサインインし、「IAM」の「ロール」に移動します。

「ロールを作成」をクリックします。
![スクリーンショット 2023-11-02 17.22.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/9f059324-f520-7ed5-e718-00a72de75726.png)

「信頼されたエンティティタイプ」として「AWSアカウント」を選択します。
「AWSアカウント」は「このアカウント」を選択します。
「外部IDを要求する」のチェックをオンにし、外部IDとしてAutonomous DatabaseのOCIDを入力します。
![スクリーンショット 2023-11-02 17.26.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/86721f48-7480-a272-84f4-0e2369e281c2.png)

そのまま「次へ」をクリックします。
![スクリーンショット 2023-11-02 17.27.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/cb9b027f-7cc1-1426-32d0-e287f86c1199.png)

作成するロールの名前を入力し、「ロールの作成」をクリックします。
ここではロール名を「ROLE_for_ADB_using_Secret_Manager」としました。

![スクリーンショット 2023-11-02 17.27.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/5fe22639-c8c0-7a56-ceb4-edd2f699507b.png)


ロールが作成できたら、許可ポリシーを設定します。
「許可を追加」をクリックし、「インラインポリシーを作成」を選択します。
![スクリーンショット 2023-11-02 17.36.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/37dcf6d1-6c68-2a62-2154-362f007bfba6.png)

このポリシーでは、Autonomous DatabaseにSecrets Managerに保存されているシークレットへの読み取りアクセスを許可するので、サービスとして「Secrets Manager」を選択し、「すべての読み取りアクション」のチェックをオンにします。
![スクリーンショット 2023-11-02 17.37.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/f6b79079-3b8d-936a-4665-4e8142e45145.png)

リソースとして、シークレットのARNを指定し、「次へ」をクリックします。
![スクリーンショット 2023-11-02 17.39.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/c54cb8e7-b253-7c10-9044-0f02a0efbde5.png)

ポリシー名を入力し、「ポリシーの作成」をクリックします。
ここではポリシー名を「Policy_for_ADB_using_Secret_Manager」としました。
![スクリーンショット 2023-11-02 17.40.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/a06ff50b-68c3-0591-ff6f-c651c5062fdc.png)

作成したロールの信頼ポリシーのPrincipalを以下のように編集します。
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::XXXXXXXXXX:user/oraclearn" （<-2.で確認したARNの値に変更）
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                    "sts:ExternalId": "OCID1.AUTONOMOUSDATABASE.OC1.AP-TOKYO-1.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
                }
            }
        }
    ]
}
```

以上でロールの設定が完了しました。

# 4.プリンシパル認証の有効化
DBMS_CLOUD_ADMIN.ENABLE_PRINCIPAL_AUTHプロシージャを使用して、プリンシパル認証を有効化します。
providerとしてAWSを指定し、paramsのaws_role_arnには、3.で作成したロールのARNを指定します。
```
SQL> BEGIN
  2      DBMS_CLOUD_ADMIN.ENABLE_PRINCIPAL_AUTH(
  3          provider => 'AWS',
  4          params => JSON_OBJECT(
  5              'aws_role_arn' value 'arn:aws:iam::XXXXXXXXXXXX:role/ROLE_for_ADB_using_Secret_Manager')
  6      );
  7  END;
  8* /

PL/SQL procedure successfully completed.

SQL> 
```

# 5. Secrets Managerに格納されているシークレットを使用したクレデンシャルの作成
DBMS_CLOUD.CREATE_CREDENTIALプロシージャを使用して、クレデンシャルを作成します。
paramsのsecret_idには1.で作成したシークレットのARNを指定します。
```
SQL> BEGIN
  2      DBMS_CLOUD.CREATE_CREDENTIAL(
  3          credential_name      => 'AWS_SECRET_CRED',
  4          params               => JSON_OBJECT(
  5               'username'   value 'XXXXXXXXXXXXXXXXXX', -- AWS IAMユーザのアクセスキー
  6               'secret_id'  value 'arn:aws:secretsmanager:ap-northeast-1:XXXXXXXXXXXX:secret:MySecret-XXXXXX') -- シークレット・アクセスキーを保存したシークレットのARN
  7      );
  8  END;
  9* /

PL/SQL procedure successfully completed.

SQL> 
```
 Secrets Managerに格納されているシークレットを使用して作成したクレデンシャルを使用して、S3バケットにアクセスしてみます。
```
SQL> SELECT object_name FROM 
  2  DBMS_CLOUD.LIST_OBJECTS(
  3       'AWS_SECRET_CRED', 
  4       'https://s3.ap-northeast-1.amazonaws.com/bucket_name/'
  5* );

OBJECT_NAME             
_______________________ 
employee1.csv           
employee1.csv.gz        
employee2.csv           
employee2.csv.gz        
employee20231031.csv    
employee20231101.csv    
employee3.csv           

7 rows selected. 

SQL> 
```
Secrets Managerに格納されているシークレットを使用して作成したクレデンシャルを使用して、S3バケットにアクセスできました。

なお、シークレットを使用して作成するクレデンシャルは、ユーザ名/パスワード形式の認証が必要なところで利用可能ですので、データベース・リンクを作成する際のクレデンシャル等でも利用可能です。

# 6. 参考情報
・[Use Vault Secret Credentials](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/vault-secret-credentials.html#GUID-A366686D-0991-4ED6-8B42-783614AA2F9E)
・[ENABLE_PRINCIPAL_AUTH Procedure](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/dbms-cloud-admin.html#GUID-DB61623B-E4AF-4F82-9AFE-DF58601D4852)
・[CREATE_CREDENTIAL Procedure](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/dbms-cloud-subprograms.html#GUID-742FC365-AA09-48A8-922C-1987795CF36A)