예상 소요시간 : ~10분
npm i -g @aws-amplify/cli
# npm install aws-amplify
amplify.cmd
amplify.cmd configure
npx create-react-app react-amplified
cd react-amplified
npm start
amplify init
aws-exports.js - keep track of all resources in frontend ex bucket
npm install aws-amplify
# ADD TO src/index.js
import { Amplify } from 'aws-amplify';
import awsExports from './aws-exports';
Amplify.configure(awsExports);
amplify add api
amplify push
amplify/backend/api/myapi/schema.graphql
type Todo @model {
id: ID!
name: String!
description: String
}
amplify status
amplify console
amplify console api
# TEST API
amplify mock api
/* src/App.js */
import React, { useEffect, useState } from 'react'
import { Amplify, API, graphqlOperation } from 'aws-amplify'
import { createTodo } from './graphql/mutations'
import { listTodos } from './graphql/queries'
import awsExports from "./aws-exports";
Amplify.configure(awsExports);
const initialState = { name: '', description: '' }
const App = () => {
const [formState, setFormState] = useState(initialState)
const [todos, setTodos] = useState([])
useEffect(() => {
fetchTodos()
}, [])
function setInput(key, value) {
setFormState({ ...formState, [key]: value })
}
async function fetchTodos() {
try {
const todoData = await API.graphql(graphqlOperation(listTodos))
const todos = todoData.data.listTodos.items
setTodos(todos)
} catch (err) { console.log('error fetching todos') }
}
async function addTodo() {
try {
if (!formState.name || !formState.description) return
const todo = { ...formState }
setTodos([...todos, todo])
setFormState(initialState)
await API.graphql(graphqlOperation(createTodo, {input: todo}))
} catch (err) {
console.log('error creating todo:', err)
}
}
return (
<div style={styles.container}>
<h2>Amplify Todos</h2>
<input
onChange={event => setInput('name', event.target.value)}
style={styles.input}
value={formState.name}
placeholder="Name"
/>
<input
onChange={event => setInput('description', event.target.value)}
style={styles.input}
value={formState.description}
placeholder="Description"
/>
<button style={styles.button} onClick={addTodo}>Create Todo</button>
{
todos.map((todo, index) => (
<div key={todo.id ? todo.id : index} style={styles.todo}>
<p style={styles.todoName}>{todo.name}</p>
<p style={styles.todoDescription}>{todo.description}</p>
</div>
))
}
</div>
)
}
const styles = {
container: { width: 400, margin: '0 auto', display: 'flex', flexDirection: 'column', justifyContent: 'center', padding: 20 },
todo: { marginBottom: 15 },
input: { border: 'none', backgroundColor: '#ddd', marginBottom: 10, padding: 8, fontSize: 18 },
todoName: { fontSize: 20, fontWeight: 'bold' },
todoDescription: { marginBottom: 0 },
button: { backgroundColor: 'black', color: 'white', outline: 'none', fontSize: 18, padding: '12px 0px' }
}
export default App
npm start
amplify add auth
amplify push
amplify console
npm install @aws-amplify/ui-react
import { withAuthenticator, Button, Heading } from '@aws-amplify/ui-react';
import '@aws-amplify/ui-react/styles.css';
/* src/App.js - Pass parameter to App */
const App({ signOut, user }) => {
// ...
}
// Add to Top
return (
<div style={styles.container}>
<Heading level={1}>Hello {user.username}</Heading>
<Button onClick={signOut}>Sign out</Button>
<h2>Amplify Todos</h2>
//...
// Wrap export default App with withAutenticator()
export default withAuthenticator(App);
npm start
amplify add hosting
amplify publish
amplify publish issue 발생 S3 Bucket 권한 이슈 가능성이 높다. 처음 amplify IAM 생성시 버킷에 대한 권한을 추가하거나, 버킷의 권한 정책에 추가 또는 public으로 일시적으로 변경해서 올려보자
엄청난 툴이다
https://www.youtube.com/watch?v=Kis1iYWIpi0&list=PLrwNNiB6YOA2rrpLDwmTQfkDc_RQxufij&index=3
https://velog.io/@combi_jihoon/aws-%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%A0%95%EB%A6%AC-amplify