éçºããŒã ããå±ãããããã°ãªã¬ãŒã§ãïŒæ¢ã«å ¬éãããŠããèšäºããããŸãã®ã§ããã¡ãããä»ã®ã¡ã³ããŒã®æçš¿ããã²ãã§ãã¯ããŠã¿ãŠãã ããïŒ
AWS Amplify ãšã¯
AWS Amplify (以äžãAmplify)ã¯ããµãŒããŒã¬ã¹ãªWebã»ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã®éçºã»éçšãå¹çåãããã¬ãŒã ã¯ãŒã¯ã§ãã
ç¹ã«ã¢ããªã±ãŒã·ã§ã³ãäœãäžã§ã®åææ§ç¯ãé«éã§è¡ããç¹ãé
åã§ãã

AmplifyãæäŸããŠããæ©èœäŸ
- èªèšŒ
- API
- ããŒã¿ããŒã¹
- ãã¹ãã£ã³ã°
- ã¹ãã¬ãŒãž
- 颿°
Amplifyã䜿ãããšã§ãAmazon Cognito ãçšããèªèšŒæ©èœã AWS AppSync ã§ã®APIæ§ç¯ãçŽ æ©ãè¡ãããšãã§ããŸãã
Webã»ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã®éçºãåæã«ãããŠãããããã¢ããªã±ãŒã·ã§ã³ããAPIæ¥ç¶ãèªèšŒåŠçã®è¿œå ãã¢ããªã±ãŒã·ã§ã³åŽã§ãç°¡åã«è¡ããŸãã
Amplify Gen1 ãš Gen2
Amplify ã«ã¯ Gen1 ãš Gen2 ã®2ã€ã®ããŒãžã§ã³ããããŸãã
å
¬åŒããã¥ã¡ã³ãã§ã2ã€ã®ããŒãžã§ã³ãåãæ¿ããããããã«ãªã£ãŠããŸãã

Gen1ã¯AWSã³ã³ãœãŒã«äžããäœæã§ããAmplify StudioãAmplify CLIã䜿çšããŠããªãœãŒã¹ãäœæããããšãã§ããŸããã
ãããæè»œã§äŸ¿å©ã§ã¯ãã£ãã®ã§ããã2024幎5æã«GAããã Gen2 ã«ãªããšTypeScriptã§å®çŸ©ããããšã§ãªãœãŒã¹ãäœæã§ããããã«ãªããããéçºè
ã«äŸ¿å©ãªãµãŒãã¹ã«å€åããŸããã

Gen2ããªãªãŒã¹ãããŠããä»ã§ããAmplifyã®ã³ã³ãœãŒã«äžããGen1ã®ã¢ããªã±ãŒã·ã§ã³ãç«ã¡äžããããšãå¯èœã§ãã
泚æïŒæ°ããAmplifyã¢ããªã±ãŒã·ã§ã³ãäœæããå Žåã¯ãGen2ã®å©çšãæšå¥šãããŠããŸãã

Gen1ã䟿å©ã ã£ããã課é¡ãå€ããã£ã
Gen1ã®æã§ããã¢ããªã±ãŒã·ã§ã³ã®åæç«ã¡äžãã®éãã«æåããŸããã
ãŸãFigmaãšã®ã³ã©ãã¬ãŒã·ã§ã³ããFigmaããããã³ããšã³ãåŽã®ã³ãŒããçæããŠãããç»æçãªæ©èœã®äžã€ã§ããã

ãã¬ãã¥ãŒãšããããã«ãªã¯ãšã¹ã(ãã©ã³ã)åäœã§ã®åäœç¢ºèªçšã®ç°å¢ãäœæããŠãããæ©èœããããŸãã
ãã®ããã¥ã¡ã³ãã«ããéããããŒãžå
ã®ãã©ã³ãã®ãã¬ãã¥ãŒãæå¹ã«ããŠãããšãGitHubã®ãã«ãªã¯ãšã¹ãã®ç»é¢ãããã¬ãã¥ãŒã確èªã§ããããã«ãªããŸãã

