Autonomous DatabaseからAWS Glueのデータカタログに登録されているS3上のデータにアクセスしてみた

# はじめに

Autonomous DatabaseはAWS Glueのデータ・カタログのメタデータと同期することができ、AWS Glueが取得したAmazon S3に格納されたデータに対するテーブルに対して、自動的に外部表を作成することが可能です。

今回は、Autonomous DatabaseからAWS Glueのデータカタログに登録されている表として登録されているS3データにアクセスする手順を検証してみました。

# 1. AWS Glueのデータ・カタログの設定

今回は検証用にS3バケットに3つのCSVファイルをアップロードし、そちらをemployee_on_s3という名前の表としてAWS Glueに登録しました。

![スクリーンショット 2023-11-09 23.18.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/ae4452ca-4037-f797-6684-191a31f54fa1.png)

```txt:employee1.csv
鈴木さん,38,1000000
田中さん,51,2500000
```
```txt:employee2.csv
渡辺さん,22,1000000
松本さん,41,3000000
```
```txt:employee3.csv
高橋さん,28,1800000
山口さん,33,3300000
```
![スクリーンショット 2023-11-09 23.13.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/b14d42fe-d2df-5d90-e1dc-4ee0281496ef.png)



# 2. クレデンシャルの作成

AWS Glueデータ・カタログとS3にアクセス可能なAWS IAMユーザを作成し、そのユーザのアクセス・キーとシークレット・アクセス・キーを使用して、クレデンシャルを作成します。
AWS Glue データ・カタログアクセス用のクレデンシャルとS3アクセス用のクレデンシャルを別々に作成して使用することも可能です。
```
SQL> BEGIN
  2      DBMS_CLOUD.CREATE_CREDENTIAL (
  3         credential_name => 'AWS_GLUE_CRED',
  4         username        => 'XXXXXXXXXXXXXXXXXXXX', -- AWS IAMユーザのアクセス・キー
  5         password        => 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' -- AWS IAMユーザのシークレット・アクセス・キー
  6      );
  7  END;
  8* /

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

SQL> 
```

# 3. AWS Glueにアクセスするためのクレデンシャルの設定
DBMS_DCAT.SET_DATA_CATALOG_CREDENTIALプロシージャ、DBMS_DCAT.SET_OBJECT_STORE_CREDENTIALプロシージャを使用して、AWS Glueデータ・カタログへのアクセスに使用するクレデンシャル、S3へのにアクセスに使用するクレデンシャルをそれぞれ設定します。

```
SQL> BEGIN
  2      DBMS_DCAT.SET_DATA_CATALOG_CREDENTIAL('AWS_GLUE_CRED');
  3      DBMS_DCAT.SET_OBJECT_STORE_CREDENTIAL('AWS_GLUE_CRED');
  4  END;
  5* /

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

SQL> 
```

# 4. AWS Glueへの接続の確立
DBMS_DCAT.SET_DATA_CATALOG_CONNプロシージャを使用して、Autonomous DatabaseからAWS Glueへの接続を確立します。
パラメータregionにはAWS Glue データ・カタログが存在するリージョンのリージョン識別子を指定し、パラメータcatalog_typeにはAWS_GLUEを指定します。

```
SQL> BEGIN
  2      DBMS_DCAT.SET_DATA_CATALOG_CONN(region => 'ap-northeast-1', 
  3                                      catalog_type=>'AWS_GLUE');
  4  END;
  5* /

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

SQL> 
```
AWS Glue データ・カタログへの接続が確立されると、all_glue_databasesビューで、データ・カタログに登録されているデータベースが確認できます。
```
SQL> SELECT * FROM all_glue_databases ORDER BY name;

DCAT_CON_ID    CATALOG_ID      NAME              DESCRIPTION    LOCATION_URI    CREATE_TIME                        PARAMETERS    TARGET_DATABASE    
______________ _______________ _________________ ______________ _______________ __________________________________ _____________ __________________ 
               010446572587    mygluedatabase                                   09-NOV-23 09.48.52.000000000 AM                                     

SQL> 
```
また。AWS Glue データ・カタログへの接続が確立されると、all_glue_tablesビューで、データ・カタログに登録されているテーブルが確認できます。
```
SQL> SELECT * FROM all_glue_tables ORDER BY database_name, name;

DCAT_CON_ID    CATALOG_ID      DATABASE_NAME     NAME              TABLE_TYPE        CLASSIFICATION    DESCRIPTION    OWNER    CREATED_BY                        CREATE_TIME                        LAST_ANALYZED_TIME    LAST_ACCESS_TIME    UPDATE_TIME                           IS_REGISTERED_WITH_LAKE_FORMATION PARAMETERS                  PARTITION_KEYS       RETENTION STORAGE_DESCRIPTOR                                                                  TARGET_TABLE                                            VERSION_ID    VIEW_EXPANDED_TEXT    VIEW_ORIGINAL_TEXT    
______________ _______________ _________________ _________________ _________________ _________________ ______________ ________ _________________________________ __________________________________ _____________________ ___________________ __________________________________ ____________________________________ ___________________________ _________________ ____________ ___________________________________________________________________________________ _______________________________________________________ _____________ _____________________ _____________________ 
               010446572587    mygluedatabase    employee_on_s3    EXTERNAL_TABLE    csv                                       arn:aws:iam::XXXXXXXXXXXX:xxxx    09-NOV-23 09.49.08.000000000 AM                                              09-NOV-23 09.49.08.000000000 AM                                       0 {"classification":"csv"}    []                           0 {"BUCKET_COLUMNS":[],"STORAGE_DESCRIPTOR_COLUMNS":[{"COLUMN_COMMENT":null,"NAME"    {"CATALOG_ID":null,"DATABASE_NAME":null,"NAME":null}    0                                                         

SQL> 
```

