You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Go语言将OCI Function连接至OCI NoSQL数据库

问题:OCI两款Go SDK的连接配置实现

我要使用OCI提供的两款Go SDK:

  • OCI SDK for Go
  • Oracle NoSQL Database Go SDK

尝试通过同目录下的配置文件进行连接,配置文件内容如下:

[DEFAULT]
tenancy=ocid1.tenancy.oc1..abcdefg
user=ocid1.user.oc1..abcdefg
fingerprint=00:00:00:00:00.....
key_file="./oci.pem"
region=eu-frankfurt-1

当前代码框架如下:

package main

import (
    "context"
    "encoding/json"
    "io"
    "net/http"

    fdk "github.com/fnproject/fdk-go"
)

func main() {
    fdk.Handle(fdk.HandlerFunc(fnHandler))
}

func fnHandler(ctx context.Context, in io.Reader, out io.Writer) {
    fnctx, ok := fdk.GetContext(ctx).(fdk.HTTPContext)
    if !ok {
        fdk.WriteStatus(out, http.StatusBadRequest)
        io.WriteString(out, `{"error":"Invalid Request"}`)
        return
    }

    /** Oracle NoSQL and Object Storage Connection */

    /**
     * 需要补充连接配置代码
     */

    response := struct {
        URL     string            `json:"url"`
        Header  http.Header       `json:"header"`
        Config  map[string]string `json:"config"`
        Message bool              `json:"ok"`
    }{
        URL:     fnctx.RequestURL(),
        Header:  fnctx.Header(),
        Config:  fnctx.Config(),
        Message: ok,
    }

    fdk.WriteStatus(out, http.StatusCreated)
    json.NewEncoder(out).Encode(&response)
}

以下是完整的连接配置实现方案:


1. OCI SDK for Go(以对象存储为例)连接配置

先安装SDK依赖:

go get github.com/oracle/oci-go-sdk/v65/common
go get github.com/oracle/oci-go-sdk/v65/objectstorage

在代码的连接注释区域添加以下配置代码:

// 加载同目录下的OCI配置文件
configProvider, err := common.ConfigurationProviderFromFile("./config", "DEFAULT")
if err != nil {
    fdk.WriteStatus(out, http.StatusInternalServerError)
    io.WriteString(out, `{"error":"Failed to load OCI config: "`+err.Error()+`}`)
    return
}

// 创建对象存储客户端
objectStorageClient, err := objectstorage.NewObjectStorageClientWithConfigurationProvider(configProvider)
if err != nil {
    fdk.WriteStatus(out, http.StatusInternalServerError)
    io.WriteString(out, `{"error":"Failed to create Object Storage client: "`+err.Error()+`}`)
    return
}

2. Oracle NoSQL Database Go SDK连接配置

先安装SDK依赖:

go get github.com/oracle/nosql-go-sdk/nosqldb

同样在连接注释区域添加NoSQL配置代码:

// 配置NoSQL客户端,复用已加载的OCI身份配置
cfg := nosqldb.Config{
    Region: "eu-frankfurt-1",
    AuthCfg: nosqldb.AuthConfig{
        Provider: configProvider,
    },
}

// 创建NoSQL客户端
nosqlClient, err := nosqldb.NewClient(cfg)
if err != nil {
    fdk.WriteStatus(out, http.StatusInternalServerError)
    io.WriteString(out, `{"error":"Failed to create NoSQL client: "`+err.Error()+`}`)
    return
}

完整代码示例

package main

import (
    "context"
    "encoding/json"
    "io"
    "net/http"

    fdk "github.com/fnproject/fdk-go"
    "github.com/oracle/oci-go-sdk/v65/common"
    "github.com/oracle/oci-go-sdk/v65/objectstorage"
    "github.com/oracle/nosql-go-sdk/nosqldb"
)

func main() {
    fdk.Handle(fdk.HandlerFunc(fnHandler))
}

func fnHandler(ctx context.Context, in io.Reader, out io.Writer) {
    fnctx, ok := fdk.GetContext(ctx).(fdk.HTTPContext)
    if !ok {
        fdk.WriteStatus(out, http.StatusBadRequest)
        io.WriteString(out, `{"error":"Invalid Request"}`)
        return
    }

    /** Oracle NoSQL and Object Storage Connection */

    // 加载OCI配置
    configProvider, err := common.ConfigurationProviderFromFile("./config", "DEFAULT")
    if err != nil {
        fdk.WriteStatus(out, http.StatusInternalServerError)
        io.WriteString(out, `{"error":"Failed to load OCI config: "`+err.Error()+`}`)
        return
    }

    // 创建对象存储客户端
    objectStorageClient, err := objectstorage.NewObjectStorageClientWithConfigurationProvider(configProvider)
    if err != nil {
        fdk.WriteStatus(out, http.StatusInternalServerError)
        io.WriteString(out, `{"error":"Failed to create Object Storage client: "`+err.Error()+`}`)
        return
    }

    // 配置并创建NoSQL客户端
    cfg := nosqldb.Config{
        Region: "eu-frankfurt-1",
        AuthCfg: nosqldb.AuthConfig{
            Provider: configProvider,
        },
    }
    nosqlClient, err := nosqldb.NewClient(cfg)
    if err != nil {
        fdk.WriteStatus(out, http.StatusInternalServerError)
        io.WriteString(out, `{"error":"Failed to create NoSQL client: "`+err.Error()+`}`)
        return
    }

    // 可在此添加客户端业务逻辑,比如查询存储桶或NoSQL数据

    response := struct {
        URL            string            `json:"url"`
        Header         http.Header       `json:"header"`
        Config         map[string]string `json:"config"`
        Message        bool              `json:"ok"`
        ClientsCreated bool              `json:"clients_created"`
    }{
        URL:            fnctx.RequestURL(),
        Header:         fnctx.Header(),
        Config:         fnctx.Config(),
        Message:        ok,
        ClientsCreated: true,
    }

    fdk.WriteStatus(out, http.StatusCreated)
    json.NewEncoder(out).Encode(&response)
}

注意事项

  • 确保配置文件中的key_file路径正确,代码中加载配置的路径要和实际文件位置匹配。
  • 密钥文件oci.pem需设置合理权限(建议chmod 600 oci.pem),避免权限过大导致验证失败。
  • 若在OCI函数环境运行,可改用Instance Principal身份验证,无需本地配置文件,只需替换configProvider的获取方式。

内容的提问来源于stack exchange,提问作者Fotios Tragopoulos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 07:40:03