ãã®ããã«Githubã®ãªããžããªãšçŽã¥ããŠãããšãèªåã§ãã«ããããã¬ãã¥ãŒã®URLãçæãããŸãã

ããã䟿å©ãªåé¢ãéçºè
ã«ãšã£ãŠæ§ã
ãªèª²é¡ããããŸããã
以äžãç§ãGen1ã§æ§ç¯ããŠããæã«æãã課é¡ã§ãã
1. éçºé床
Gen1ã®å ŽåãäŸãã°AppSyncã®APIãä¿®æ£ãããã®åäœç¢ºèªãããããã«ã¯äžåºŠãããã€ããå¿
èŠããããŸããã
ããã¯å°ã調æŽãããã ãã§ããããã€ãããããšã«ãªããããã¯ãšã³ãã®éçºãåå«ã«ãªãåå ã«ãªã£ãŠããŸãããããã«Gen1ã§ã¯äžéšãã倿ŽããŠããªããŠãå
šãŠããã«ããããããããããããã€ã«æéãããããŸããã
2. Amplify CLI ã®ãšã©ãŒããããã¥ãã
Gen1ã®ãããã€ã¯Amplify CLIã§è¡ãããŸããããŒã«ã«ãããããã€ã«å€±æããå Žåã®ãšã©ãŒãåããã¥ãããå®éã«äœãåé¡ã§ãšã©ãŒãçºçããŠããã®ã調æ»ã«æéããããããšããããŸããã
3. å°ãèŠä»¶ãå ãããšã倿ŽãèŸã
Gen1ã§ã¯ããšã¹ã±ãŒããããçãªéšåãäžè¶³ããŠããŸããã
Amplifyã§äœæãããªãœãŒã¹ã«ã»ãã¥ãªãã£ãèªèšŒã®éœåäžãèšå®ã远å ãããå Žåã«CLIããäœæããããšãã§ãããèªåã§ãªãŒããŒã©ã€ãããèšè¿°ãJSONãTypeScriptãªã©ãå©çšããŠèšè¿°ããå¿
èŠããããŸããã
ãŸã Gen1 ã§ã¯ç¬èªã®ãã¡ã€ã«ãçæãããŠãããã©ã®ãã¡ã€ã«ãã©ã®èšå®å€ã«ãªã£ãŠããã®ããããã«ããç¹ããããŸããã
以äžã®ç»åã®ããã«ãããã¯ãšã³ããªãœãŒã¹ãäœæããJSONãã¡ã€ã«ãè€æ°ãããä¿®æ£ããéã«ã¯æ¢åã®æ§æãå£ããªãããã«ãã©ã®ããã«äœãããŠããã®ããã¡ã€ã«ã®åœ¹å²ãææ¡ããå¿
èŠããããŸããã
ïŒäžã«ã¯ä¿®æ£ããªãæ¹ãè¯ããã¡ã€ã«ããããŸãïŒ

