Autonomous Database：Google Cloud Secret Managerに保存されているシークレットを使用して作成したクレデンシャルでAmazon S3にアクセスしてみた

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

そこで今回は、Google Cloud Secret Managerに格納されているシークレットを使用してクレデンシャルを作成し、そのクレデンシャルを用いてAutonomous DatabaseからAmazon S3にアクセスしてみました。

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

https://qiita.com/500InternalServerError/items/913797575a446f9be00e

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

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

# 1. Googleサービスアカウントを使用した認証の有効化
Autonomous Databaseにadminユーザとしてアクセスします。
```
[opc@tools ~]$ sql admin/Demo#1Demo#1@adb


SQLcl: Release 23.2 Production on Mon Nov 06 09:58:33 2023

Copyright (c) 1982, 2023, Oracle.  All rights reserved.

Last Successful login time: Mon Nov 06 2023 09:58:34 +09:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.21.0.1.0

SQL> 
```
DBMS_CLOUD_ADMIN.ENABLE_PRINCIPAL_AUTHプロシージャを使用して、Googleサービスアカウントを使用した認証を有効化します。
```
SQL> BEGIN
  2      DBMS_CLOUD_ADMIN.ENABLE_PRINCIPAL_AUTH(
  3          provider => 'GCP');
  4  END;
  5* /

PL/SQLプロシージャが正常に完了しました。

SQL>
```
Autonomous DatabaseのGoogleサービスアカウントを確認します。
```
SQL> SELECT * FROM CLOUD_INTEGRATIONS WHERE param_name = 'gcp_service_account';

PARAM_NAME             PARAM_VALUE                                                   
______________________ _____________________________________________________________ 
gcp_service_account    GCP-SA-XXXXX-XXXXX@gcp-pa-project1.iam.gserviceaccount.com    

SQL> 
```

# 2. GCP SecretManagerのシークレットの作成とAutonomous Databaseへのアクセス権の付与
GCPのコンソールにアクセスして、Secret Managerに移動し、「シークレットを作成」をクリックします。

![スクリーンショット 2023-11-06 12.04.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/f6f3434b-3db7-23b5-6726-e8eeac56d956.png)

シークレットの名前とシークレットの値を入力して、シークレットを作成します。
ここではシークレットの名前を「MyGCPSecret」とし、シークレットの値としてS3バケットにアクセス可能なAWS IAMユーザのシークレット・アクセスキーを入力します。
![スクリーンショット 2023-11-06 12.05.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/06bb81db-3f28-09b7-0075-4a83d2b68eaf.png)

シークレットが作成できたら、「権限」のタブに移動します。
![スクリーンショット 2023-11-06 12.06.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/2b1effae-9b8b-70f6-0de6-8326de6faf30.png)

「アクセス権を付与」をクリックします。
![スクリーンショット 2023-11-06 12.11.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/a83c11e2-d44e-82f7-1531-e2e67c81057e.png)

「プリンシパルの追加」の欄の新しいプリンシパルに1.で確認したAutonomous DatabaseのGoogleサービスアカウントの値を入力します。
![スクリーンショット 2023-11-06 12.13.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/ecf0e9d5-a477-1d54-eb7b-0fbb4deb6160.png)

「ロールを割り当てる」の欄のロールには「Secret Managerのシークレットアクセサー」を選択して入力します。
![スクリーンショット 2023-11-06 12.13.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/8edd7f60-0d9b-8d21-bc2d-01e1b809f12e.png)

入力が完了したら、「保存」をクリックします。


# 3. GCP Secret Managerに保存されているシークレットを使用したクレデンシャルの作成
BEGIN DBMS_CLOUD.CREATE_CREDENTIALプロシージャを使用して、GCP Secret Managerに保存されているシークレットを用いてクレデンシャルを作成します。
今回は、AWS S3にアクセスするためのクレデンシャルS3_CRED_USING_GCP_SECRETを作成するので、
paramsのusernameに、S3バケットにアクセス可能なAWS IAMユーザのアクセスキー、
paramsのsecret_idに、AWS IAMユーザのシークレット・アクセスキーを格納したGCP Secret Managerのシークレット名、
paramsのgcp_project_idに、GCPのプロジェクトID
を指定しました。

```
SQL> BEGIN DBMS_CLOUD.CREATE_CREDENTIAL(
  2      credential_name      => 'S3_CRED_USING_GCP_SECRET',
  3      params               => JSON_OBJECT( 
  4            'username'   value 'XXXXXXXXXXXXXXXXXXXX', -- AWS IAMユーザのAccess Key
  5            'secret_id'  value 'MyGCPSecret', -- GCP Secret Managerのシークレット名
  6            'gcp_project_id' value 'xxxxx-xxx-XXXXXX' )); -- GCPのプロジェクトID
  7  END;
  8* /

PL/SQLプロシージャが正常に完了しました。

SQL>
```
クレデンシャルS3_CRED_USING_GCP_SECRETが作成できました。

# 4. クレデンシャルを使用したS3へのアクセス
GCP Secret Managerに保存されているシークレットを使用して作成したクレデンシャルを使って、S3バケットにアクセスしてみます。

```
SQL> SELECT object_name
  2  FROM DBMS_CLOUD.LIST_OBJECTS(
  3           credential_name => 'S3_CRED_USING_GCP_SECRET',
  4           location_uri    => 'https://s3.ap-northeast-1.amazonaws.com/bucketname/foldername/'
  5* );

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

7行が選択されました。 

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

# 参考情報
・[Use Vault Secret Credential with GCP Secret Manager](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/vault-secret-credentials-gcp.html#GUID-C448E288-C8D6-4044-BB14-96607B662C72)
・[DBMS_CLOUD_ADMIN.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)
・[DBMS_CLOUD.CREATE_CREDENTIAL Procedure](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/dbms-cloud-subprograms.html#GUID-742FC365-AA09-48A8-922C-1987795CF36A)