适用于 JavaScript 的 AWS SDK V3 API 参考指南详细描述了 适用于 JavaScript 的 AWS SDK 版本 3 (V3) 的所有 API 操作。

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

React Native 入门

本教程向你展示了如何使用 React Native CLI 创建 React Native 应用程序。

JavaScript code example that applies to React Native.

本教程向您展示:

  • 如何安装和包含您的项目使用的 适用于 JavaScript 的 AWS SDK 版本 3 (V3) 模块。

  • 如何编写连接到亚马逊简单存储服务 (Amazon S3) 的代码以创建和删除亚马逊 S3 存储桶。

情景

Amazon S3 是一项云服务,可让您随时从网络上的任何位置存储和检索任意数量的数据。React Native 是一个开发框架,允许你创建移动应用程序。本教程向您展示了如何创建连接到 Amazon S3 的 React Native 应用程序来创建和删除 Amazon S3 存储桶。

该应用程序使用以下 SDK 用于 JavaScript APIs:

完成先决条件任务

注意

如果已通过其他教程或现有配置完成以下任意步骤,请跳过这些步骤。

本节介绍完成本教程所需的最低设置。您不应将此视为完整设置。为此,请参阅设置 SDK 适用于 JavaScript

步骤 1:创建一个 Amazon Cognito 身份池

在本练习中,您将创建并使用 Amazon Cognito 身份池来提供对 Amazon S3 服务的应用程序的未经身份验证的访问权限。创建身份池还会创建两个 AWS Identity and Access Management (IAM) 角色,一个用于支持由身份提供商进行身份验证的用户,另一个用于支持未经身份验证的访客用户。

在本练习中,我们仅使用未经身份验证的用户角色,将重点放在任务上。您可在以后集成对身份提供商和通过身份验证的用户的支持。

创建 Amazon Cognito 身份池
  1. 登录 AWS Management Console 并在亚马逊 Web Services 控制台上打开 Amazon Cognito 控制台。

  2. 在控制台打开页面上选择 “身份池”。

  3. 在下一页上,选择创建新的身份池

    注意

    如果没有其他身份池,Amazon Cognito 控制台将跳过此页面,改为打开下一页。

  4. 配置身份池信任中,选择来宾访问权限进行用户身份验证。

  5. 配置权限中,选择创建新的 IAM 角色并在 IA M getStartedReact角色名称中输入名称(例如角色)。

  6. 配置属性中,在身份getStartedReact池名称中输入名称(例如池)。

  7. 查看并创建中,确认您为新身份池所做的选择。选择编辑以返回向导并更改任何设置。完成后,选择创建身份池

  8. 记下这个新创建的身份池的身份池 ID 和区域。您需要在浏览器脚本identityPoolId中替换region和这些值。

创建 Amazon Cognito 身份池后,就可以为你的 React Native 应用程序添加所需的 Amazon S3 权限了。

步骤 2:将策略添加到创建的 IAM 角色

要允许浏览器脚本访问 Amazon S3 以创建和删除 Amazon S3 存储桶,请使用为您的 Amazon Cognito 身份池创建的未经身份验证的 IAM 角色。这需要您将 IAM policy 添加到角色。有关 IAM 角色的更多信息,请参阅 I A M 用户指南中的创建角色以向 AWS 服务委派权限

将 Amazon S3 策略添加到与未经身份验证用户关联的 IAM 角色
  1. 登录 AWS Management Console 并打开 IAM 控制台,网址为https://console.aws.amazon.com/iam/

  2. 在左侧导航窗格中,选择 角色

  3. 选择要修改的角色的名称(例如 getStartedRole),然后选择 “权限” 选项卡。

  4. 选择添加权限,然后选择附加策略

  5. 在为该角色添加权限页面中,找到并选中 AmazonS3 ReadOnlyAccess 的复选框。

    注意

    您可以使用此过程来允许访问任何 AWS 服务。

  6. 选择添加权限

在您创建 Amazon Cognito 身份池并向未经身份验证的用户的 IAM 角色添加 Amazon S3 权限后,您就可以开始构建应用程序了。

第 3 步:使用创建应用程序 create-react-native-app

通过运行以下命令创建 React Native 应用程序。

npx react-native init ReactNativeApp --npm