Gen2ã«ãªã£ãŠå¬ããããš
ããã¯ãšã³ãã®TypeScriptèšè¿°
Gen2ããã¯Amazon DynamoDBãAWS AppSyncãªã©ã®äœæãTypeScriptã§èšè¿°ã§ããããã«ãªããŸããã
以äžã«Gen1ãšGen2ã®æžãæ¹ãèŒããŠããŸãããã©ã¡ããåããªãœãŒã¹ãäœæãããŸãã
Gen1ïŒschema.graphql
type Chat @model @auth(rules: [{ allow: owner }]) {
id: ID!
name: String
message: [Message] @hasMany
}
type Message @model @auth(rules: [{ allow: owner }]) {
id: ID!
text: String
chatId: ID! @index
chat: Chat @belongsTo(fields: ["chatId"])
}
Gen2ïŒdata/resource.ts
const schema = a.schema({
Chat: a.model({
name: a.string(),
message: a.hasMany('Message', 'chatId'),
}),
Message: a.model({
text: a.string(),
chat: a.belongsTo('Chat', 'chatId'),
chatId: a.id().required()
}),
}).authorization((allow) => allow.owner());
GraphQLã®æžãæ¹ã«æ
£ããŠããã°Gen1ã®èšè¿°ã§ãåé¡ãªãã§ãããè£å®ãå¹ããèšæ³ãééããŠãããšããŠããããã€ããŠã¿ãªããšééãã«æ°ã¥ããŸããã§ããã
ããã«æ¯ã¹ãŠGen2ã§ã¯TypeScriptã«ããè£å®ã䜿ã£ãŠå¹ççã«éçºããããšãå¯èœã«ãªããŸããã
ééããŠããäŸ:
// ããã¯èšæ³ãšããŠééã
type Chat @model @auth(rules: [ { allow: owner } ]) {
id: ID!
name: String
message: [Message] @hasMany()
}
type Message @model @auth(rules: [ { allow: owner } ]) {
id: ID!
text: String
chatId: ID! @index
chat: Chat @belongsTo(fields: ["chatId"])
}
ãããã€ãããšããã®ãããªãšã©ãŒãåºãŸãã
# ã©ãã§Nameãå¿ èŠãªã®ãåããã¥ããïŒæ£è§£ã¯ãã®æžãæ¹ãªã@hasManyã«Nameãå¿ èŠïŒ % amplify push â There was an error pulling the backend environment xxxx. ð Syntax Error: Expected Name, found ")". Learn more at: https://docs.amplify.aws/cli/project/troubleshooting/ Session Identifier: xxxxx
ãããæ¹åãããããšã¯ãAmplifyãŠãŒã¶ãŒãšããŠãšãŠãå¬ããã§ãã
Sandboxæ©èœ
å
ã«èšè¿°ããéã Gen1 ã§ããSandboxãšããçšèªã¯äœ¿ãããŠããŸããã
ããããã®æ©èœã¯Amplify CLIã§ããã¯ãšã³ãã®ç°å¢ãèªåã§è¿œå ããããšã§ãå¥ã®ããã¯ãšã³ãç°å¢ãäœããæ©èœã§ããã
ãã®ããéçºããåºŠã«æç€ºçã«ããã¯ãšã³ãç°å¢ã®åãæ¿ããè¡ãå¿
èŠããããããé¢åã§ããã

AWSã³ã³ãœãŒã«ããããµã³ãããã¯ã¹ã管çãã«é·ç§»ããŠããäœæãããµã³ãããã¯ã¹ã¯è¡šç€ºãããŠããŸããããããèŠãŠãGen1ã®ãµã³ãããã¯ã¹ã¯ããããŸã§ãããã¯ãšã³ãç°å¢ã®äžã€ã§ããç¡ãããšãåãããŸãã

Gen2ã«ãªããšãnpx ampx sandbox ãšããã³ãã³ããå®è¡ããããšã§ã1éçºè
ã«ã€ã1ãµã³ãããã¯ã¹ãäœæã§ããããããªããŒããè¡ãããªããããã¯ãšã³ãéçºãè¡ããŸãã
ããããã«ããã¯ãšã³ããããã³ããšã³ããæ§ç¯ããããããè€æ°äººã§ã®éçºãããç°¡åã«åºæ¥ãããã«ãªããŸããã

https://docs.amplify.aws/react/how-amplify-works/concepts/
ãã¥ãŒããªã¢ã«ãéã㊠Amplify Gen2 ãç¥ã
Gen1 ãš Gen2 ã®éãã«ã€ããŠçè§£ã§ããŠããã®ã§ãAmplify Gen2ã®ãã¥ãŒããªã¢ã«ãå°ããªããããšã§æ©èœçè§£ãæ·±ããŠã¿ãŸãã
ãã¥ãŒããªã¢ã«ã¯ãã¡ãã«èšèŒãããŠããŸãã
â»æ¬èšäºã§ã¯äžéšã®ã¿ç޹ä»ããŠããã®ã§ãæ°ã«ãªãæ¹ã¯æ¯éå
šãŠè©ŠããŠã¿ãŠãã ããã
1.Amplifyãšæ¥ç¶ãããªããžããªãçšæãã
ããã¥ã¡ã³ãã«æ²¿ããšããã³ãã¬ãŒããªããžããªãå
ã«æ°ãããªããžããªãäœæããç»é¢ã«é·ç§»ããŸãã
ããã¯amplify-vite-react-templateãå
ã«äœæãããŠããŸãã
å¿
èŠãªèšè¿°ãè¡ãããªããžããªãäœæããŸãã

