

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# JDBC 連線
<a name="aws-glue-programming-etl-connect-jdbc-home"></a>

 某些 (通常是關聯式) 資料庫類型透過 JDBC 標準支援連線。如需 JDBC 的詳細資訊，請參閱 [Java JDBC API](https://docs.oracle.com/javase/8/docs/technotes/guides/jdbc/) 文件。 AWS Glue 原生支援透過其 JDBC 連接器連線至特定資料庫 - JDBC 程式庫在 Glue Spark AWS 任務中提供。使用 AWS Glue 程式庫連線到這些資料庫類型時，您可以存取一組標準選項。

JDBC connectionType 的值包括以下項目：
+ `"connectionType": "sqlserver"`：指定 Microsoft SQL Server 資料庫的連線。
+ `"connectionType": "mysql"`：指定 MySQL 資料庫的連線。
+ `"connectionType": "oracle"`：指定 Oracle 資料庫的連線。
+ `"connectionType": "postgresql"`：指定 PostgreSQL 資料庫的連線。
+ `"connectionType": "redshift"`：指定 Amazon Redshift 資料庫的連線。如需詳細資訊，請參閱[Redshift 連線](aws-glue-programming-etl-connect-redshift-home.md)。

下表列出 Glue 支援的 JDBC AWS 驅動程式版本。


| 產品 | Glue 5.1 的 JDBC 驅動程式版本 | Glue 5.0 的 JDBC 驅動程式版本 | 適用於 Glue 4.0 的 JDBC 驅動程式版本 | 適用於 Glue 3.0 的 JDBC 驅動程式版本 | 適用於 Glue 0.9、1.0、2.0 的 JDBC 驅動程式版本 | 
| --- | --- | --- | --- | --- | --- | 
| Microsoft SQL Server | 10.2.0 | 10.2.0 | 9.4.0 | 7.x | 6.x | 
| MySQL | 8.0.33 | 8.0.33 | 8.0.23 | 8.0.23 | 5.1 | 
| Oracle Database | 23.3.0.23.09 | 23.3.0.23.09 | 21.7 | 21.1 | 11.2 | 
| PostgreSQL | 42.7.3 | 42.7.3 | 42.3.6 | 42.2.18 | 42.1.x | 
| Amazon Redshift \$1 | redshift-jdbc42-2.1.0.29 | redshift-jdbc42-2.1.0.29 | redshift-jdbc42-2.1.0.16 | redshift-jdbc41-1.2.12.1017 | redshift-jdbc41-1.2.12.1017 | 

\$1 對於 Amazon Redshift 連線類型，JDBC 連線的連線選項中包含的所有其他選項名稱/值對 (包含格式化選項)，都會直接傳遞至基礎 SparkSQL DataSource。在 AWS Glue 4.0 版和更新版本的 Glue with Spark AWS 任務中，適用於 Amazon Redshift 的 AWS Glue 原生連接器會使用適用於 Apache Spark 的 Amazon Redshift 整合。如需詳細資訊，請參閱 [Apache Spark 的 Amazon Redshift 整合](https://docs.aws.amazon.com/redshift/latest/mgmt/spark-redshift-connector.html)。在舊版中，請參閱 [Spark 的 Amazon Redshift 資料來源](https://github.com/databricks/spark-redshift)。

若要將 Amazon VPC 設定為使用 JDBC 連線到 Amazon RDS 資料存放區，請參閱 [針對從 AWS Glue 到 Amazon RDS 資料存放區的 JDBC 連線設定 Amazon VPC](setup-vpc-for-glue-access.md)。

**注意**  
AWS 在執行期間，Glue 任務只會與一個子網路相關聯。這可能會影響您透過相同的任務連線至多個資料來源的能力。此行為不限於 JDBC 來源。

**Topics**
+ [JDBC 連線選項參考](#aws-glue-programming-etl-connect-jdbc)
+ [使用 sampleQuery](#aws-glue-programming-etl-jdbc-samplequery)
+ [使用自訂 JDBC 驅動程式](#aws-glue-programming-etl-jdbc-custom-driver)
+ [從 JDBC 資料表中平行讀取](run-jdbc-parallel-read-job.md)
+ [針對從 AWS Glue 到 Amazon RDS 資料存放區的 JDBC 連線設定 Amazon VPC](setup-vpc-for-glue-access.md)

## JDBC 連線選項參考
<a name="aws-glue-programming-etl-connect-jdbc"></a>

如果您已定義 JDBC AWS Glue 連線，則可以重複使用其中定義的組態屬性，例如：url、使用者和密碼；因此您不需要在程式碼中將其指定為連線選項。Glue AWS 3.0 及更新版本提供此功能。若要這樣做，請使用下列連線屬性：
+ `"useConnectionProperties"`：將其設定為 "true"，以指示您想要使用連線中的組態。
+ `"connectionName"`：輸入要從中擷取組態的連線名稱，連線必須在與任務相同的區域中定義。

將下列連線選項與 JDBC 連線搭配使用：
+ `"url"`：(必要) 資料庫的 JDBC URL。
+ `"dbtable"`：(必要) 要讀取的資料庫資料表。若是支援資料庫內結構描述的 JDBC 資料存放區，請指定 `schema.table-name`。如果未提供結構描述，則會使用預設的 "public" 結構描述。
+ `"user"`：(必要) 連線時所要使用的使用者名稱。
+ `"password"`：(必要) 連線時所要使用的密碼。
+ (選用) 下列選項可讓您提供自訂 JDBC 驅動程式。如果您必須使用 AWS Glue 原生不支援的驅動程式，請使用這些選項。

  ETL 任務可以對資料來源和目標使用不同的 JDBC 驅動程式版本，即使來源和目標是相同的資料庫產品。這可讓您在不同版本的來源和目標資料庫之間移轉資料。若要使用這些選項，您必須先將 JDBC 驅動程式的 JAR 檔案上傳到 Amazon S3。
  + `"customJdbcDriverS3Path"`：自訂 JDBC 驅動程式的 Amazon S3 路徑。
  + `"customJdbcDriverClassName"`：JDBC 驅動程式的類別名稱。
+ `"bulkSize"`：(選用) 用於設定平行插入，以加速 JDBC 目標的大量載入。指定寫入或插入資料時要使用之平行處理程度的整數值。此選項有助於改善寫入資料庫 (例如 Arch 使用者儲存庫 (AUR)) 的效能。
+ `"hashfield"` (選用) 一個字串，用於指定 JDBC 資料表中的資料欄名稱，以便在從 JDBC 資料表平行讀取時將資料劃分為分割區。提供 "hashfield" 或 "hashexpression"。如需詳細資訊，請參閱[從 JDBC 資料表中平行讀取](run-jdbc-parallel-read-job.md)。
+ `"hashexpression"` (選用) 傳回整數的 SQL 選取子句。用於在從 JDBC 資料表平行讀取時，將 JDBC 資料表中的資料劃分為分割區。提供 "hashfield" 或 "hashexpression"。如需詳細資訊，請參閱[從 JDBC 資料表中平行讀取](run-jdbc-parallel-read-job.md)。
+ `"hashpartitions"` (選用) 正整數。在從 JDBC 資料表平行讀取時，用於指定 JDBC 資料表的平行讀取次數。預設：7。如需詳細資訊，請參閱[從 JDBC 資料表中平行讀取](run-jdbc-parallel-read-job.md)。
+ `"sampleQuery"`：(選用) 自訂 SQL 查詢陳述式。用於指定資料表中的資訊子集，以擷取資料表內容範例。**在不考慮資料的情況下進行設定時，效率可能比 DynamicFrame 方法低，從而會導致逾時或記憶體不足的錯誤。**如需詳細資訊，請參閱[使用 sampleQuery](#aws-glue-programming-etl-jdbc-samplequery)。
+ `"enablePartitioningForSampleQuery"`：(選用) 布林值。預設：false。用於指定 `sampleQuery` 時啟用從 JDBC 資料表平行讀取。**如果設為 true， `sampleQuery`必須以 "where" 或 "and" 結尾，Glue AWS 才能附加分割條件。**如需詳細資訊，請參閱[使用 sampleQuery](#aws-glue-programming-etl-jdbc-samplequery)。
+ `"sampleSize"`：(選用) 正整數。限制範例查詢傳回的資料列數。只有當 `enablePartitioningForSampleQuery` 為 true 時才適用。如果未啟用分割，則應直接在 `sampleQuery` 中新增 `"limit x"` 以限制大小。如需詳細資訊，請參閱[使用 sampleQuery](#aws-glue-programming-etl-jdbc-samplequery)。

## 使用 sampleQuery
<a name="aws-glue-programming-etl-jdbc-samplequery"></a>

本節說明如何使用 `sampleQuery`、`sampleSize` 和 `enablePartitioningForSampleQuery`。

可以使用 `sampleQuery` 高效地對資料集的幾個資料列進行抽樣。依預設，由單一執行器執行查詢。在不考慮資料的情況下進行設定時，效率可能比 DynamicFrame 方法低，從而會導致逾時或記憶體不足的錯誤。作為 ETL 管道的一部分，在基礎資料庫上執行 SQL 通常只需用於效能目的。如果您嘗試預覽資料集的幾個資料列，請考慮使用 [顯示](aws-glue-api-crawler-pyspark-extensions-dynamic-frame.md#aws-glue-api-crawler-pyspark-extensions-dynamic-frame-show)。如果您嘗試使用 SQL 轉換資料集，請考慮使用 [toDF](aws-glue-api-crawler-pyspark-extensions-dynamic-frame.md#aws-glue-api-crawler-pyspark-extensions-dynamic-frame-toDF) 針對 DataFrame 表單中的資料定義 SparkSQL 轉換。

雖然您的查詢可能會操作各種資料表，但 `dbtable` 仍然是必需的。

**使用 sampleQuery 擷取資料表範例**

使用預設 sampleQuery 行為擷取資料範例時， AWS Glue 不會預期大量輸送量，因此會在單一執行器上執行您的查詢。為了限制您提供的資料而不會導致效能問題，我們建議您向 SQL 提供一個 `LIMIT` 子句。

**Example 使用 sampleQuery 而不進行分割**  
以下程式碼範例顯示如何使用 `sampleQuery` 而不進行分割。  

```
//A full sql query statement.
val query = "select name from $tableName where age > 0 limit 1"
val connectionOptions = JsonOptions(Map(
    "url" -> url, 
    "dbtable" -> tableName, 
    "user" -> user, 
    "password" -> password, 
    "sampleQuery" -> query ))
val dyf = glueContext.getSource("mysql", connectionOptions)
          .getDynamicFrame()
```

**針對較大的資料集使用 sampleQuery**

 如果您要讀取大型資料集，則可能需要啟用 JDBC 分割以並行查詢資料表。如需詳細資訊，請參閱[從 JDBC 資料表中平行讀取](run-jdbc-parallel-read-job.md)。若要搭配使用 `sampleQuery` 與 JDBC 分割，請將 `enablePartitioningForSampleQuery` 設定為 true。啟用此功能需要您對 `sampleQuery` 進行一些更改。

搭配 使用 JDBC 分割時`sampleQuery`，您的查詢必須以 "where" 或 "and" 結尾，Glue AWS 才能附加分割條件。

 如果您想要在從 JDBC 資料表平行讀取時限制 SampleQuery 的結果數量，請設定 `"sampleSize"` 參數，而不是指定 `LIMIT` 子句。

**Example 搭配使用 sampleQuery 與 JDBC 分區**  
以下程式碼範例顯示如何搭配使用 `sampleQuery` 與 JDBC 分區。  

```
//note that the query should end with "where" or "and" if use with JDBC partitioning.
val query = "select name from $tableName where age > 0 and"

//Enable JDBC partitioning by setting hashfield.
//to use sampleQuery with partitioning, set enablePartitioningForSampleQuery.
//use sampleSize to limit the size of returned data.
val connectionOptions = JsonOptions(Map(
    "url" -> url, 
    "dbtable" -> tableName, 
    "user" -> user, 
    "password" -> password, 
    "hashfield" -> primaryKey,
    "sampleQuery" -> query,
    "enablePartitioningForSampleQuery" -> true,
    "sampleSize" -> "1" ))
val dyf = glueContext.getSource("mysql", connectionOptions)
          .getDynamicFrame()
```

 **備註和限制：**

範例查詢不可與任務書籤一起使用。在提供兩者的組態時，系統將忽略書籤狀態。

## 使用自訂 JDBC 驅動程式
<a name="aws-glue-programming-etl-jdbc-custom-driver"></a>

下面的程式碼範例示範如何讀取和寫入使用自訂 JDBC 驅動程式的 JDBC 資料庫。這些範例示範讀取一個版本的資料庫產品並寫入相同產品的更高版本。

------
#### [ Python ]

```
import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext, SparkConf
from awsglue.context import GlueContext
from awsglue.job import Job
import time
from pyspark.sql.types import StructType, StructField, IntegerType, StringType

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session

# Construct JDBC connection options
connection_mysql5_options = {
    "url": "jdbc:mysql://<jdbc-host-name>:3306/db",
    "dbtable": "test",
    "user": "admin",
    "password": "pwd"}

connection_mysql8_options = {
    "url": "jdbc:mysql://<jdbc-host-name>:3306/db",
    "dbtable": "test",
    "user": "admin",
    "password": "pwd",
    "customJdbcDriverS3Path": "s3://amzn-s3-demo-bucket/mysql-connector-java-8.0.17.jar",
    "customJdbcDriverClassName": "com.mysql.cj.jdbc.Driver"}

connection_oracle11_options = {
    "url": "jdbc:oracle:thin:@//<jdbc-host-name>:1521/ORCL",
    "dbtable": "test",
    "user": "admin",
    "password": "pwd"}

connection_oracle18_options = {
    "url": "jdbc:oracle:thin:@//<jdbc-host-name>:1521/ORCL",
    "dbtable": "test",
    "user": "admin",
    "password": "pwd",
    "customJdbcDriverS3Path": "s3://amzn-s3-demo-bucket/ojdbc10.jar",
    "customJdbcDriverClassName": "oracle.jdbc.OracleDriver"}

# Read from JDBC databases with custom driver
df_mysql8 = glueContext.create_dynamic_frame.from_options(connection_type="mysql",
                                                          connection_options=connection_mysql8_options)

# Read DynamicFrame from MySQL 5 and write to MySQL 8
df_mysql5 = glueContext.create_dynamic_frame.from_options(connection_type="mysql",
                                                          connection_options=connection_mysql5_options)
glueContext.write_from_options(frame_or_dfc=df_mysql5, connection_type="mysql",
                               connection_options=connection_mysql8_options)

# Read DynamicFrame from Oracle 11 and write to Oracle 18
df_oracle11 = glueContext.create_dynamic_frame.from_options(connection_type="oracle",
                                                            connection_options=connection_oracle11_options)
glueContext.write_from_options(frame_or_dfc=df_oracle11, connection_type="oracle",
                               connection_options=connection_oracle18_options)
```

------
#### [ Scala ]

```
import com.amazonaws.services.glue.GlueContext
import com.amazonaws.services.glue.MappingSpec
import com.amazonaws.services.glue.errors.CallSite
import com.amazonaws.services.glue.util.GlueArgParser
import com.amazonaws.services.glue.util.Job
import com.amazonaws.services.glue.util.JsonOptions
import com.amazonaws.services.glue.DynamicFrame
import org.apache.spark.SparkContext
import scala.collection.JavaConverters._


object GlueApp {
  val MYSQL_5_URI: String = "jdbc:mysql://<jdbc-host-name>:3306/db"
  val MYSQL_8_URI: String = "jdbc:mysql://<jdbc-host-name>:3306/db"
  val ORACLE_11_URI: String = "jdbc:oracle:thin:@//<jdbc-host-name>:1521/ORCL"
  val ORACLE_18_URI: String = "jdbc:oracle:thin:@//<jdbc-host-name>:1521/ORCL"

  // Construct JDBC connection options
  lazy val mysql5JsonOption = jsonOptions(MYSQL_5_URI)
  lazy val mysql8JsonOption = customJDBCDriverJsonOptions(MYSQL_8_URI, "s3://amzn-s3-demo-bucket/mysql-connector-java-8.0.17.jar", "com.mysql.cj.jdbc.Driver")
  lazy val oracle11JsonOption = jsonOptions(ORACLE_11_URI)
  lazy val oracle18JsonOption = customJDBCDriverJsonOptions(ORACLE_18_URI, "s3://amzn-s3-demo-bucket/ojdbc10.jar", "oracle.jdbc.OracleDriver")

  def main(sysArgs: Array[String]): Unit = {
    val spark: SparkContext = new SparkContext()
    val glueContext: GlueContext = new GlueContext(spark)
    val args = GlueArgParser.getResolvedOptions(sysArgs, Seq("JOB_NAME").toArray)
    Job.init(args("JOB_NAME"), glueContext, args.asJava)

    // Read from JDBC database with custom driver
    val df_mysql8: DynamicFrame = glueContext.getSource("mysql", mysql8JsonOption).getDynamicFrame()

    // Read DynamicFrame from MySQL 5 and write to MySQL 8
    val df_mysql5: DynamicFrame = glueContext.getSource("mysql", mysql5JsonOption).getDynamicFrame()
    glueContext.getSink("mysql", mysql8JsonOption).writeDynamicFrame(df_mysql5)

    // Read DynamicFrame from Oracle 11 and write to Oracle 18
    val df_oracle11: DynamicFrame = glueContext.getSource("oracle", oracle11JsonOption).getDynamicFrame()
    glueContext.getSink("oracle", oracle18JsonOption).writeDynamicFrame(df_oracle11)

    Job.commit()
  }

  private def jsonOptions(url: String): JsonOptions = {
    new JsonOptions(
      s"""{"url": "${url}",
         |"dbtable":"test",
         |"user": "admin",
         |"password": "pwd"}""".stripMargin)
  }

  private def customJDBCDriverJsonOptions(url: String, customJdbcDriverS3Path: String, customJdbcDriverClassName: String): JsonOptions = {
    new JsonOptions(
      s"""{"url": "${url}",
         |"dbtable":"test",
         |"user": "admin",
         |"password": "pwd",
         |"customJdbcDriverS3Path": "${customJdbcDriverS3Path}",
         |"customJdbcDriverClassName" : "${customJdbcDriverClassName}"}""".stripMargin)
  }
}
```

------

# 從 JDBC 資料表中平行讀取
<a name="run-jdbc-parallel-read-job"></a>

您可以設定 JDBC 資料表的屬性，讓 AWS Glue 平行讀取資料。設定特定屬性時，您指示 AWS Glue 來對資料的邏輯分割區執行平行 SQL 查詢。您可以透過設定雜湊欄位或雜湊表達式來控制分割。您也可以控制平行讀取的數量，這些讀取會用來存取您的資料。

並行讀取 JDBC 資料表是一種可以提高性能的最佳化技術。如需識別此技術何時適當之程序的詳細資訊，請參閱 AWS 《 方案指南》中的 *Apache Spark AWS Glue 任務效能調校最佳實務*指南》中的[減少資料掃描量](https://docs.aws.amazon.com/prescriptive-guidance/latest/tuning-aws-glue-for-apache-spark/parallelize-tasks.html)。

若要啟用平行讀取，您須在資料表結構的參數欄位中設定鍵值組。使用 JSON 符號來設定資料表的參數欄位值。關於編輯資料表屬性的詳細資訊，請參閱 [檢視與管理資料表詳細資訊](tables-described.md#console-tables-details)。您也可以在呼叫 ETL (擷取、轉換和載入) 方法 `create_dynamic_frame_from_options` 和 `create_dynamic_frame_from_catalog` 時啟用平行讀取。如需如何在這些方法中指定選項的詳細資訊，請參閱 [from\$1options](aws-glue-api-crawler-pyspark-extensions-dynamic-frame-reader.md#aws-glue-api-crawler-pyspark-extensions-dynamic-frame-reader-from_options) 和 [from\$1catalog](aws-glue-api-crawler-pyspark-extensions-dynamic-frame-reader.md#aws-glue-api-crawler-pyspark-extensions-dynamic-frame-reader-from_catalog)。

您可以對 JDBC 資料表 (也就是基礎資料為 JDBC 資料存放區的多數資料表) 使用此方法。讀取 Amazon Redshift 和 Amazon S3 資料表時，會略過這些屬性。

**hashfield**  
將 `hashfield` 設為 JDBC 資料表中的欄位名稱，該 JDBC 資料表將用來將資料分配至分割區中。為獲得最佳結果，此欄位應擁有平均的分散值來將資料分散在分割區中。此欄位可以是任何資料類型。AWS Glue 會產生無重疊的查詢，這些查詢會平行執行，以讀取此欄位所分割的資料。例如，如果您的資料依月份平均分散，您可以使用 `month` 欄位來平行讀取每個月的資料：  

```
  'hashfield': 'month'
```
AWS Glue 建立查詢來將欄位值湊雜為分割區編號， 並針對所有分割區平行執行查詢。若要使用您自己的查詢來分割資料表讀取， 請提供 `hashexpression` 而非 `hashfield`。

**hashexpression**  
將 `hashexpression` 設定為 SQL 表達式 (符合 JDBC 資料庫引擎文法)，此表達式會傳回一個整數。簡單表達式是資料表中任何數值欄位的名稱。AWS Glue 會產生 SQL 查詢來使用 `hashexpression` 子句中的 `WHERE` 來平行讀取 JDBC 資料以分割資料。  
例如，使用數值欄位 `customerID` 來讀取依客戶編號分割的資料：  

```
  'hashexpression': 'customerID'
```
若要讓 AWS Glue 控制分割，請提供 `hashfield` 而非 `hashexpression`。

**hashpartitions**  
將 `hashpartitions` 設定為 JDBC 資料表的平行讀取數。如果未設定該屬性，預設值為 7。  
例如，將平行讀取數設定為 `5`，讓 AWS Glue 使用五個 (或更少) 查詢來讀取資料：  

```
  'hashpartitions': '5'
```

# 針對從 AWS Glue 到 Amazon RDS 資料存放區的 JDBC 連線設定 Amazon VPC
<a name="setup-vpc-for-glue-access"></a>

 使用 JDBC 連線到 Amazon RDS 中的資料庫時，需要執行額外的設定。若要讓 AWS Glue 元件與 Amazon RDS 通訊，必須在 Amazon VPC 中設定對 Amazon RDS 資料存放區的存取。要讓 AWS Glue 在其元件之間通訊，請指定一個安全群組並為所有 TCP 連接埠建立自我參考的傳入規則。建立自我參考的規則後，您就可以將資源限制給 VPC 中相同的安全群組。自我參考規則不會向所有網路開啟 VPC。VPC 的預設安全群組可能已經有了 ALL Traffic 的自我參考傳入規則。

**設定 AWS Glue 和 Amazon RDS 資料存放區之間的存取權**

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)：// 開啟 Amazon RDS 主控台。

1. 在 Amazon RDS 主控台中，識別用來控制 Amazon RDS 資料庫存取的安全群組。

   在左側導覽窗格中，選擇**資料庫**，然後從主窗格清單中選取要連接的執行個體。

   在資料庫詳細資訊頁面的**連線與安全**索引標籤中，找到 **VPC 安全群組**。

1. 根據您的網路架構，識別最適合修改的關聯安全群組，以允許 Glue AWS 服務的存取。儲存其名稱 *database-security-group* 以供日後參考。如果沒有適當的安全群組，請遵循 Amazon RDS 文件中的指示，[透過建立安全群組來存取 VPC 中的資料庫執行個體](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_SettingUp.html)。

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)：// 開啟 Amazon VPC 主控台。

1. 在 Amazon VPC 主控台中，識別如何更新 *database-security-group*。

   在左側導覽窗格中，選擇**安全群組**，然後從主窗格清單中選取 *database-security-group*。

1. 找到 *database-security-group* 的安全群組 ID，*database-sg-id*。儲存其以供日後參考。

   在安全群組詳細資訊頁面中，找到**安全群組 ID**。

1. 變更 *database-security-group* 的傳入規則，新增自我參考規則，以允許 AWS Glue 元件進行通訊。具體來說，新增或確認有這樣一個規則，其**類型**為 `All TCP`，**通訊協定**為 `TCP`，**連接埠範圍**包含所有連接埠，且**來源**為 *database-sg-id*。確認您為**來源**輸入的安全群組與您編輯的安全群組相同。

   在安全群組詳細資訊頁面中，選取**編輯傳入規則**。

   傳入規則類似：  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/setup-vpc-for-glue-access.html)

1. 新增傳出流量的規則。

   在安全群組詳細資訊頁面中，選取**編輯傳出規則**。

   如果安全群組允許所有傳出流量，則不需要單獨的規則。例如：  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/setup-vpc-for-glue-access.html)

   如果網路架構旨在限制傳出流量，請建立下列傳出規則：

   建立自我參考規則，其中**類型**為 `All TCP`，**通訊協定**為 `TCP`，**連接埠範圍**包含所有連接埠，**目的地**為 *database-sg-id*。確認您為**目的地**輸入的安全群組與您編輯的安全群組相同。

    如果使用 Amazon S3 VPC 端點，則請新增 HTTPS 規則，以允許從 VPC 到 Amazon S3 的流量。建立一個規則，其中**類型**為 `HTTPS`，**通訊協定**為 `TCP`，**連接埠範圍**為 `443`，**目的地**為 Amazon S3 閘道端點受管字首清單的 ID *s3-prefix-list-id*。如需字首清單和 Amazon S3 閘道端點的詳細資訊，請參閱 Amazon VPC 文件中的 [Amazon S3 的閘道端點](https://docs.aws.amazon.com//vpc/latest/privatelink/vpc-endpoints-s3.html)。

   例如：  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/setup-vpc-for-glue-access.html)