第 4 步:安装 Amazon S3 软件包和其他依赖项

在项目目录中,运行以下命令来安装 Amazon S3 软件包。

npm install @aws-sdk/client-s3

此命令在您的项目中安装 Amazon S3 软件包,并更新package.json以将 Amazon S3 列为项目依赖项。你可以通过在 https://www.npmjs.com/ npm 网站上搜索 “@aws-sdk” 来找到有关此软件包的信息。

这些程序包及其关联的代码将安装在项目的 node_modules 子目录中。

有关安装 Node.js 软件包的更多信息,请参阅 npm(Node.js 包管理器)网站上的在本地下载和安装软件包创建 Node.js 模块。有关下载和安装的信息 适用于 JavaScript 的 AWS SDK,请参阅安装适用于 JavaScript

安装身份验证所需的其他依赖项。

npm install @aws-sdk/client-cognito-identity @aws-sdk/credential-provider-cognito-identity

第 5 步:编写 React 原生代码

将以下代码添加到App.tsx。将identityPoolIdregion替换为身份池 ID 和将在其中创建 Amazon S3 存储桶的区域。

import React, { useCallback, useState } from "react"; import { Button, StyleSheet, Text, TextInput, View } from "react-native"; import "react-native-get-random-values"; import "react-native-url-polyfill/auto"; import { S3Client, CreateBucketCommand, DeleteBucketCommand, } from "@aws-sdk/client-s3"; import { fromCognitoIdentityPool } from "@aws-sdk/credential-providers"; const client = new S3Client({ // The AWS Region where the Amazon Simple Storage Service (Amazon S3) bucket will be created. Replace this with your Region. region: "us-east-1", credentials: fromCognitoIdentityPool({ // Replace the value of 'identityPoolId' with the ID of an Amazon Cognito identity pool in your Amazon Cognito Region. identityPoolId: "us-east-1:edbe2c04-7f5d-469b-85e5-98096bd75492", // Replace the value of 'region' with your Amazon Cognito Region. clientConfig: { region: "us-east-1" }, }), }); enum MessageType { SUCCESS = 0, FAILURE = 1, EMPTY = 2, } const App = () => { const [bucketName, setBucketName] = useState(""); const [msg, setMsg] = useState<{ message: string; type: MessageType }>({ message: "", type: MessageType.EMPTY, }); const createBucket = useCallback(async () => { setMsg({ message: "", type: MessageType.EMPTY }); try { await client.send(new CreateBucketCommand({ Bucket: bucketName })); setMsg({ message: `Bucket "${bucketName}" created.`, type: MessageType.SUCCESS, }); } catch (e) { console.error(e); setMsg({ message: e instanceof Error ? e.message : "Unknown error", type: MessageType.FAILURE, }); } }, [bucketName]); const deleteBucket = useCallback(async () => { setMsg({ message: "", type: MessageType.EMPTY }); try { await client.send(new DeleteBucketCommand({ Bucket: bucketName })); setMsg({ message: `Bucket "${bucketName}" deleted.`, type: MessageType.SUCCESS, }); } catch (e) { setMsg({ message: e instanceof Error ? e.message : "Unknown error", type: MessageType.FAILURE, }); } }, [bucketName]); return ( <View style={styles.container}> {msg.type !== MessageType.EMPTY && ( <Text style={ msg.type === MessageType.SUCCESS ? styles.successText : styles.failureText } > {msg.message} </Text> )} <View> <TextInput onChangeText={(text) => setBucketName(text)} autoCapitalize={"none"} value={bucketName} placeholder={"Enter Bucket Name"} /> <Button color="#68a0cf" title="Create Bucket" onPress={createBucket} /> <Button color="#68a0cf" title="Delete Bucket" onPress={deleteBucket} /> </View> </View> ); }; const styles = StyleSheet.create({ container: { flex: 1, alignItems: "center", justifyContent: "center", }, successText: { color: "green", }, failureText: { color: "red", }, }); export default App;

首先导入的代码需要依赖 AWS 于 React、React Native 和 SDK。

在函数应用程序中:

  • S3Client 对象已创建,使用之前创建的 Amazon Cognito 身份池指定凭证。

  • 方法createBucket和分别deleteBucket创建和删除指定的存储桶。

  • React Native View 显示一个文本输入字段供用户指定 Amazon S3 存储桶名称,以及用于创建和删除指定的 Amazon S3 存储桶的按钮。

完整 JavaScript 页面可在此处获得 GitHub。

步骤 6:运行示例

注意

请记得登录!如果您使用 IAM Identity Center 进行身份验证,请记住使用 AWS CLI aws sso login命令登录。

要运行示例,请使用 npm 运行webios、或android命令。

以下是在 macOS 上运行ios命令的输出示例。

$ npm run ios > ReactNativeApp@0.0.1 ios /Users/trivikr/workspace/ReactNativeApp > react-native run-ios info Found Xcode workspace "ReactNativeApp.xcworkspace" info Launching iPhone 11 (iOS 14.2) info Building (using "xcodebuild -workspace ReactNativeApp.xcworkspace -configuration Debug -scheme ReactNativeApp -destination id=706C1A97-FA38-407D-AD77-CB4FCA9134E9") success Successfully built the app info Installing "/Users/trivikr/Library/Developer/Xcode/DerivedData/ReactNativeApp-cfhmsyhptwflqqejyspdqgjestra/Build/Products/Debug-iphonesimulator/ReactNativeApp.app" info Launching "org.reactjs.native.example.ReactNativeApp" success Successfully launched the app on the simulator

以下是在 macOS 上运行android命令的输出示例。

$ npm run android > ReactNativeApp@0.0.1 android > react-native run-android info Running jetifier to migrate libraries to AndroidX. You can disable it using "--no-jetifier" flag. Jetifier found 970 file(s) to forward-jetify. Using 12 workers... info Starting JS server... info Launching emulator... info Successfully launched emulator. info Installing the app... > Task :app:stripDebugDebugSymbols UP-TO-DATE Compatible side by side NDK version was not found. > Task :app:installDebug 02:18:38 V/ddms: execute: running am get-config 02:18:38 V/ddms: execute 'am get-config' on 'emulator-5554' : EOF hit. Read: -1 02:18:38 V/ddms: execute: returning Installing APK 'app-debug.apk' on 'Pixel_3a_API_30_x86(AVD) - 11' for app:debug 02:18:38 D/app-debug.apk: Uploading app-debug.apk onto device 'emulator-5554' 02:18:38 D/Device: Uploading file onto device 'emulator-5554' 02:18:38 D/ddms: Reading file permission of /Users/trivikr/workspace/ReactNativeApp/android/app/build/outputs/apk/debug/app-debug.apk as: rw-r--r-- 02:18:40 V/ddms: execute: running pm install -r -t "/data/local/tmp/app-debug.apk" 02:18:41 V/ddms: execute 'pm install -r -t "/data/local/tmp/app-debug.apk"' on 'emulator-5554' : EOF hit. Read: -1 02:18:41 V/ddms: execute: returning 02:18:41 V/ddms: execute: running rm "/data/local/tmp/app-debug.apk" 02:18:41 V/ddms: execute 'rm "/data/local/tmp/app-debug.apk"' on 'emulator-5554' : EOF hit. Read: -1 02:18:41 V/ddms: execute: returning Installed on 1 device. Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0. Use '--warning-mode all' to show the individual deprecation warnings. See https://docs.gradle.org/6.2/userguide/command_line_interface.html#sec:command_line_warnings BUILD SUCCESSFUL in 6s 27 actionable tasks: 2 executed, 25 up-to-date info Connecting to the development server... 8081 info Starting the app on "emulator-5554"... Starting: Intent { cmp=com.reactnativeapp/.MainActivity }

输入您要创建或删除的存储桶名称,然后单击 “创建存储桶” 或 “删除存储桶”。相应的命令将发送到 Amazon S3,并显示成功或错误消息。

可能的增强功能

以下是此应用程序的变体,您可以使用该应用程序在 React Native 应用程序 JavaScript 中使用 SDK 进一步探索。

  • 添加一个按钮以列出 Amazon S3 存储桶,并在列出的每个存储桶旁边提供一个删除按钮。

  • 添加用于将文本对象放入存储桶的按钮。

  • 集成 Facebook 或 Amazon 等外部身份提供商,以便与经过身份验证的 IAM 角色一起使用。