2.AWSã³ã³ãœãŒã«äžãããããã€
AWSã®Amplifyã³ã³ãœãŒã«ãããæ°ããã¢ããªãäœæããéžæããGitHubãéžæããŸãã

3.ãªããžããªéžæ
ãªããžããªãéžæããããšãããšGitHubã®èªèšŒãå¿
èŠã«ãªãã®ã§ãå®äºãããŸãã
ãã®åŸã1ã§äœæãããªããžããªãéžæããŸãã
ãã©ã³ãã¯ãmainãããç§ã®ã¢ããªã±ãŒã·ã§ã³ã¯ã¢ãã¬ãã§ããã®ãã§ãã¯ããã¯ã¹ã¯å€ããç¶æ
ã§æ¬¡ãžé²ã¿ãŸãã

4.ã¢ããªã±ãŒã·ã§ã³ã®èšå®ã»ãããã€
ã¢ããªã±ãŒã·ã§ã³ã®èšå®ã«é·ç§»ããŸãããããã¯äœã倿Žããæ¬¡ãžé²ã¿ãŸãã

æåŸã®ç¢ºèªç»é¢ã«é·ç§»ããã®ã§ããä¿åããŠãããã€ããæŒããŸãã

ãããã€ãéå§ããŸãããå®äºãããŸã§æ°ååŸ
ã¡ãŸãã

5.amplify_outputs.jsonã®ããŠã³ããŒã
ãããã€ãå®äºãããã察象ã®ãã©ã³ããéžæããŸãã

ãããã€ãããããã¯ãšã³ããªãœãŒã¹ããamplify_outputs.jsonãããŠã³ããŒãããŸãã
ããã¯Gen1ã§äœ¿ãããŠããteam-provider-info.jsonãšåã圹å²ãæã€ãããã¯ãšã³ãåŽã®èšå®ãæžãããŠãããã®ã§ãã
ãããããŒã«ã«ã®ãªããžããªã«é
眮ããããšã§ããã®ããã¯ãšã³ãç°å¢ãå
ã«ããŒã«ã«éçºãå¯èœã«ãªããŸãã

äœæãããªããžããªãã¯ããŒã³ããŸãã
git clone https://github.com/<github-user>/amplify-vite-react-template.git cd amplify-vite-react-template && npm install
ããŠã³ããŒãããamplify_outputs.jsonã¯ããããžã§ã¯ãã®ã«ãŒãã«é
眮ããŸãã

6.ããŒã«ã«èµ·å
ãã¥ãŒããªã¢ã«ã§ã¯æ©èœè¿œå ããŠããèµ·åããŠããŸãããæåã«ã©ã®ãããªã¢ããªã±ãŒã·ã§ã³ãªã®ãã¿ãŠãããŸãã
npm run dev
ã·ã³ãã«ãªTODOã¢ããªã±ãŒã·ã§ã³ã衚瀺ãããŸãã