# 5. AWS Glue データ・カタログとの同期

DBMS_DCAT.RUN_SYNCプロシージャを使用して、AWS Glue データ・カタログに登録されているデータベースとテーブルを同期します。
```
SQL> EXEC DBMS_DCAT.RUN_SYNC(synced_objects=>'{"database_list":["*"]}');

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

SQL> 
```
DBMS_DCAT$SYNC_LOGビューを使用して、同期処理のログを確認できます。
```
SQL> SELECT * FROM DBMS_DCAT$SYNC_LOG;

LOG_TIMESTAMP                      LOG_LEVEL    LOG_DETAILS                                                                         
__________________________________ ____________ ___________________________________________________________________________________ 
09-NOV-23 09.22.49.345380000 PM    INFO         full sync                                                                           
09-NOV-23 09.22.50.856592000 PM    INFO         Executing get_table for table employee_on_s3] database: []                          
09-NOV-23 09.22.50.958420000 PM    INFO         Computing mappings for entity employee_on_s3                                        
09-NOV-23 09.22.50.964742000 PM    INFO         Entity employee_on_s3 mapped to table GLUE$MYGLUEDATABASE_MY_S3_BUCKET777.EMPLOY    
09-NOV-23 09.22.50.969074000 PM    INFO         Entity employee_on_s3 attribute empname mapped to EMPNAME VARCHAR2(4000 BYTE)       
09-NOV-23 09.22.50.970253000 PM    INFO         Entity employee_on_s3 attribute age mapped to AGE NUMBER(10)                        
09-NOV-23 09.22.50.971508000 PM    INFO         Entity employee_on_s3 attribute salary mapped to SALARY NUMBER(10)                  
09-NOV-23 09.22.52.426546000 PM    INFO         Implement: creating table GLUE$MYGLUEDATABASE_MY_S3_BUCKET777.EMPLOYEE_ON_S3        

8行が選択されました。 

SQL> 
```
AWS Glue データ・カタログ内のemployee_on_s3テーブルに対して、GLUE$MYGLUEDATABASE_MY_S3_BUCKET777.EMPLOYEE_ON_S3という名前の外部表が作成されたことがわかります。

# 6. AWS Glueのデータカタログを使用したS3データへのアクセス

作成された外部表GLUE$MYGLUEDATABASE_MY_S3_BUCKET777.EMPLOYEE_ON_S3を使用して、S3上のデータにアクセスしてみます。
```
SQL> SELECT * FROM GLUE$MYGLUEDATABASE_MY_S3_BUCKET777.EMPLOYEE_ON_S3;

EMPNAME          AGE     SALARY 
__________    ______ __________ 
鈴木さん           38    1000000 
田中さん           51    2500000 
渡辺さん           22    1000000 
松本さん           41    3000000 
高橋さん           28    1800000 
山口さん           33    3300000 

6行が選択されました。 

SQL> 
```

Autonomous DatabaseからAWS Glueのデータカタログを使用してS3上のデータにアクセスできることが確認できました。

# 参考情報
・[Query External Data with AWS Glue Data Catalog](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/qxd-query-external-data-aws-glue-data-catalog.html#GUID-DF341F92-9793-42EB-B6AB-915C8A4F9842)
・[Example: Query with AWS Glue Data Catalog](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/qxd-query-external-data-aws-glue-data-catalog.html#GUID-EDF09CB3-52F1-4A22-9F9B-ED24C158663D)
・[DBMS_DCAT Package](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/autonomous-dbms-dcat.html#GUID-4D927F21-E856-437B-B42F-727A2C02BE8D)