All Products
Search
Document Center

Lindorm:Use the Amazon S3 API for a non-Java language to develop applications

Last Updated:Mar 28, 2026

LindormTable supports the Amazon S3 protocol, so you can connect to it using any S3-compatible SDK — no Lindorm-specific client library required. This topic shows how to connect and run basic operations using the AWS SDK for Go and boto3 for Python.

Prerequisites

Before you begin, ensure that you have:

  • The S3 Compatibility Address endpoint from the Wide Table Engine tab in the Lindorm console. For details, see View endpoints.View connection addresses

  • Your client IP address added to the whitelist of your Lindorm instance. For details, see Configure whitelists.

  • Your AccessKey ID and AccessKey secret stored as environment variables:

    export ALIBABA_CLOUD_ACCESS_KEY_ID=<your-access-key-id>
    export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<your-access-key-secret>

Connect using Go

Install the SDK

go get github.com/aws/aws-sdk-go

Configure the client

Three parameters require non-default values for LindormTable:

ParameterValueReason
Region"lindorm"Required by the SDK; not used for routing by LindormTable
S3ForcePathStyletrueLindormTable requires path-style addressing
EndpointS3 Compatibility Address from the Lindorm consoleRoutes requests to your LindormTable instance
package main

import (
    "log"
    "os"
    "strings"

    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/credentials"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/s3"
)

const (
    // Replace with the S3 Compatibility Address from the Wide Table Engine tab in the Lindorm console.
    s3endpoint = "http://ld-bp17j28j2y7pm****-proxy-lindorm.lindorm.rds.aliyuncs.com:9053"
)

func main() {
    conf := &aws.Config{
        Credentials: credentials.NewStaticCredentials(
            os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),     // AccessKey ID
            os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"), // AccessKey secret
            "",
        ),
        Region:           aws.String("lindorm"),  // Required by the SDK; not used for routing by LindormTable
        Endpoint:         aws.String(s3endpoint),
        S3ForcePathStyle: aws.Bool(true),         // LindormTable requires path-style addressing
    }

    sess, err := session.NewSession(conf)
    if err != nil {
        log.Fatal("Failed to create session:", err)
    }
    svc := s3.New(sess)

List all buckets

    input := &s3.ListBucketsInput{}
    result, err := svc.ListBuckets(input)
    if err != nil {
        log.Fatal("Failed to list buckets:", err)
    }
    println(result.String())

Create a bucket

    bucket := "testbucketgo"

    out, err := svc.CreateBucket(&s3.CreateBucketInput{Bucket: &bucket})
    log.Println(out)
    if err != nil {
        log.Fatal("Failed to create bucket:", err)
    }

    if err = svc.WaitUntilBucketExists(&s3.HeadBucketInput{Bucket: &bucket}); err != nil {
        log.Fatalf("Failed to wait for bucket %s to exist: %s\n", bucket, err)
    }

Write an object

    key := "testObjectGo"

    _, err = svc.PutObject(&s3.PutObjectInput{
        Body:   strings.NewReader("Hello World!"),
        Bucket: &bucket,
        Key:    &key,
    })
    if err != nil {
        log.Fatalf("Failed to upload object to %s/%s: %s\n", bucket, key, err)
    }
}

Connect using Python

Install the SDK

pip install boto3

Configure the client

The addressing_style: 'path' setting enables path-style addressing, which LindormTable requires.

import os
import boto3
from botocore.client import Config

# Replace with the S3 Compatibility Address from the Wide Table Engine tab in the Lindorm console.
s3endpoint = 'http://ld-bp17j28j2y7pm****-proxy-lindorm.lindorm.rds.aliyuncs.com:9053'

s3client = boto3.client(
    's3',
    aws_access_key_id=os.environ.get("ALIBABA_CLOUD_ACCESS_KEY_ID"),       # AccessKey ID
    aws_secret_access_key=os.environ.get("ALIBABA_CLOUD_ACCESS_KEY_SECRET"), # AccessKey secret
    endpoint_url=s3endpoint,
    config=Config(s3={'addressing_style': 'path'})  # LindormTable requires path-style addressing
)

List all buckets

buckets = s3client.list_buckets()
for bucket in buckets['Buckets']:
    print(bucket["Name"])

A successful response prints bucket names, one per line:

testbucketpython

Create a bucket

s3client.create_bucket(Bucket="testbucketpython")

Upload an object

s3client.upload_file("demo.py", "testbucketpython", "demo.py")

Download an object

s3client.download_file('testbucketpython', 'demo.py', 'demo.py.download')

What's next