7.å逿©èœè¿œå
äœãããã¢ããªã±ãŒã·ã§ã³ãåãã£ãã®ã§ããã¥ãŒããªã¢ã«éãå逿©èœãå®è£
ããŸãã
åæã®ç¶æ
ã§ã¯ãäœæãšååŸã®ã¿å®è£
ãããŠããŸãã
åé€çšã®é¢æ°ãšã€ãã³ããã³ãã©ãŒã远å ããŸãã
// App.tsx
import { useEffect, useState } from "react";
import type { Schema } from "../amplify/data/resource";
import { generateClient } from "aws-amplify/data";
const client = generateClient<Schema>();
function App() {
const [todos, setTodos] = useState<Array<Schema["Todo"]["type"]>>([]);
useEffect(() => {
client.models.Todo.observeQuery().subscribe({
next: (data) => setTodos([...data.items]),
});
}, []);
function createTodo() {
client.models.Todo.create({ content: window.prompt("Todo content") });
}
// 远å
function deleteTodo(id: string) {
client.models.Todo.delete({ id })
}
return (
<main>
<h1>My todos</h1>
<button onClick={createTodo}>+ new</button>
<ul>
{todos.map((todo) => (
// 远å
<li onClick={() => deleteTodo(todo.id)} key={todo.id}>{todo.content}</li>
))}
</ul>
<div>
𥳠App successfully hosted. Try creating a new todo.
<br />
<a href="https://docs.amplify.aws/react/start/quickstart/#make-frontend-updates">
Review next step of this tutorial.
</a>
</div>
</main>
);
}
export default App;
ããã§åé€ãå®è£
ã§ããŸããããæ³šç®ãã¹ãã¯åé€ã®é¢æ°å
ã§ãã
äœæã®é¢æ°ã§ãåãèšèŒããããŠããŸãããclient.models.Todoã§Todoã¢ãã«ã®æäœãè¡ããããã«ãªã£ãŠããŸããããªãåãããããã§ãã
ãã®Todoã¢ãã«ã®åç
§ãã©ãããæ¥ãŠããã蟿ããšãimportéšåã§../amplify/data/resourceã«ãã©ãçããŸãã
// resource.ts
import { type ClientSchema, a, defineData } from "@aws-amplify/backend";
/*== STEP 1 ===============================================================
The section below creates a Todo database table with a "content" field. Try
adding a new "isDone" field as a boolean. The authorization rule below
specifies that any user authenticated via an API key can "create", "read",
"update", and "delete" any "Todo" records.
=========================================================================*/
const schema = a.schema({
Todo: a
.model({
content: a.string(),
})
.authorization((allow) => [allow.publicApiKey()]),
});
export type Schema = ClientSchema<typeof schema>;
export const data = defineData({
schema,
authorizationModes: {
defaultAuthorizationMode: "apiKey",
// API Key is used for a.allow.public() rules
apiKeyAuthorizationMode: {
expiresInDays: 30,
},
},
});
äžèšãããã¯ãšã³ãã®AppSyncãšDynamoDBãäœæããŠããèšè¿°ã§ãã
ã¹ããŒãå®çŸ©ã®Todoã¯ãããã¯ãšã³ãã®ãªãœãŒã¹äœæã ãã§ãªããããã³ããšã³ãåŽããã®APIåŒã³åºãã«ã䜿çšãããŠããŸããããã«ããäžè²«ããã¢ããªã±ãŒã·ã§ã³éçºãå®çŸã§ããããã«ãªã£ãŠããŸãã
ãã¥ãŒããªã¢ã«èªäœã¯ããå°ãé·ãã®ã§ãæ°ã«ãªãæ¹ã¯è©ŠããŠã¿ãŠãã ããã
ãã ããããŸã§ã§ãããªãéçºããããç°å¢ã«ãªã£ãŠããããšãããããšæããŸãã
ãŸãšã
Gen1ãšæ¯èŒããªããAmplify Gen2ã®é
åã«ã€ããŠèšèŒããŸããã
Amplify Gen1ããGen2ãžã®ç§»è¡ããŒã«ã¯ãŸã éçºäžã§ãããGen1ã®ãããžã§ã¯ãã¯ãã®ãŸãŸäœ¿ãããšãæšå¥šãããŠããŸãããããGen2ã䜿ãéã«ã¯åèã«ãªããšå¬ããã§ãã
åè
- Amplify Docs â Concepts: https://docs.amplify.aws/react/how-amplify-works/concepts/
- ãã«ã¹ã¿ãã¯ã® Amplify Gen 1 ã¢ããªã䜿çšããããŒã ã¯ãŒã¯ãããŒ: https://docs.aws.amazon.com/ja_jp/amplify/latest/userguide/team-workflows-with-amplify-cli-backend-environments.html