注意:
- 本教程需要访问 Oracle Cloud。要注册免费账户,请参阅开始使用 Oracle Cloud Infrastructure 免费套餐。
- 它对 Oracle Cloud Infrastructure 身份证明、租户和区间使用示例值。完成实验室后,请使用特定于云环境的那些值替换这些值。
将 OCI 对象存储 Amazon S3 兼容 API 与适用于 C++ 的 AWS SDK 结合使用
简介
Oracle Cloud Infrastructure (OCI) Object Storage 支持客户以原生格式安全地存储任何类型的数据。借助内置冗余,OCI Object Storage 非常适合构建需要扩展和灵活性的现代应用,因为它可用于整合多个数据源以进行分析、备份或归档。
OCI Object Storage 是云工作负载的基础,其弹性、可扩展性、可靠性和成本效率使其成为云中非结构化数据的主要存储。得益于 OCI 对象存储的广泛应用,OCI 对象存储提供了一个庞大的工具生态系统。
OCI 对象存储提供了一个 Amazon S3 兼容 API,客户可以继续使用现有的 Amazon S3 工具,只需要对应用进行很少的更改即可使用 OCI 对象存储。Amazon S3 兼容 API 和 OCI 对象存储数据集是一致的。如果使用 Amazon S3 兼容 API 将数据写入 OCI 对象存储,则可以使用 OCI 对象存储原生 API 读回数据,反之亦然。使用 AWS SDK for C++ 的客户在使用 Amazon S3 兼容 API 时可能会发现身份验证方面存在挑战,本教程旨在提供两个简单的示例来开始使用适用于 C++ 的 AWS SDK。
注意:这些是使用适用于 C++ 的 AWS SDK 的示例脚本,它们不是 Oracle 官方应用程序,不是 Oracle 维护或支持的应用程序。由于它们是示例,因此您可能需要根据您自己的软件存储库中的用例查看、更新和定制它们。Oracle 不对第三方 SDK 进行认证或提供支持。
目标
-
将适用于 C++ 的 AWS SDK 与 OCI Object Storage 结合使用时,应避免 SSL 证书和验证问题。
-
在 OCI Object Storage 服务中运行 ListBuckets 和 ListObjectsV2 的示例 C++ 代码。
先决条件
-
OCI 账户。
-
读取 OCI 对象存储中的存储桶和对象的用户权限。有关更多信息,请参见允许用户从对象存储桶下载对象。
-
访问现有存储桶,该存储桶中的现有对象嵌套在前缀/目录中。教程需要存储桶名称。有关详细信息,请参阅将数据放入对象存储教程。
-
熟悉在 macOS、Linux、Berkeley Software Distribution (BSD) 和 Windows PowerShell、命令提示符或 bash 上使用终端或 shell 接口。
-
访问 Linux 系统。
-
在 Linux 系统上安装软件的能力或权限。
-
在 Linux 系统上安装 Oracle Cloud Infrastructure 命令行界面 (OCI CLI) 并进行配置。有关更多信息,请参见 Installing the CLI 。
-
在 Linux 系统上使用
LD_LIBRARY_PATH
中的共享库安装适用于 C++ 的 AWS SDK。有关更多信息,请参见 Build the AWS SDK for C++ on Linux/macOS 。 -
在 Linux 系统上安装 Git。有关更多信息,请参见 Getting Started - Installing Git 。
任务 1:了解路径和虚拟托管样式 URL
在编写本教程时,OCI 对象存储 Amazon S3 兼容 API 支持路径式 URL。这意味着存储桶将位于 URL 路径中。
例如:
https://MyNamespace.compat.objectstorage.us-ashburn-1.oraclecloud.com/MyBucketName
或者
https://MyNamespace.compat.objectstorage.us-ashburn-1.oraclecloud.com/MyBucketName/MyObjectName
在虚拟托管式 URL 中,OCI 对象存储存储桶名称包含在 URL 的子域(或开头)中。
例如:
https://MyBucketName.MyNamespace.compat.objectstorage.us-ashburn-1.oraclecloud.com
或者
https://MyBucketName.MyNamespace.compat.objectstorage.us-ashburn-1.oraclecloud.com/MyObjectName
默认情况下,适用于 C++ 的 AWS SDK 使用虚拟托管样式 URL。如果遵循 AWS 生成的代码示例并替换 OCI 租户中的值,则会显示类似于以下输出的错误。有关更多信息,请参阅创建、列出和删除存储桶。
curlCode: 60, SSL peer certificate or SSH remote key was not OK
由于代码使用虚拟托管样式 URL,因此代码不会引用 OCI 对象存储存储桶或有效证书。
需要更改 S3Client 设置才能使用路径样式 URL。应使用以下命令设置配置。
Aws::Client::ClientConfiguration config;
S3Client s3Client(config, Aws::Client::AWSAuthV4Signer::PayloadSigningPolicy::Never, false);
任务 2:确定租户名称空间和 S3 API 区间
-
登录到您的 Linux 系统。
注:所有命令都将从 Linux 系统运行,在该系统中安装和配置了必要的先决条件。
-
运行
oci os ns get-metadata
OCI CLI 命令。$ oci os ns get-metadata { "data": { "default-s3-compartment-id": "ocid1.tenancy.oc1..bbbbcccdabcc0x0aaaaaa00aaaaaaaaaaa0b0b00ccccccccbbbbbbbb00aa", "default-swift-compartment-id": "ocid1.tenancy.oc1..bbbbcccdabcc0x0aaaaaa00aaaaaaaaaaa0b0b00ccccccccbbbbbbbb00aa", "namespace": "MyNamespace" } }
-
如果 S3 区间 OCID 包含单词
tenancy
,则它是根区间。使用以下命令获取名称。$ oci iam compartment get --compartment-id <compartment_ocid>
或者,对于租户根区间,运行以下命令。
$ oci iam tenancy get --tenancy-id <tenancy_ocid>
您也可以使用 OCI 控制台,方法是导航到右上角的配置文件并选择租户 (
your_tenancy_name
) 来确定名称空间和 S3 API 区间。S3 区间将在任务 4 中再次使用。
任务 3:创建客户密钥以访问 S3 兼容 API
使用 OCI CLI 命令生成密钥。
-
运行
oci iam customer-secret-key create
命令。oci iam customer-secret-key create --display-name display-name --user-id ocid1.user.oc1..aaaaaaaa-user-ocid-sdd6ahdouq { "data": { "display-name": "display-name", "id": "7aaaa3462aa34271a276002015f30674a5325aaa", "inactive-status": null, "key": "1aaa577aaaa/aa3aa92aa7aa7aaaaaaAa0aaaAa8AAa=", "lifecycle-state": "ACTIVE", "time-created": "2024-07-19T19:58:03.794000+00:00", "time-expires": null, "user-id": "ocid1.user.oc1..aaaaaaaa-user-ocid-sdd6ahdouq" }, "etag": "e63038c73fc24fa087a2a4c3339ef709" }
-
将 ID (
AWS_ACCESS_KEY_ID
) 和密钥 (AWS_SECRET_ACCESS_KEY
) 复制到某个安全位置,以便稍后用于设置环境变量。注:您的用户 OCID 可以在 OCI CLI 配置文件中找到,通常存储在
$HOME/.oci/config
中。
或者
还可以使用 OCI 控制台生成密钥,然后导航到右上角的概要信息,然后选择显示的用户名。单击客户密钥链接生成密钥并设置显示名称。单击 copy 并将密钥存储在安全位置,然后单击 Close 。
关闭生成密钥窗口后,在客户密钥列表中查找显示名称,将鼠标悬停在访问密钥上,然后复制访问密钥。
任务 4:收集设置时段信息
-
转到 OCI 控制台,导航到存储,然后单击存储桶。
-
根据先决条件单击存储桶名称,然后记下以下信息。
- 存储桶名称。
- 对象的位置,这将是前缀。
- 区域名称。请从此处获取区域代码:区域和可用性域。例如,美国东部(阿什本)将使用 us-ashburn-1 表示。
任务 5:设置环境变量
使用以下命令根据以前任务中的信息设置环境变量。
export AWS_ACCESS_KEY_ID="<your access key ID from Task 3>"
export AWS_SECRET_ACCESS_KEY="<your secret key ID from Task 3>"
export OCI_REGION="bukcet region from Task 4>"
export OCI_NAMESPACE="<namespace name from Task 1>"
export OCI_BUCKET="<your bucket name from Task 4>"
export OCI_PREFIX="<object prefix name from Task 4>"
例如:
export AWS_ACCESS_KEY_ID="da34baaa4ab029f51c34c1cee83d40f0dEXAMPLE"
export AWS_SECRET_ACCESS_KEY="7w3uMS6kYiYkUpziSlLFcBimBsYDJfojwCWKEXAMPLE="
export OCI_REGION="us-ashburn-1"
export OCI_NAMESPACE="MyNamespace"
export OCI_BUCKET="Images"
export OCI_PREFIX="2024/12/18/Camera"
任务 6:构建 C++ 示例
-
运行以下命令以 git 克隆示例系统信息库。
$ git clone https://github.com/tonymarkel/OCI_AWS_CPP_SDK_S3_Examples.git
-
运行以下命令以更改为包含 C++ 示例的目录,创建构建目录,更改为该目录,然后运行构建并创建。
$ OCI_AWS_CPP_SDK_S3_Examples $ mkdir build $ cd build $ cmake .. $ make
注意:这些是使用适用于 C++ 的 AWS SDK 的示例脚本,它们不是 Oracle 官方应用程序,不是 Oracle 维护或支持的应用程序。由于它们是示例,因此您可能需要根据您自己的软件存储库中的用例查看、更新和定制它们。Oracle 不对第三方 SDK 进行认证或提供支持。
任务 7:运行示例
-
运行以下命令以获取存储桶列表。
$ ./listBuckets $OCI_NAMESPACE $OCI_REGION $AWS_ACCESS_KEY_ID $AWS_SECRET_ACCESS_KEY
例如:
$ ./listBuckets $OCI_NAMESPACE $OCI_REGION $AWS_ACCESS_KEY_ID $AWS_SECRET_ACCESS_KEY S3 Endpoint is: https://MyNamespace.compat.objectstorage.us-ashburn-1.oraclecloud.com/ Found 3 buckets Demo Images Logs
-
运行以下命令以获取对象列表。
例如:
$ ./listObjects $OCI_NAMESPACE $OCI_REGION $AWS_ACCESS_KEY_ID $AWS_SECRET_ACCESS_KEY $OCI_BUCKET $OCI_PREFIX S3 Object Path is: https://MyNamespace.compat.objectstorage.us-ashburn-1.oraclecloud.com Bucket is: Images Prefix is: 2024/12/18/Camera LISTING OBJECTS Found 3 objects 2024/12/18/Camera/Image1.jpeg 2024/12/18/Camera/Image2.jpeg 2024/12/18/Camera/DefinitelyNotACat.jpeg
注:如果您有问题,请返回到任务 5 并确保正确设置了环境变量。
相关链接
确认
-
授权者 — Kenneth Heung(首席云架构师),Tony Markel(首席云架构师)
-
贡献者 - Melinda Centeno(高级首席产品经理)
更多学习资源
浏览 docs.oracle.com/learn 上的其他实验室,或者访问 Oracle Learning YouTube 渠道上的更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 成为 Oracle Learning Explorer。
有关产品文档,请访问 Oracle 帮助中心。
Use OCI Object Storage Amazon S3 Compatibility API with AWS SDK for C++
G28127-01
Copyright ©2025, Oracle and/or its affiliates.