适用于 JavaScript 的 AWS SDK V3 API 参考指南详细描述了 适用于 JavaScript 的 AWS SDK 版本 3 (V3) 的所有 API 操作。
本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
React Native 入门
本教程向你展示了如何使用 React Native CLI 创建 React Native
本教程向您展示:
如何安装和包含您的项目使用的 适用于 JavaScript 的 AWS SDK 版本 3 (V3) 模块。
如何编写连接到亚马逊简单存储服务 (Amazon S3) 的代码以创建和删除亚马逊 S3 存储桶。
情景
Amazon S3 是一项云服务,可让您随时从网络上的任何位置存储和检索任意数量的数据。React Native 是一个开发框架,允许你创建移动应用程序。本教程向您展示了如何创建连接到 Amazon S3 的 React Native 应用程序来创建和删除 Amazon S3 存储桶。
该应用程序使用以下 SDK 用于 JavaScript APIs:
S3
构造函数
完成先决条件任务
注意
如果已通过其他教程或现有配置完成以下任意步骤,请跳过这些步骤。
本节介绍完成本教程所需的最低设置。您不应将此视为完整设置。为此,请参阅设置 SDK 适用于 JavaScript。
-
安装以下工具:
如果你@@ 在 iOS 上进行测试,请使用 Xcod
e Android Studio
如果你在安卓系统上测试
设置你的 React 原生开发环境
-
设置项目环境以运行这些 Node TypeScript 示例,并安装所需的模块 适用于 JavaScript 的 AWS SDK 和第三方模块。按照上的说明进行操作 GitHub
。 -
在使用 AWS 服务进行开发 AWS 时,您必须确定您的代码是如何进行身份验证的。有关更多信息,请参阅 使用 SDK 进行身份验证 AWS。
注意
本示例的 IAM 角色应设置为使用 AmazonS3 FullAccess 权限。
步骤 1:创建一个 Amazon Cognito 身份池
在本练习中,您将创建并使用 Amazon Cognito 身份池来提供对 Amazon S3 服务的应用程序的未经身份验证的访问权限。创建身份池还会创建两个 AWS Identity and Access Management (IAM) 角色,一个用于支持由身份提供商进行身份验证的用户,另一个用于支持未经身份验证的访客用户。
在本练习中,我们仅使用未经身份验证的用户角色,将重点放在任务上。您可在以后集成对身份提供商和通过身份验证的用户的支持。
创建 Amazon Cognito 身份池
登录 AWS Management Console 并在亚马逊 Web Services
控制台上打开 Amazon Cognito 控制台。 在控制台打开页面上选择 “身份池”。
在下一页上,选择创建新的身份池。
注意
如果没有其他身份池,Amazon Cognito 控制台将跳过此页面,改为打开下一页。
在配置身份池信任中,选择来宾访问权限进行用户身份验证。
在配置权限中,选择创建新的 IAM 角色并在 IA M getStartedReact角色名称中输入名称(例如角色)。
在配置属性中,在身份getStartedReact池名称中输入名称(例如池)。
在查看并创建中,确认您为新身份池所做的选择。选择编辑以返回向导并更改任何设置。完成后,选择创建身份池。
记下这个新创建的身份池的身份池 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 角色
登录 AWS Management Console 并打开 IAM 控制台,网址为https://console.aws.amazon.com/iam/
。 在左侧导航窗格中,选择 角色。
选择要修改的角色的名称(例如 getStartedRole),然后选择 “权限” 选项卡。
选择添加权限,然后选择附加策略。
在为该角色添加权限页面中,找到并选中 AmazonS3 ReadOnlyAccess 的复选框。
注意
您可以使用此过程来允许访问任何 AWS 服务。
选择添加权限。
在您创建 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/
这些程序包及其关联的代码将安装在项目的 node_modules
子目录中。
有关安装 Node.js 软件包的更多信息,请参阅 npm(Node.js 包管理器)网站上的在本地下载和安装
安装身份验证所需的其他依赖项。
npm install @aws-sdk/client-cognito-identity @aws-sdk/credential-provider-cognito-identity
第 5 步:编写 React 原生代码
将以下代码添加到App.tsx
。将identityPoolId
和region
替换为身份池 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 页面可在此处获
步骤 6:运行示例
注意
请记得登录!如果您使用 IAM Identity Center 进行身份验证,请记住使用 AWS CLI aws sso login
命令登录。
要运行示例,请使用 npm 运行web
ios
、或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 角色一起使用。