> ## Documentation Index
> Fetch the complete documentation index at: https://docs.maia.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Uploading external drivers to a Maia runner

export const m_runner = "Maia runner";

export const maia = "Maia";

export const RunnerMetadata = ({runnerType, platforms = []}) => {
  return <div style={{
    background: 'var(--colors-background-light, #f9fafb)',
    border: '1px solid var(--colors-border-default, #e5e7eb)',
    borderRadius: '12px',
    padding: '20px 28px',
    marginBottom: '28px'
  }}>
      <table style={{
    width: '100%',
    borderCollapse: 'collapse'
  }}>
        <tbody>
          <tr>
            <td style={{
    fontWeight: '600',
    paddingRight: '32px',
    paddingBottom: '14px',
    whiteSpace: 'nowrap',
    verticalAlign: 'middle',
    width: '180px'
  }}>Runner type</td>
            <td style={{
    paddingBottom: '14px',
    verticalAlign: 'middle'
  }}>{runnerType}</td>
          </tr>
          <tr>
            <td style={{
    fontWeight: '600',
    paddingRight: '32px',
    whiteSpace: 'nowrap',
    verticalAlign: 'middle'
  }}>Runner platform</td>
            <td style={{
    verticalAlign: 'middle'
  }}>
              <div style={{
    display: 'flex',
    flexWrap: 'wrap',
    gap: '8px'
  }}>
                {platforms.map((platform, i) => <span key={i} style={{
    background: '#dcfce7',
    color: '#15803d',
    border: '1px solid #bbf7d0',
    borderRadius: '9999px',
    padding: '3px 12px',
    fontSize: '0.85rem',
    fontWeight: '500',
    whiteSpace: 'nowrap'
  }}>
                    {platform} ✅
                  </span>)}
              </div>
            </td>
          </tr>
        </tbody>
      </table>
    </div>;
};

<RunnerMetadata runnerType={`${maia} Hybrid`} platforms={["AWS", "Azure", "Google Cloud"]} />

