AWS SDK for JavaScript V3 API 참조 가이드에서는 버전 3(V3)의 모든 API 작업에 대해 AWS SDK for JavaScript 자세히 설명합니다.
기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
React Native 시작하기
이 자습서에서는 React Native를 사용하여 React Native CLI
이 자습서에서는 다음을 보여줍니다.
프로젝트에서 사용하는 AWS SDK for JavaScript 버전 3(V3) 모듈을 설치하고 포함하는 방법.
Amazon Simple Storage Service(Amazon S3)에 연결하여 Amazon S3 버킷을 생성하고 삭제하는 코드를 작성하는 방법.
시나리오
Amazon S3는 웹의 어느 위치에서든 언제든지 원하는 양의 데이터를 저장하고 검색할 수 있는 클라우드 서비스입니다. React Native는 모바일 애플리케이션을 생성할 수 있는 개발 프레임워크입니다. 이 자습서에서는 Amazon S3에 연결하여 Amazon S3 버킷을 생성하고 삭제하는 React Native 앱을 생성하는 방법을 보여줍니다.
앱은 JavaScript APIs다음을 사용합니다SDK.
S3
생성자
사전 필수 작업
참고
다른 자습서나 기존 구성을 통해 다음 단계를 이미 완료한 경우 해당 단계를 건너뛰십시오.
이 단원에서는 이 자습서를 완료하는 데 필요한 최소 설정을 제공합니다. 이 내용을 전체 설정으로 간주해서는 안됩니다. 자세한 내용은 SDK 용 설정 JavaScript 단원을 참조하십시오.
-
다음 도구를 설치합니다.
iOS에서 테스트하는 경우 Xcode
-
이러한 노드 TypeScript 예제를 실행하도록 프로젝트 환경을 설정하고 필수 AWS SDK for JavaScript 및 타사 모듈을 설치합니다. 의 지침을 따릅니다 GitHub
. -
AWS 서비스로 개발할 AWS 때 코드가를 인증하는 방법을 설정해야 합니다. 자세한 내용은 SDK를 사용한 인증 AWS 단원을 참조하십시오.
참고
이 예제의 IAM 역할은 AmazonS3FullAccess 권한을 사용하도록 설정해야 합니다.
1단계: Amazon Cognito 자격 증명 풀 생성
이 연습에서는 Amazon Cognito 자격 증명 풀을 생성하고 사용하여 Amazon S3 서비스용 앱에 대한 인증되지 않은 액세스를 제공합니다. 자격 증명 풀을 생성하면 두 AWS Identity and Access Management (IAM) 개의 역할이 생성됩니다. 하나는 자격 증명 공급자가 인증한 사용자를 지원하는 역할이고 다른 하나는 인증되지 않은 게스트 사용자를 지원하는 역할입니다.
이 연습에서는 인증되지 않은 사용자 역할만 사용해 작업하여 작업에 집중할 수 있도록 합니다. 자격 증명 공급자 및 인증된 사용자에 대한 지원은 나중에 통합할 수 있습니다.
Amazon Cognito 자격 증명 풀을 생성하려면
에 로그인 AWS Management Console 하고 Amazon Web Services 콘솔에서 Amazon Cognito 콘솔
을 엽니다. 콘솔 열기 페이지에서 자격 증명 풀을 선택합니다.
다음 페이지에서 Create new identity pool(새 자격 증명 풀 만들기)을 선택합니다.
참고
다른 자격 증명 풀이 없는 경우 Amazon Cognito 콘솔은이 페이지를 건너뛰고 대신 다음 페이지를 엽니다.
자격 증명 풀 신뢰 구성에서 사용자 인증을 위한 게스트 액세스를 선택합니다.
권한 구성에서 새 IAM 역할 생성을 선택하고 역할 이름에 IAM 이름(예: getStartedReact역할)을 입력합니다.
속성 구성에서 자격 증명 getStartedReact풀 이름에 이름(예: 풀)을 입력합니다.
검토 및 생성에서 새 자격 증명 풀에 대한 선택 사항을 확인합니다. 편집을 선택하여 마법사로 돌아가서 설정을 변경합니다. 완료하면 자격 증명 풀 생성을 선택합니다.
새로 생성된 자격 증명 풀의 자격 증명 풀 ID와 리전을 기록해 둡니다. 브라우저 스크립트
identityPoolId
에서region
및를 바꾸려면 이러한 값이 필요합니다.
Amazon Cognito 자격 증명 풀을 생성한 후에는 React Native 앱에 필요한 Amazon S3에 대한 권한을 추가할 준비가 되었습니다.
2단계: 생성된 IAM 역할에 정책 추가
Amazon S3에 대한 브라우저 스크립트 액세스를 활성화하여 Amazon S3 버킷을 생성하고 삭제하려면 Amazon Cognito 자격 증명 풀에 대해 생성된 인증되지 않은 IAM 역할을 사용합니다. 이렇게 하면 해당 역할에 IAM 정책을 추가해야 합니다. IAM 역할에 대한 자세한 내용은 IAM 사용 설명서의 AWS 서비스에 권한을 위임할 역할 생성을 참조하세요.
인증되지 않은 사용자와 연결된 IAM 역할에 Amazon S3 정책을 추가하려면
에 로그인 AWS Management Console 하고에서 IAM 콘솔을 엽니다https://console.aws.amazon.com/iam/
. 왼쪽 탐색 창에서 역할을 선택합니다.
수정하려는 역할의 이름(예: getStartedRole)을 선택한 다음 권한 탭을 선택합니다.
권한 추가를 선택한 다음, 정책 연결을 선택합니다.
이 역할에 대한 권한 추가 페이지에서 AmazonS3ReadOnlyAccess의 확인란을 찾은 다음 선택합니다.
참고
이 프로세스를 사용하여 모든 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 패키지를 설치하고 Amazon S3를 프로젝트 종속성으로 나열package.json
하도록 업데이트합니다. 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 Native 코드 작성
에 다음 코드를 추가합니다App.tsx
. identityPoolId
및를 Amazon S3 버킷이 생성될 자격 증명 풀 ID 및 리전region
으로 바꿉니다.
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;
코드는 먼저 필요한 React, React Native 및 AWS 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을 사용하여 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 앱에서 SDK for를 사용하여 자세히 탐색하는 데 사용할 수 JavaScript 있는이 애플리케이션의 변형입니다.
버튼을 추가하여 Amazon S3 버킷을 나열하고 나열된 각 버킷 옆에 삭제 버튼을 제공합니다.
버튼을 추가하여 텍스트 객체를 버킷에 넣습니다.
Facebook 또는 Amazon과 같은 외부 자격 증명 공급자를 통합하여 인증된 IAM 역할과 함께 사용합니다.