如何使用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
相关产品推荐
相关产品推荐