The AWS, Azure, and Google Cloud hosted [{m_runner}s](/docs/guides/runner-overview#hybrid-saas) natively include drivers for a large number of third-party connectors. There are, however, certain external drivers that aren't supplied by default.

For drivers that aren't supplied by default, you can upload your own drivers to the {m_runner} at runtime by specifying a storage location in your infrastructure that will hold the driver files.

<Note>
  * Adding additional unsupported drivers to the {m_runner} will result in increased startup time with no guarantee that they will work, so we don't recommend doing this. Supported drivers are listed [below](#drivers-needed-for-components).
  * There is no support for importing external drivers to Matillion-hosted {m_runner}s in a [Full SaaS](/docs/guides/runner-overview#matillion-full-saas) solution.
  * When adding new drivers, an [{m_runner} restart](/docs/guides/restart-runner) is required to recognize the configuration. Once the {m_runner} has restarted, you can choose the driver from the **Database Type** property in the component.
</Note>

***

## Valid external driver file types

Only the `.jar`, `.so`, and `.sso` (Oracle Wallet) file types will be recognized as external drivers. The {m_runner} will ignore any other file types present in the drivers storage location.

***

## AWS-hosted Maia runner

To load external drivers into an AWS-hosted {m_runner}, store the driver files in an S3 bucket that's in the same account space as the {m_runner} and accessible by the {m_runner}.

The IAM role for the account the {m_runner} is hosted in will need to have at least the following permissions to access S3 buckets:

* `s3:ListAllMyBuckets`
* `s3:ListBucket`
* `s3:GetObject`
* `s3:GetBucketLocation`

These will be applied automatically if you created the {m_runner} using the provided [CloudFormation template](/docs/guides/runner-installation-cloudformation-quick-create).

The {m_runner} must have the `EXTERNAL_DRIVER_LOCATION` environment variable added and set to the location of the driver files in the S3 bucket—for example, `s3://driver-bucket/my-drivers`. You can omit `s3://` from this, as the {m_runner} will assume the connection is to an S3 bucket and automatically use the correct protocol. For more information on setting this, read [Optional {m_runner} parameters](/docs/guides/optional-runner-parameters).

When you launch a new {m_runner} with the CloudFormation template, the configuration page in the AWS console will have a field named **External Driver Location**. Enter the path for the driver location here.

If you are updating an existing {m_runner}, you will need to create a new revision of the task definition in use, and add the `EXTERNAL_DRIVER_LOCATION` environment variable with the appropriate path. Then, restart the service using the new task definition.

***

## Azure-hosted Maia runner

To load external drivers into an Azure-hosted {m_runner}, store the drivers in an Azure Blob container in a storage account that is in the same resource group as the {m_runner} and accessible by the {m_runner}.

The storage account's managed identity associated with the {m_runner}'s container will need to have at least the following permissions:

* `Storage Account Contributor`
* `Storage Blob Data Contributor`
* `Storage Blob Data Reader`

These will be applied automatically if you create the {m_runner} using the provided [ARM template](/docs/guides/azure-arm-runner-install).

The {m_runner} must have the `EXTERNAL_DRIVER_LOCATION` environment variable added and set to the location of driver files in the Azure Blob container—for example, `https://mystorageaccount.blob.core.windows.net/my-drivers`. You can omit `https://` from this, as the {m_runner} will assume the connection is to a Blob container and automatically use the correct protocol. For more information on this, read [Optional {m_runner} parameters](/docs/guides/optional-runner-parameters).

When you launch a new {m_runner} with the ARM template, the configuration page in the Azure Portal will have a field named **External Driver Location**. Enter the path for the driver location here.

If you are updating an existing {m_runner}, you will need to edit and deploy the existing container and add the `EXTERNAL_DRIVER_LOCATION` environment variable, with the appropriate path. Then, create the new revision.

<Note>
  When specifying a value for External Driver Location, the driver files and manifest file must be placed at the root level of the container. Placing these files within a subfolder will cause the {m_runner} installation to fail.

  For more information on {m_runner} installation, read [{m_runner} installation](/docs/guides/azure-arm-runner-install#completing-the-installation).
</Note>

***

## Google Cloud-hosted Maia runner

To load external drivers into a GKE-hosted {m_runner}, store the driver files in a GCS bucket that is accessible to the {m_runner}'s Workload Identity service account.

Grant the {m_runner}'s Workload Identity service account the following roles on the GCS bucket:

* `roles/storage.legacyBucketReader`
* `roles/storage.objectViewer`

The recommended way to grant these permissions is to add the bucket name to the `agent_gcs_buckets` Terraform variable and run `terraform apply`. This grants the required roles automatically. Read the [GCP IAM permissions guide](/docs/guides/gcp-iam-permissions-for-runner) for details.

Set the `externalDriverLocation` environment variable in the `dpcAgent.dpcAgent.env` block of your `values-gcp.yaml` file to the location of the driver files in the GCS bucket—for example, `gs://driver-bucket/my-drivers`. Then run `helm upgrade` to apply the change. For more information, read [Optional {m_runner} parameters](/docs/guides/optional-runner-parameters#adding-or-updating-gke-environment-variables).

***

## Matillion Maia runner for Snowflake

You can upload drivers and certificates to [Matillion {m_runner} for Snowflake](/docs/guides/snowflake-runner-install) by storing them in a stage in your Snowflake account that is accessible by the {m_runner}.

1. In the Snowsight interface of your Snowflake account, navigate to **Catalog** → **Database Explorer**.
2. Find your Matillion {m_runner} application in the **Database Explorer**. The application is usually called "Matillion {maia}", but it may be different if you have multiple {m_runner} instances installed. Read [Installing Matillion {m_runner}s for Snowflake](/docs/guides/snowflake-runner-install) for details.
3. Expand the application and navigate to the relevant stage: **MATILLION\_DATA\_PRODUCTIVITY\_CLOUD** → **CONFIG** → **Stages**, and then **CUSTOM\_CERTIFICATE\_STAGE** or **EXTERNAL\_DRIVERS\_STAGE**.
4. Click the stage name to open it.
5. Click **+Files** in the top-right corner to upload the driver files or certificates.
6. The {m_runner} must be restarted to recognize the new drivers or certificates. You can do this from the **Control Panel** of the Matillion {m_runner} application in Snowsight, or through the **runner manager** in {maia}. Read [Restart a {m_runner}](/docs/guides/restart-runner#restart-a-snowflake-maia-runner) for details.
7. Once the {m_runner} has restarted, you can use the external driver or certificate in pipeline components.

You may need to perform some additional configuration for the driver, for example:

* Update rules to open the endpoint and port of your data source. Read [Troubleshooting Matillion {m_runner} for Snowflake](/docs/guides/snowflake-runner-troubleshooting#how-to-open-more-ports) for details.
* Add a secret to use when configuring the driver. Read [Secrets in Matillion {m_runner} for Snowflake](/docs/guides/snowflake-runner-secrets) for details.

Files uploaded through Snowsight can't be deleted from the stage. The [Snowflake documentation](https://community.snowflake.com/s/article/This-article-explains-why-snowsight-does-not-delete-from-internal-stage) explains this issue and provides an SQL-based workaround.

***

## Drivers needed for components

This section lists {maia} components that require external drivers to be uploaded to the {m_runner}.

### SAP ODP

For the [SAP ODP](/docs/components/sap-odp) component, two driver files are required:

* `sapjco3.jar`
* `libsapjco3.so`

You can obtain these drivers as a single ZIP file from [Download SAP Java Connector 3.1 SDK](https://support.sap.com/en/product/connectors/jco.html?anchorId=section_2129803369), selecting **Linux for AArch64 compatible processors**. Unzip the file and place the drivers in the storage location you specified in `EXTERNAL_DRIVER_LOCATION`, as described above. Do **not** change the driver file names.

### JDBC

For the [JDBC](/docs/components/jdbc) component, you will need to upload any driver files required by the data source you are using. Consult the data source's documentation to discover which drivers you need and how to obtain them. Place the drivers in the storage location you specified in `EXTERNAL_DRIVER_LOCATION`, as described above.

This component also requires a driver **manifest** file to be uploaded. Read [Manifest file](/docs/components/jdbc#manifest-file) for details of how to create this file. Name the file `jdbc-driver-manifest.json` and place it in the storage location you specified in `EXTERNAL_DRIVER_LOCATION`, as described above.

### NetSuite SuiteAnalytics

For the [NetSuite SuiteAnalytics](/docs/components/netsuite-suiteanalytics) component, two driver files are required. You can obtain the required driver file from NetSuite as follows:

1. Log in to your NetSuite account.
2. On the homepage of your NetSuite account, under the **Settings** module, click **Set Up SuiteAnalytics Connect**.
3. Select **Linux 64-bit** from the drop-down.
4. Click the **Download** button next to **JDBC Driver**. This will download a zip file that contains a file called `NQjc.jar`.
5. Unzip the file and place the drivers in the storage location you specified in `EXTERNAL_DRIVER_LOCATION`, as described above. Do **not** change the driver file names.

***

### MySQL driver

When working with MySQL databases, specific driver requirements apply based on your deployment model:

* **Licensing restrictions:** Due to licensing constraints, {maia} cannot include the MySQL driver.
* **For Full SaaS customers:** Use the MariaDB driver with the following components:
  * [Database Query](/docs/components/database-query)
  * [JDBC Table Metadata to Grid](/docs/components/jdbc-table-metadata-to-grid)
* **For Hybrid SaaS customers:** In addition to the MariaDB driver, you can configure and use the native MySQL driver via the [JDBC](/docs/components/jdbc) component for enhanced compatibility.
