From 7a3c6c5e897183e223fe9f2c7958077dd87b0a79 Mon Sep 17 00:00:00 2001 From: Chris Bonifacio Date: Fri, 10 Nov 2023 10:37:03 -0500 Subject: [PATCH 01/30] cli flow for connecting api to existing database --- .../index.mdx | 670 ++++++++++++++++++ 1 file changed, 670 insertions(+) create mode 100644 src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx diff --git a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx new file mode 100644 index 00000000000..4cba1de94d6 --- /dev/null +++ b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx @@ -0,0 +1,670 @@ +import { getCustomStaticPath } from '@/utils/getCustomStaticPath'; + +export const meta = { + title: 'Connect your API to an existing database', + description: + 'Learn how to connect your API to an existing MySQL or PostgreSQL database.', + platforms: ['javascript', 'react-native'] +}; + +export const getStaticPaths = async () => { + return getCustomStaticPath(meta.platforms); +}; + +export function getStaticProps(context) { + return { + props: { + platform: context.params.platform, + meta + } + }; +} + + + +In this section, you'll learn how to: + +- Connect to an existing MySQL or PostgreSQL database +- Generate and make preserved changes to the generated GraphQL schema +- Execute SQL statements with custom GraphQL queries and mutations using the new `@sql` directive +- Deploy an AWS AppSync GraphQL API. + +## Connect your API with an existing MySQL or PostgreSQL database + + + + +Pre-requisites: + +- Have an existing MySQL or PostgreSQL database deployed +- The [Amplify CLI is installed and configured](/cli/start/install/) +- Have an Amplify [project already initialized](/cli/start/workflows/#initialize-new-project) + +Amplify CLI supports connecting to any existing MySQL or PostgreSQL database. + + + +If your database exists within a VPC, the RDS instance must be configured to be `Publicly accessible`. This does not mean the instance needs to accessible from the internet. + +An inbound rule must be added to the security group to allow traffic on port 3306 for MySQL databases, 5432 for PostgreSQL databases, or the port chosen when setting up the instance. + + + **NOTE:** Make sure to limit the type of inbound traffic your security group + allows according to your security needs and/or use cases. For information on + security group rules, please refer to the Amazon EC2 documentation: + https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules-reference.html?icmpid=docs_ec2_console + + + + +First, set up your GraphQL API by running: + +```sh +amplify import api +``` + +```console +? Here is the GraphQL API that we will create. Select a setting to edit or continue: + > Continue +? Select the database type: + > MySQL // or PostgreSQL +Please provide the following database connection information: +? Enter the database url or host name: + > +? Enter the port number: + > 3306 +? Enter the username: + > +? Enter the password: + > +? Enter the database name: + > +``` + +Upon successfully connecting, the Amplify CLI will fetch the database schema and import it by generating an Amplify GraphQL schema from it into `/amplify/backend/api//schema.sql.graphql`. + + + **NOTE:** Only tables that have a primary key will be imported into the + generated schema. + + + + +If you need to update the credentials used to connect to the database, run the following command: + +```sh +amplify api update-secrets +``` + +This will prompt you to re-enter the database connection details. Once completed, the Amplify CLI will store the updated values in the SSM parameters that the SQL Lambda retrieves to connect to the SQL database. + +Test the connection by running: + +```sh +amplify api generate-schema +``` + +The Amplify CLI will attempt to fetch the database schema and regenerate the GraphQL schema in `/amplify/backend/api//schema.sql.graphql`. + + + + + + +Pre-requisites: + +- Have an existing MySQL or PostgreSQL database deployed +- The [AWS CDK CLI is installed](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_install) +- Have an [AWS CDK application initialized](https://docs.aws.amazon.com/cdk/v2/guide/hello_world.html) + +First, install required packages: + +```sh +npm install @aws-amplify/graphql-api-construct +``` + +Open the main stack file in your CDK project (usually located in `lib/-stack.ts`). Import the necessary constructs at the top of the file: + +```ts +import { + AmplifyGraphqlApi, + AmplifyGraphqlDefinition +} from '@aws-amplify/graphql-api-construct'; +``` + +In the main stack class, add the following code to define a new GraphQL API. Replace `stack` with the name of your stack instance: + +```ts +new AmplifyGraphqlApi(stack, 'SqlBoundApi', { + apiName: 'MySqlBoundApi', + definition: AmplifyGraphqlDefinition.fromString( + /* GraphQL */ ` + type Todo @model @refersTo(name: "todos") { + id: ID! @primaryKey + description: String! + } + `, + { + name: 'MySqlDB', + strategy: { + dbType: 'MYSQL', + vpcConfiguration: { + vpcId: 'vpc-123456', + securityGroupIds: ['sg-123', 'sg-456'], + subnetAvailabilityZoneConfig: [ + { subnetId: 'sn-123456', availabilityZone: 'us-east-1a' }, + { subnetId: 'sn-987654', availabilityZone: 'us-east-1b' } + ] + }, + dbConnectionConfig: { + hostnameSsmPath: + '/path/to/ssm/SecretString/containing/value/of/hostname', + portSsmPath: '/path/to/ssm/SecretString/containing/value/of/port', + usernameSsmPath: + '/path/to/ssm/SecretString/containing/value/of/username', + passwordSsmPath: + '/path/to/ssm/SecretString/containing/value/of/password', + databaseNameSsmPath: + '/path/to/ssm/SecretString/containing/value/of/databaseName' + } + } + } + ), + authorizationModes: { + apiKeyConfig: { expires: Duration.days(7) } + }, + translationBehavior: { + sandboxModeEnabled: true + } +}); +``` + +Before deploying: + +- Change the `dbType` to match your database engine of either MySQL or PostgreSQL. + +- Update the `vpcId`, `securityGroupIds`, and `subnetAvailabilityZoneConfig` according to your AWS environment. + +- Update the SSM parameter paths within `dbConnectionConfig`. + + + + + + +Consider adding an RDS Proxy in front of the cluster to manage database connections. + +When using AWS AppSync with a relational database like Amazon RDS, each query from your application needs to open a separate connection to the database. + +If there are a large number of queries occurring concurrently, it can exceed the connection limit on the database and result in errors like "Too many connections". To avoid this, the Amplify CLI can use an RDS Proxy when connecting your AppSync API to a database. + +The RDS Proxy acts as an intermediary sitting in front of your database. Instead of each application query opening a direct connection to the database, they will connect through the Proxy. The Proxy helps manage and pool these connections to avoid overwhelming your database cluster. This improves the availability of your API, allowing more queries to execute concurrently without hitting connection limits. + +However, there is a tradeoff of increased latency - queries may take slightly longer as they wait for an available connection from the Proxy pool. There are also additional costs associated with using RDS Proxy. Please refer to the pricing page for RDS Proxy to learn more. + + + +## Apply authorization rules on the models + +The `@auth` directive can be used to restrict access to data and operations by specifying authorization rules. It allows granular access control over the GraphQL API based on the user's identity and attributes. + +All model level authorization rules are supported for Amplify GraphQL schemas generated from MySQL and PostgreSQL databases. + +**NOTE:** Field level auth rules are not supported. + +In the example below, public users authorized via API Key are granted unrestricted access to all posts. + +Add the following auth rule to the `Post` model within the `schema.sql.graphql` file: + +```graphql +type Post @model @auth(rules: [{ allow: public }]) { + id: String! @primaryKey + title: String! + content: String! +} +``` + +In a real world scenario, you can instead define auth rules that only allow public users to read posts, and authenticated users the ability to update or delete their posts. + +For more information on each rule please refer to our documentation on [Authorization rules](/cli/graphql/authorization-rules/). + + + +To deploy the API, you can use the `amplify push` command: + +```sh +amplify push +``` + +```console +? Are you sure you want to continue? Y +? Do you want to generate code for your newly created GraphQL API? Y +? Choose the code generation language target: javascript (or your preferred language target) +? Enter the file name pattern of graphql queries, mutations and subscriptions src/graphql/**/*.js +? Do you want to generate/update all possible GraphQL operations - queries, mutations and subscriptions? Y +? Enter maximum statement depth [increase from default if your schema is deeply nested]: 2 +``` + + + +To deploy the API, you can use the `cdk deploy` command: + +```sh +cdk deploy +``` + +This will deploy the AWS AppSync API connected to your RDS database based on the GraphQL schema and SSM parameters provided. + +The API will have an API key enabled for authorization. Sandbox mode is enabled for testing. + + + + +Now the API has been deployed and you can start using it! + +You can start querying from the AWS AppSync console or integrate it into your application using the AWS Amplify libraries! + +## Apply iterative changes from the database definition + + +| SQL | GraphQL | +|--------------------|--------------| +| **String** | | +| char | String | +| varchar | String | +| tinytext | String | +| text | String | +| mediumtext | String | +| longtext | String | +| **Geometry** | | +| geometry | String | +| point | String | +| linestring | String | +| geometryCollection | String | +| **Numeric** | | +| smallint | Int | +| mediumint | Int | +| int | Int | +| integer | Int | +| bigint | Int | +| tinyint | Int | +| float | Float | +| double | Float | +| decimal | Float | +| dec | Float | +| numeric | Float | +| **Date and Time** | | +| date | AWSDate | +| datetime | AWSDateTime | +| timestamp | AWSDateTime | +| time | AWSTime | +| year | Int | +| **Binary** | | +| binary | String | +| varbinary | String | +| tinyblob | String | +| blob | String | +| mediumblob | String | +| longblob | String | +| **Others** | | +| bool | Boolean | +| boolean | Boolean | +| bit | Int | +| json | AWSJSON | +| enum | ENUM | + + + + + + +1. Make any adjustments to your SQL statements such as: + +```sql +CREATE TABLE posts ( + person_id varchar(255) NOT NULL PRIMARY KEY, + title varchar(255) NOT NULL, + content varchar(255) NOT NULL, + published tinyint(1) DEFAULT 0 NOT NULL + published_date date NULL +); +``` + +2. Generate an updated schema: + +```sh +amplify api generate-schema +``` + + + **NOTE:** If the connection to the database fails, the CLI will prompt you to + retry using a VPC endpoint. + + +3. Deploy your changes to the cloud: + +```sh +amplify push -y +``` + + + + 1. Make any adjustments to your SQL statements such as: + +```sql +CREATE TABLE posts ( + person_id varchar(255) NOT NULL PRIMARY KEY, + title varchar(255) NOT NULL, + content varchar(255) NOT NULL, + published tinyint(1) DEFAULT 0 NOT NULL + published_date date NULL +); +``` + +2. Generate an updated schema: + +```sh +npx @aws-amplify/cli api generate-schema —sql-schema —engineType mysql —out schema.rds.graphql +``` + +3. Deploy your changes to the cloud: + +```sh +cdk deploy +``` + + + + +## Make preserved changes to the GraphQL Schema + + +| Name | Supported | Model Level | Field Level | Preserved | Description | +|--------------|:---------:|:-----------:|:-----------:|:---------:|-------------| +| `@model` | ✅ | ✅ | ❌ | ✅ | Creates a datasource and resolver for a table | +| `@auth` | ✅ | ✅ | ❌ | ✅ | Allows access to data based on a set of authorization methods and operations. | +| `@primaryKey`| ✅ | ❌ | ✅ | ❌ | Sets a field to be the primary key. | +| `@index` | ✅ | ❌ | ✅ | ❌ | Creates an index on a table | +| `@default` | ✅ | ❌ | ✅ | ❌ | Sets the default value for a column | +| `@hasOne` | ✅ | ❌ | ✅ | ✅ | Creates a one-way 1:1 relationship from a parent to child model. | +| `@hasMany` | ✅ | ❌ | ✅ | ✅ | Creates a one-way 1:M relationship between two models, the reference being on the child. | +| `@belongsTo` | ✅ | ❌ | ✅ | ✅ | Creates bi-directional relationship with the parent model. | +| `@manyToMany`| ❌ | ❌ | ❌ | ❌ | Creates a M:N relationship between two models | +| `@refersTo` | ✅ | ✅ | ✅ | ✅ | Maps a model to a table, or a field to a column, by name. | +| `@mapsTo` | ❌ | ❌ | ❌ | ❌ | Maps a model to a DynamoDB table | +| `@sql` | ✅ | ❌ | ✅ | ✅ | Accepts a SQL statement to be executed to resolve a Custom Query or Mutation. | + + + +### Rename & map models to tables + +To rename models and fields, you can use the `@refersTo` directive to map the models in the GraphQL schema to the corresponding table or field by name. + +By default, the Amplify CLI singularizes each model name using PascalCase and field names that are either snake_case or kebab-case will be converted to camelCase. + +In the example below, the Post model in the GraphQL schema is now mapped to the posts table in the database schema. Also, the isPublished is now mapped to the published column on the posts table. + +```graphql +type Post @refersTo(name: "posts") @model { + id: String! @primaryKey + title: String! + content: String! + isPublished: Boolean @refersTo(name: "is-published") + publishedDate: AWSDate @refersTo(name: "published_date") +} +``` + +### Create custom queries and mutations + +Amplify GraphQL API for SQL databases introduces the `@sql` directive, which allows you to define SQL statements in custom GraphQL queries and mutations. This provides more flexibility when the default, auto-generated GraphQL queries and mutations are not sufficient. + +There are two ways to specify the SQL statement - inline or by referencing a `.sql` file. + +#### Inline SQL Statement + +You can embed the SQL statement directly in the schema using the `statement` argument. + +The SQL statement can use parameters in the format `:variable`, which will be bound to the input variables passed when executing a custom GraphQL query or mutation. + +In the example below, a SQL statement is defined, accepting a `searchTerm` input variable. + +```graphql +type Query { + searchPosts(searchTerm: String): [Post] + @sql(statement: "SELECT * FROM posts WHERE title LIKE :searchTerm;") +} +``` + +{/* TODO: Add a NOTE: about proxy/connection pinning here. */} + +#### SQL File Reference + +For longer, more complex SQL queries, you can specify the statement in a separate `.sql` file rather than inline. Referencing a file keeps your schema clean and allows reuse of SQL statements across fields. + +The reference value must match the name of a `.sql` file located in the `amplify/backend/api//sql-statements` folder. + +In the example below, a `getPublishedPostsByDateRange.sql` file containing a SQL statement is being referenced. + +```sql +-- getPublishedPostsByRange.sql +SELECT p.id, p.title, p.content, p.published_date +FROM posts p +WHERE p.published = 1 + AND p.published_date > :startDate + AND p.published_date < :endDate +ORDER BY p.published_date DESC +LIMIT 10 +``` + +```graphql +type Query { + getPublishedPostsByDateRange(startDate: AWSDate, endDate: AWSDate): [Post] + @sql(reference: "getPublishedPostsByDateRange") +} +``` + +The SQL statement will be executed as if it were defined inline in the schema. The same rules apply in terms of using parameters, ensuring valid SQL syntax, and matching the return type to row data. + +#### Custom Query + +```graphql +type Query { + searchPostsByTitle(title: String): [Post] + @sql( + statement: "SELECT * FROM Post WHERE title LIKE CONCAT('%', :title, '%');" + ) +} +``` + +#### Custom Mutation + +```graphql +type Mutation { + publishPostById(id: ID!): AWSJSON + @sql(statement: "UPDATE posts SET published = :published WHERE id = :id;") +} +``` + +#### Returning row data from custom mutations + +SQL statements such as `INSERT`, `UPDATE` and `DELETE` return the number of rows affected. + +If you want to return the result of the SQL statement, you can use `AWSJSON` as the return type. + +```graphql +type Mutation { + publishPosts: AWSJSON @sql(statement: "UPDATE Post SET published = 1;") +} +``` + +This will return a JSON response similar to this: + +```json +{ + "data": { + "publishPosts": "{\"fieldCount\":0,\"affectedRows\":7,\"insertId\":0,\"info\":\"Rows matched: 7 Changed: 7 Warnings: 0\",\"serverStatus\":34,\"warningStatus\":0,\"changedRows\":7}" + } +} +``` + +However, you might want to return the actual row data instead. + + + + +In MySQL, you can create and call a stored procedure that performs both an UPDATE statement and SELECT query to return a single post. + +Create a stored procedure: + +```sql +CREATE PROCEDURE publish_post (IN postId VARCHAR(255)) + +BEGIN +UPDATE posts SET published = 1 WHERE id = postId; + +SELECT * FROM posts WHERE id = postId LIMIT 1; +END +``` + +Call the stored procedure from the custom mutation: + +```graphql +type Mutation { + publishPostById(id: String!): [Post] + @sql(statement: "CALL publish_post(:id);") +} +``` + + + **NOTE:** Unlike the Amplify CLI-generated mutations that return a single + item, the return type for custom queries and mutations expecting row data must + be an array of the corresponding model. + + + + + +In PostgreSQL, you can add a `RETURNING` clause to an `INSERT`, `UPDATE`, or `DELETE` statement and get the actual modified row data. + +Example: + +```graphql +type Mutation { + publishPostById(id: String!): [Post] + @sql(statement: "UPDATE posts SET price = :id RETURNING *;") +} +``` + + + + +### Create relationships between models + +You can use the `@hasOne`, `@hasMany`, and `@belongsTo` relational directives to create relationships between models. When using a MySQL or PostgreSQL database, the field named in the `references` parameter of a relational directive must exist on the child. + +#### Has One relationship + +Create a one-directional one-to-one relationship between two models using the `@hasOne` directive. + +In the example below, a User has a single Profile. + +```graphql +type User + @refersTo(name: "users") + @model + @auth(rules: [{ allow: owner }, { allow: groups, groups: ["Admin"] }]) { + id: String! @primaryKey + name: String! + owner: String + profile: Profile @hasOne(references: ["userId"]) +} +``` + +#### Has Many relationship + +Create a one-directional one-to-many relationship between two models using the `@hasMany` directive. + +In the example below, a Blog has many Posts. + +```graphql +type Blog @model { + id: String! @primaryKey + title: String! + posts: [Post] @hasMany(references: ["blogId"]) +} + +type Post @model { + id: String! @primaryKey + title: String! + content: String! +} +``` + +#### Belongs To relationship + +Make a "has one" or "has many" relationship bi-directional with the `@belongsTo` directive. + +In the example below, a Post belongs to a Blog. + +```graphql +type Post @model { + id: String! @primaryKey + title: String! + content: String! + blogId: String! @refersTo(name: "blog_id") + blog: Blog @belongsTo(references: ["blogId"]) +} +``` + +## How does it work? + +The Amplify CLI uses AWS Lambda functions to enable features like querying data from your database. To work properly, these Lambda functions need access to common logic and dependencies. + +Amplify CLI provides this shared code in the form of Lambda Layers. You can think of Lambda Layers as a package of reusable runtime code that Lambda functions can reference. + +When you deploy an Amplify API, it will create two Lambda functions: + +### SQL Lambda + +This allows you to query and write data to your database from your API. + + + **NOTE:** If the database is in a VPC, this Lambda function will be deployed + in the same VPC as the database. The usage of Amazon Virtual Private Cloud + (VPC) or VPC peering, with AWS Lambda functions will incur additional charges + as explained, this comes with an additional cost as explained on the [Amazon + Elastic Compute Cloud (EC2) on-demand pricing + page](https://aws.amazon.com/ec2/pricing/on-demand/). + + +### Updater Lambda + +This automatically keeps the SQL Lambda up-to-date by managing its Lambda Layers. + +A Lambda layer that includes all the core SQL connection logic lives within the AWS Amplify service account but is executed within your AWS account, when invoked by the SQL Lambda. This allows the Amplify service team to own the ongoing maintenance and security enhancements of the SQL connection logic. + +This allows the Amplify team to maintain and enhance the SQL Layer without needing direct access to your Lambdas. If updates to the Layer are needed, the Updater Lambda will receive a signal from Amplify and automatically update the SQL Lambda with the latest Layer. + +## Troubleshooting + +### Debug Mode + +To return the actual SQL error instead of a generic error from AppSync responses, an environment variable `DEBUG_MODE` can be set to `true` on the Amplify CLI-generated `RDSLambdaLogicalID` lambda function. + +## Conclusion + +Congratulations! You have finished the **Connect your API to an existing database** guide. In this guide, you reviewed connecting to an existing database, making iterative changes to your database schema to ultimately generate and deploy a GraphQL API. You also reviewed which changes and directives are preserved, such as renaming and mapping models to tables, as well as creating custom queries and mutations using inline statements and references to SQL files. + +## Next steps + +Our recommended next steps include using the API to mutate and query data. You can also review how to subscribe to real-time events to look for mutations in your data. Some resources that will help with this work include: + +- [Create, update, and delete application data](/javascript/build-a-backend/graphqlapi/mutate-data/) +- [Read application data](/javascript/build-a-backend/graphqlapi/query-data/) +- [Subscribe to real-time events](/javascript/build-a-backend/graphqlapi/subscribe-data/) + + From 0dbb78597774782c5ae70ef86fd86cf998c564d3 Mon Sep 17 00:00:00 2001 From: Chris Bonifacio Date: Fri, 10 Nov 2023 10:37:43 -0500 Subject: [PATCH 02/30] add sql data types to cspell --- cspell.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/cspell.json b/cspell.json index e4a580dc683..42e9f957823 100644 --- a/cspell.json +++ b/cspell.json @@ -1532,7 +1532,18 @@ "wafv", "autoKsuid", "astro", - "disambiguator" + "disambiguator", + "tinyint", + "tinytext", + "mediumtext", + "longtext", + "linestring", + "smallint", + "mediumint", + "varbinary", + "tinyblob", + "mediumblob", + "longblob" ], "flagWords": ["hte", "full-stack", "Full-stack", "Full-Stack", "sudo"], "patterns": [ From a9d9f8502a2134891a00b0e17d7ecfe59983b5b8 Mon Sep 17 00:00:00 2001 From: Chris Bonifacio Date: Fri, 10 Nov 2023 10:45:44 -0500 Subject: [PATCH 03/30] add link to rds proxy pricing page --- .../graphqlapi/connect-api-to-existing-database/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx index 4cba1de94d6..89bd1dc1d5b 100644 --- a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx +++ b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx @@ -200,7 +200,7 @@ If there are a large number of queries occurring concurrently, it can exceed the The RDS Proxy acts as an intermediary sitting in front of your database. Instead of each application query opening a direct connection to the database, they will connect through the Proxy. The Proxy helps manage and pool these connections to avoid overwhelming your database cluster. This improves the availability of your API, allowing more queries to execute concurrently without hitting connection limits. -However, there is a tradeoff of increased latency - queries may take slightly longer as they wait for an available connection from the Proxy pool. There are also additional costs associated with using RDS Proxy. Please refer to the pricing page for RDS Proxy to learn more. +However, there is a tradeoff of increased latency - queries may take slightly longer as they wait for an available connection from the Proxy pool. There are also additional costs associated with using RDS Proxy. Please refer to the [pricing page for RDS Proxy](https://aws.amazon.com/rds/proxy/pricing/) to learn more. From cba3c3c951cb07ee9087e66c2c23e84139f41bf6 Mon Sep 17 00:00:00 2001 From: Chris Bonifacio Date: Fri, 10 Nov 2023 10:46:35 -0500 Subject: [PATCH 04/30] make schema.sql.graphql consistent --- .../graphqlapi/connect-api-to-existing-database/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx index 89bd1dc1d5b..63447c9c1c0 100644 --- a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx +++ b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx @@ -368,7 +368,7 @@ CREATE TABLE posts ( 2. Generate an updated schema: ```sh -npx @aws-amplify/cli api generate-schema —sql-schema —engineType mysql —out schema.rds.graphql +npx @aws-amplify/cli api generate-schema —sql-schema —engineType mysql —out schema.sql.graphql ``` 3. Deploy your changes to the cloud: From 1459bacf451e02be5a4341302ec054310c718725 Mon Sep 17 00:00:00 2001 From: Chris Bonifacio Date: Fri, 10 Nov 2023 10:49:04 -0500 Subject: [PATCH 05/30] change cyan mapping to skyblue for better readability --- .../connect-api-to-existing-database/index.mdx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx index 63447c9c1c0..95e02a47919 100644 --- a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx +++ b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx @@ -286,12 +286,12 @@ You can start querying from the AWS AppSync console or integrate it into your ap | linestring | String | | geometryCollection | String | | **Numeric** | | -| smallint | Int | -| mediumint | Int | -| int | Int | -| integer | Int | -| bigint | Int | -| tinyint | Int | +| smallint | Int | +| mediumint | Int | +| int | Int | +| integer | Int | +| bigint | Int | +| tinyint | Int | | float | Float | | double | Float | | decimal | Float | @@ -302,7 +302,7 @@ You can start querying from the AWS AppSync console or integrate it into your ap | datetime | AWSDateTime | | timestamp | AWSDateTime | | time | AWSTime | -| year | Int | +| year | Int | | **Binary** | | | binary | String | | varbinary | String | @@ -313,7 +313,7 @@ You can start querying from the AWS AppSync console or integrate it into your ap | **Others** | | | bool | Boolean | | boolean | Boolean | -| bit | Int | +| bit | Int | | json | AWSJSON | | enum | ENUM | From 38cd4b268e93788426d2899540825be451aafcfb Mon Sep 17 00:00:00 2001 From: Chris Bonifacio Date: Fri, 10 Nov 2023 10:59:33 -0500 Subject: [PATCH 06/30] adjust date type colors --- .../graphqlapi/connect-api-to-existing-database/index.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx index 95e02a47919..8b91cf1882a 100644 --- a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx +++ b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx @@ -298,10 +298,10 @@ You can start querying from the AWS AppSync console or integrate it into your ap | dec | Float | | numeric | Float | | **Date and Time** | | -| date | AWSDate | +| date | AWSDate | | datetime | AWSDateTime | | timestamp | AWSDateTime | -| time | AWSTime | +| time | AWSTime | | year | Int | | **Binary** | | | binary | String | From 08e1bb7e75ba7938a3b5372743b95ee912f679f3 Mon Sep 17 00:00:00 2001 From: Chris Bonifacio Date: Mon, 13 Nov 2023 19:53:41 -0800 Subject: [PATCH 07/30] Add page to directory.mjs --- src/directory/directory.mjs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/directory/directory.mjs b/src/directory/directory.mjs index 9948114c1e8..ddff0140eff 100644 --- a/src/directory/directory.mjs +++ b/src/directory/directory.mjs @@ -205,6 +205,9 @@ export const directory = { { path: 'src/pages/[platform]/build-a-backend/graphqlapi/connect-to-api/index.mdx' }, + { + path: 'src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx' + }, { path: 'src/pages/[platform]/build-a-backend/graphqlapi/api-graphql-concepts/index.mdx' }, @@ -254,7 +257,7 @@ export const directory = { path: 'src/pages/[platform]/build-a-backend/graphqlapi/best-practice/query-with-sorting/index.mdx' } ] - }, + } ] }, { @@ -2055,7 +2058,7 @@ export const directory = { }, { path: 'src/pages/gen2/how-amplify-works/existing-projects/index.mdx' - }, + } ] }, { From f57255134ff25fbfbf8b65ab26d43ee2d4dc481b Mon Sep 17 00:00:00 2001 From: Chris Bonifacio Date: Mon, 13 Nov 2023 20:55:30 -0800 Subject: [PATCH 08/30] update cdk with csv script and schema gen step --- .../index.mdx | 234 +++++++++++++++--- 1 file changed, 195 insertions(+), 39 deletions(-) diff --git a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx index 8b91cf1882a..5f02dd333db 100644 --- a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx +++ b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx @@ -4,7 +4,8 @@ export const meta = { title: 'Connect your API to an existing database', description: 'Learn how to connect your API to an existing MySQL or PostgreSQL database.', - platforms: ['javascript', 'react-native'] + platforms: ['javascript', 'react-native', 'flutter', 'swift', 'android'] + }; export const getStaticPaths = async () => { @@ -20,7 +21,7 @@ export function getStaticProps(context) { }; } - + In this section, you'll learn how to: @@ -46,7 +47,13 @@ Amplify CLI supports connecting to any existing MySQL or PostgreSQL database. If your database exists within a VPC, the RDS instance must be configured to be `Publicly accessible`. This does not mean the instance needs to accessible from the internet. -An inbound rule must be added to the security group to allow traffic on port 3306 for MySQL databases, 5432 for PostgreSQL databases, or the port chosen when setting up the instance. +When importing a database schema, the Amplify CLI will automatically discover that the RDS instance is in a VPC and install a Lambda function into that VPC, subnets, and security groups. + +The target security group(s) must have two inbound rules set up: + +- A rule allowing traffic on port 443 from the security group. + +- An inbound rule allowing traffic on the database port from the security group. (Default: 3306 for MySQL. 5432 for PostgreSQL.) **NOTE:** Make sure to limit the type of inbound traffic your security group @@ -63,6 +70,8 @@ First, set up your GraphQL API by running: amplify import api ``` +Answer the prompts with your database connection details: + ```console ? Here is the GraphQL API that we will create. Select a setting to edit or continue: > Continue @@ -111,12 +120,34 @@ The Amplify CLI will attempt to fetch the database schema and regenerate the Gra + Pre-requisites: - Have an existing MySQL or PostgreSQL database deployed - The [AWS CDK CLI is installed](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_install) - Have an [AWS CDK application initialized](https://docs.aws.amazon.com/cdk/v2/guide/hello_world.html) + + +If your database exists within a VPC, the RDS instance must be configured to be `Publicly accessible`. This does not mean the instance needs to accessible from the internet. + +When importing a database schema, the Amplify CLI will automatically discover that the RDS instance is in a VPC and install a Lambda function into that VPC, subnets, and security groups. + +The target security group(s) must have two inbound rules set up: + +- A rule allowing traffic on port 443 from the security group. + +- An inbound rule allowing traffic on the database port from the security group. (Default: 3306 for MySQL. 5432 for PostgreSQL.) + + + **NOTE:** Make sure to limit the type of inbound traffic your security group + allows according to your security needs and/or use cases. For information on + security group rules, please refer to the Amazon EC2 documentation: + https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules-reference.html?icmpid=docs_ec2_console + + + + First, install required packages: ```sh @@ -132,20 +163,90 @@ import { } from '@aws-amplify/graphql-api-construct'; ``` +Create a `blogs` table in your database: + +```sql +CREATE TABLE blogs ( + id varchar(255) NOT NULL PRIMARY KEY, + title varchar(255) NOT NULL, +); +``` + +Execute the following SQL statement on your database using a MySQL, PostgreSQL Client or CLI tool similar to `psql` and export the output to a CSV file: + + + **NOTE:** Make sure to include column headers when exporting the output to a + CSV file. + + + + +```sql +SELECT information_schema.columns.*, + information_schema.statistics.index_name, + information_schema.statistics.non_unique, + information_schema.statistics.seq_in_index, + information_schema.statistics.nullable +FROM information_schema.columns + LEFT JOIN information_schema.statistics + ON information_schema.columns.table_name = + information_schema.statistics.table_name + AND information_schema.columns.column_name = + information_schema.statistics.column_name +WHERE information_schema.columns.table_schema = '' +``` + + +```sql +SELECT enum_name, + enum_values, + table_name, + column_name, + column_default, + ordinal_position, + data_type, + udt_name, + is_nullable, + character_maximum_length, + indexname, + REPLACE(Substring(indexdef FROM '\((.*)\)'), '"', '') AS index_columns +FROM information_schema.columns + LEFT JOIN pg_indexes + ON information_schema.columns.table_name = pg_indexes.tablename + AND information_schema.columns.column_name = any ( + String_to_array( + REPLACE(Substring + (indexdef FROM '\((.*)\)'), '"', ''), ', ') ) + LEFT JOIN (SELECT t.typname AS enum_name, + Array_agg(e.enumlabel) AS enum_values + FROM pg_type t + JOIN pg_enum e + ON t.oid = e.enumtypid + JOIN pg_catalog.pg_namespace n + ON n.oid = t.typnamespace + WHERE n.nspname = 'public' + GROUP BY enum_name) enums + ON enums.enum_name = information_schema.columns.udt_name +WHERE table_schema = 'public' + AND table_catalog = '' +``` + + + +Generate an Amplify GraphQL API schema by running the following command, replacing the `--sql-schema` value with the path to the CSV file created in the previous step: + +```sh +npx @aws-amplify/cli api generate-schema --sql-schema --engine-type mysql --out schema.sql.graphql +``` + In the main stack class, add the following code to define a new GraphQL API. Replace `stack` with the name of your stack instance: ```ts new AmplifyGraphqlApi(stack, 'SqlBoundApi', { apiName: 'MySqlBoundApi', - definition: AmplifyGraphqlDefinition.fromString( - /* GraphQL */ ` - type Todo @model @refersTo(name: "todos") { - id: ID! @primaryKey - description: String! - } - `, + definition: AmplifyGraphqlDefinition.fromFilesAndDefinition( + [path.join(__dirname, 'schema.sql.graphql')], { - name: 'MySqlDB', strategy: { dbType: 'MYSQL', vpcConfiguration: { @@ -179,13 +280,15 @@ new AmplifyGraphqlApi(stack, 'SqlBoundApi', { }); ``` -Before deploying: +The API will have an API key enabled for authorization. Sandbox mode is enabled for testing. + +Before deploying, make sure to: - Change the `dbType` to match your database engine of either MySQL or PostgreSQL. -- Update the `vpcId`, `securityGroupIds`, and `subnetAvailabilityZoneConfig` according to your AWS environment. +- Update the `vpcId`, `securityGroupIds`, and `subnetAvailabilityZoneConfig` with your vpc details. -- Update the SSM parameter paths within `dbConnectionConfig`. +- Update the SSM parameter paths within `dbConnectionConfig` to point to those existing in your AWS account. @@ -214,13 +317,12 @@ All model level authorization rules are supported for Amplify GraphQL schemas ge In the example below, public users authorized via API Key are granted unrestricted access to all posts. -Add the following auth rule to the `Post` model within the `schema.sql.graphql` file: +Add the following auth rule to the `Blog` model within the `schema.sql.graphql` file: ```graphql -type Post @model @auth(rules: [{ allow: public }]) { +type Blog @model @refersTo(name: "blogs") @auth(rules: [{ allow: public }]) { id: String! @primaryKey title: String! - content: String! } ``` @@ -228,6 +330,8 @@ In a real world scenario, you can instead define auth rules that only allow publ For more information on each rule please refer to our documentation on [Authorization rules](/cli/graphql/authorization-rules/). +## Deploy your API + To deploy the API, you can use the `amplify push` command: @@ -253,10 +357,6 @@ To deploy the API, you can use the `cdk deploy` command: cdk deploy ``` -This will deploy the AWS AppSync API connected to your RDS database based on the GraphQL schema and SSM parameters provided. - -The API will have an API key enabled for authorization. Sandbox mode is enabled for testing. - @@ -326,7 +426,7 @@ You can start querying from the AWS AppSync console or integrate it into your ap ```sql CREATE TABLE posts ( - person_id varchar(255) NOT NULL PRIMARY KEY, + id varchar(255) NOT NULL PRIMARY KEY, title varchar(255) NOT NULL, content varchar(255) NOT NULL, published tinyint(1) DEFAULT 0 NOT NULL @@ -357,7 +457,7 @@ amplify push -y ```sql CREATE TABLE posts ( - person_id varchar(255) NOT NULL PRIMARY KEY, + id varchar(255) NOT NULL PRIMARY KEY, title varchar(255) NOT NULL, content varchar(255) NOT NULL, published tinyint(1) DEFAULT 0 NOT NULL @@ -365,13 +465,69 @@ CREATE TABLE posts ( ); ``` -2. Generate an updated schema: +2. Run the following SQL statement on your database using a MySQL, PostgreSQL Client or CLI tool similar to `psql`. Export the output to a CSV file with column headers included. + + + +```sql +SELECT information_schema.columns.*, + information_schema.statistics.index_name, + information_schema.statistics.non_unique, + information_schema.statistics.seq_in_index, + information_schema.statistics.nullable +FROM information_schema.columns + LEFT JOIN information_schema.statistics + ON information_schema.columns.table_name = + information_schema.statistics.table_name + AND information_schema.columns.column_name = + information_schema.statistics.column_name +WHERE information_schema.columns.table_schema = '' +``` + + +```sql +SELECT enum_name, + enum_values, + table_name, + column_name, + column_default, + ordinal_position, + data_type, + udt_name, + is_nullable, + character_maximum_length, + indexname, + REPLACE(Substring(indexdef FROM '\((.*)\)'), '"', '') AS index_columns +FROM information_schema.columns + LEFT JOIN pg_indexes + ON information_schema.columns.table_name = pg_indexes.tablename + AND information_schema.columns.column_name = any ( + String_to_array( + REPLACE(Substring + (indexdef FROM '\((.*)\)'), '"', ''), ', ') ) + LEFT JOIN (SELECT t.typname AS enum_name, + Array_agg(e.enumlabel) AS enum_values + FROM pg_type t + JOIN pg_enum e + ON t.oid = e.enumtypid + JOIN pg_catalog.pg_namespace n + ON n.oid = t.typnamespace + WHERE n.nspname = 'public' + GROUP BY enum_name) enums + ON enums.enum_name = information_schema.columns.udt_name +WHERE table_schema = 'public' + AND table_catalog = '' +``` + + + +3. Generate an updated schema by running the following command, replacing the `--sql-schema` value with the path to the CSV file created in the previous step: ```sh -npx @aws-amplify/cli api generate-schema —sql-schema —engineType mysql —out schema.sql.graphql +npx @aws-amplify/cli api generate-schema --sql-schema --engine-type mysql --out schema.sql.graphql ``` -3. Deploy your changes to the cloud: +4. Deploy your changes to the cloud: ```sh cdk deploy @@ -380,23 +536,23 @@ cdk deploy -## Make preserved changes to the GraphQL Schema +## Making preserved changes to the GraphQL Schema - + | Name | Supported | Model Level | Field Level | Preserved | Description | |--------------|:---------:|:-----------:|:-----------:|:---------:|-------------| -| `@model` | ✅ | ✅ | ❌ | ✅ | Creates a datasource and resolver for a table | +| `@model` | ✅ | ✅ | ❌ | ✅ | Creates a datasource and resolver for a table. | | `@auth` | ✅ | ✅ | ❌ | ✅ | Allows access to data based on a set of authorization methods and operations. | | `@primaryKey`| ✅ | ❌ | ✅ | ❌ | Sets a field to be the primary key. | -| `@index` | ✅ | ❌ | ✅ | ❌ | Creates an index on a table | -| `@default` | ✅ | ❌ | ✅ | ❌ | Sets the default value for a column | -| `@hasOne` | ✅ | ❌ | ✅ | ✅ | Creates a one-way 1:1 relationship from a parent to child model. | -| `@hasMany` | ✅ | ❌ | ✅ | ✅ | Creates a one-way 1:M relationship between two models, the reference being on the child. | -| `@belongsTo` | ✅ | ❌ | ✅ | ✅ | Creates bi-directional relationship with the parent model. | -| `@manyToMany`| ❌ | ❌ | ❌ | ❌ | Creates a M:N relationship between two models | +| `@index` | ✅ | ❌ | ✅ | ❌ | Defines an index on a table. | +| `@default` | ✅ | ❌ | ✅ | ❌ | Sets the default value for a column. | +| `@hasOne` | ✅ | ❌ | ✅ | ✅ | Defines a one-way 1:1 relationship from a parent to child model. | +| `@hasMany` | ✅ | ❌ | ✅ | ✅ | Defines a one-way 1:M relationship between two models, the reference being on the child. | +| `@belongsTo` | ✅ | ❌ | ✅ | ✅ | Defines bi-directional relationship with the parent model. | +| `@manyToMany`| ❌ | ❌ | ❌ | ❌ | Defines a M:N relationship between two models. | | `@refersTo` | ✅ | ✅ | ✅ | ✅ | Maps a model to a table, or a field to a column, by name. | -| `@mapsTo` | ❌ | ❌ | ❌ | ❌ | Maps a model to a DynamoDB table | -| `@sql` | ✅ | ❌ | ✅ | ✅ | Accepts a SQL statement to be executed to resolve a Custom Query or Mutation. | +| `@mapsTo` | ❌ | ❌ | ❌ | ❌ | Maps a model to a DynamoDB table. | +| `@sql` | ✅ | ❌ | ✅ | ✅ | Accepts an inline SQL statement or reference to a .sql file to be executed to resolve a Custom Query or Mutation. | @@ -424,7 +580,7 @@ Amplify GraphQL API for SQL databases introduces the `@sql` directive, which all There are two ways to specify the SQL statement - inline or by referencing a `.sql` file. -#### Inline SQL Statement +**Inline SQL Statement** You can embed the SQL statement directly in the schema using the `statement` argument. @@ -441,7 +597,7 @@ type Query { {/* TODO: Add a NOTE: about proxy/connection pinning here. */} -#### SQL File Reference +**SQL File Reference** For longer, more complex SQL queries, you can specify the statement in a separate `.sql` file rather than inline. Referencing a file keeps your schema clean and allows reuse of SQL statements across fields. From 7fcb385fa3ea3f816ff02bb905a243d2382a9587 Mon Sep 17 00:00:00 2001 From: Chris Bonifacio Date: Mon, 13 Nov 2023 20:55:38 -0800 Subject: [PATCH 09/30] add terms to cspell --- cspell.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/cspell.json b/cspell.json index 42e9f957823..0c720ee942d 100644 --- a/cspell.json +++ b/cspell.json @@ -1543,7 +1543,15 @@ "varbinary", "tinyblob", "mediumblob", - "longblob" + "longblob", + "psql", + "indexname", + "indexdef", + "typname", + "enumlabel", + "enumtypid", + "typnamespace", + "nspname" ], "flagWords": ["hte", "full-stack", "Full-stack", "Full-Stack", "sudo"], "patterns": [ From 621ee93d06c6be20e54ae50c95e3f5a42ed96d2c Mon Sep 17 00:00:00 2001 From: Chris Bonifacio Date: Mon, 13 Nov 2023 21:11:42 -0800 Subject: [PATCH 10/30] add callout for time zone offsets --- .../graphqlapi/connect-api-to-existing-database/index.mdx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx index 5f02dd333db..9888c187171 100644 --- a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx +++ b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx @@ -371,6 +371,13 @@ You can start querying from the AWS AppSync console or integrate it into your ap headingLevel="3" eyebrow="Info" > + + +**Note:** MySQL does not support time zone offsets in date time or timestamp fields. Instead, we will convert these values to `datetime`, without the offset. + +Unlike MySQL, PostgreSQL does support date time or timestamp values with an offset. + + | SQL | GraphQL | |--------------------|--------------| | **String** | | From 6bde20bee8510838463f125cdb8f8e7dfd9069a8 Mon Sep 17 00:00:00 2001 From: Chris Bonifacio Date: Mon, 13 Nov 2023 21:13:43 -0800 Subject: [PATCH 11/30] adjust header levels --- .../connect-api-to-existing-database/index.mdx | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx index 9888c187171..7180b212e38 100644 --- a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx +++ b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx @@ -543,8 +543,6 @@ cdk deploy -## Making preserved changes to the GraphQL Schema - | Name | Supported | Model Level | Field Level | Preserved | Description | |--------------|:---------:|:-----------:|:-----------:|:---------:|-------------| @@ -581,7 +579,7 @@ type Post @refersTo(name: "posts") @model { } ``` -### Create custom queries and mutations +## Create custom queries and mutations Amplify GraphQL API for SQL databases introduces the `@sql` directive, which allows you to define SQL statements in custom GraphQL queries and mutations. This provides more flexibility when the default, auto-generated GraphQL queries and mutations are not sufficient. @@ -632,7 +630,7 @@ type Query { The SQL statement will be executed as if it were defined inline in the schema. The same rules apply in terms of using parameters, ensuring valid SQL syntax, and matching the return type to row data. -#### Custom Query +### Custom Query ```graphql type Query { @@ -643,7 +641,7 @@ type Query { } ``` -#### Custom Mutation +### Custom Mutation ```graphql type Mutation { @@ -652,7 +650,7 @@ type Mutation { } ``` -#### Returning row data from custom mutations +### Returning row data from custom mutations SQL statements such as `INSERT`, `UPDATE` and `DELETE` return the number of rows affected. @@ -725,11 +723,11 @@ type Mutation { -### Create relationships between models +## Create relationships between models You can use the `@hasOne`, `@hasMany`, and `@belongsTo` relational directives to create relationships between models. When using a MySQL or PostgreSQL database, the field named in the `references` parameter of a relational directive must exist on the child. -#### Has One relationship +### Has One relationship Create a one-directional one-to-one relationship between two models using the `@hasOne` directive. @@ -747,7 +745,7 @@ type User } ``` -#### Has Many relationship +### Has Many relationship Create a one-directional one-to-many relationship between two models using the `@hasMany` directive. @@ -767,7 +765,7 @@ type Post @model { } ``` -#### Belongs To relationship +### Belongs To relationship Make a "has one" or "has many" relationship bi-directional with the `@belongsTo` directive. From 9a9e7b5e1df336eccaf61a34ca446ae5d53dd2de Mon Sep 17 00:00:00 2001 From: Chris Bonifacio Date: Mon, 13 Nov 2023 21:18:27 -0800 Subject: [PATCH 12/30] remove redundant text --- .../graphqlapi/connect-api-to-existing-database/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx index 7180b212e38..74dc8a8e8cf 100644 --- a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx +++ b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx @@ -725,7 +725,7 @@ type Mutation { ## Create relationships between models -You can use the `@hasOne`, `@hasMany`, and `@belongsTo` relational directives to create relationships between models. When using a MySQL or PostgreSQL database, the field named in the `references` parameter of a relational directive must exist on the child. +You can use the `@hasOne`, `@hasMany`, and `@belongsTo` relational directives to create relationships between models. The field named in the `references` parameter of the relational directives must exist on the child model. ### Has One relationship From 118d06f7719f367c803d5157219626b990fdf2eb Mon Sep 17 00:00:00 2001 From: Chris Bonifacio Date: Mon, 13 Nov 2023 21:24:40 -0800 Subject: [PATCH 13/30] add step to replace in sql script --- .../graphqlapi/connect-api-to-existing-database/index.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx index 74dc8a8e8cf..b16c0431db0 100644 --- a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx +++ b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx @@ -179,6 +179,8 @@ Execute the following SQL statement on your database using a MySQL, PostgreSQL C CSV file. +Replace `` with the name of your database/schema. + ```sql From 422b332498cdf198bf619f3b6c54488c262ed764 Mon Sep 17 00:00:00 2001 From: Chris Bonifacio Date: Mon, 13 Nov 2023 21:25:46 -0800 Subject: [PATCH 14/30] add step to replace in sql script --- .../graphqlapi/connect-api-to-existing-database/index.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx index b16c0431db0..457f7ec4ab0 100644 --- a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx +++ b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx @@ -476,6 +476,8 @@ CREATE TABLE posts ( 2. Run the following SQL statement on your database using a MySQL, PostgreSQL Client or CLI tool similar to `psql`. Export the output to a CSV file with column headers included. +Replace `` with the name of your database/schema. + ```sql From d80162ba8e6658c8d909d4d7c68d745617f78e2e Mon Sep 17 00:00:00 2001 From: Chris Bonifacio Date: Mon, 13 Nov 2023 21:37:34 -0800 Subject: [PATCH 15/30] mention updating the path to the graphql file --- .../graphqlapi/connect-api-to-existing-database/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx index 457f7ec4ab0..9d42304f9f3 100644 --- a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx +++ b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx @@ -241,7 +241,7 @@ Generate an Amplify GraphQL API schema by running the following command, replaci npx @aws-amplify/cli api generate-schema --sql-schema --engine-type mysql --out schema.sql.graphql ``` -In the main stack class, add the following code to define a new GraphQL API. Replace `stack` with the name of your stack instance: +In the main stack class, add the following code to define a new GraphQL API. Replace `stack` with the name of your stack instance and update the path to the `schema.sql.graphql` file generated in the previous step: ```ts new AmplifyGraphqlApi(stack, 'SqlBoundApi', { From 82978968a4e7d44ea0f90ebb9e03cddd806cc55d Mon Sep 17 00:00:00 2001 From: Chris Bonifacio Date: Tue, 14 Nov 2023 10:36:22 -0800 Subject: [PATCH 16/30] update links to point to platform/ --- .../graphqlapi/connect-api-to-existing-database/index.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx index 9d42304f9f3..e49d9c1465a 100644 --- a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx +++ b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx @@ -330,7 +330,7 @@ type Blog @model @refersTo(name: "blogs") @auth(rules: [{ allow: public }]) { In a real world scenario, you can instead define auth rules that only allow public users to read posts, and authenticated users the ability to update or delete their posts. -For more information on each rule please refer to our documentation on [Authorization rules](/cli/graphql/authorization-rules/). +For more information on each rule please refer to our documentation on [Authorization rules](/[platform]/build-a-backend/graphqlapi/customize-authorization-rules/). ## Deploy your API @@ -828,8 +828,8 @@ Congratulations! You have finished the **Connect your API to an existing databas Our recommended next steps include using the API to mutate and query data. You can also review how to subscribe to real-time events to look for mutations in your data. Some resources that will help with this work include: -- [Create, update, and delete application data](/javascript/build-a-backend/graphqlapi/mutate-data/) -- [Read application data](/javascript/build-a-backend/graphqlapi/query-data/) -- [Subscribe to real-time events](/javascript/build-a-backend/graphqlapi/subscribe-data/) +- [Create, update, and delete application data](/[platform]/build-a-backend/graphqlapi/mutate-data/) +- [Read application data](/[platform]/build-a-backend/graphqlapi/query-data/) +- [Subscribe to real-time events](/[platform]/build-a-backend/graphqlapi/subscribe-data/) From 49afe346872ede1a8d253916de57655d66c4905a Mon Sep 17 00:00:00 2001 From: Chris Bonifacio Date: Tue, 14 Nov 2023 11:06:13 -0800 Subject: [PATCH 17/30] remove gen2/existing-projects page from directory.mjs --- src/directory/directory.mjs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/directory/directory.mjs b/src/directory/directory.mjs index a8d08863b36..c1624274e0a 100644 --- a/src/directory/directory.mjs +++ b/src/directory/directory.mjs @@ -196,10 +196,10 @@ export const directory = { path: 'src/pages/[platform]/build-a-backend/graphqlapi/set-up-graphql-api/index.mdx' }, { - path: 'src/pages/[platform]/build-a-backend/graphqlapi/connect-to-api/index.mdx' + path: 'src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx' }, { - path: 'src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx' + path: 'src/pages/[platform]/build-a-backend/graphqlapi/connect-to-api/index.mdx' }, { path: 'src/pages/[platform]/build-a-backend/graphqlapi/data-modeling/index.mdx' @@ -1743,9 +1743,6 @@ export const directory = { { path: 'src/pages/gen2/how-amplify-works/project-structure/index.mdx' }, - { - path: 'src/pages/gen2/how-amplify-works/existing-projects/index.mdx' - }, { path: 'src/pages/gen2/how-amplify-works/mobile-support/index.mdx' }, From 0218aa1f53d82362e4f0803ddb03c9befd9e4f26 Mon Sep 17 00:00:00 2001 From: Chris Bonifacio Date: Wed, 15 Nov 2023 08:44:04 -0800 Subject: [PATCH 18/30] update MySQL csv script --- .../index.mdx | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx index e49d9c1465a..975213baeaa 100644 --- a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx +++ b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx @@ -184,18 +184,22 @@ Replace `` with the name of your database/schema. ```sql -SELECT information_schema.columns.*, - information_schema.statistics.index_name, - information_schema.statistics.non_unique, - information_schema.statistics.seq_in_index, - information_schema.statistics.nullable -FROM information_schema.columns - LEFT JOIN information_schema.statistics - ON information_schema.columns.table_name = - information_schema.statistics.table_name - AND information_schema.columns.column_name = - information_schema.statistics.column_name -WHERE information_schema.columns.table_schema = '' +SELECT + INFORMATION_SCHEMA.COLUMNS.TABLE_NAME, + INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME, + INFORMATION_SCHEMA.COLUMNS.COLUMN_DEFAULT, + INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION, + INFORMATION_SCHEMA.COLUMNS.DATA_TYPE, + INFORMATION_SCHEMA.COLUMNS.COLUMN_TYPE, + INFORMATION_SCHEMA.COLUMNS.IS_NULLABLE, + INFORMATION_SCHEMA.COLUMNS.CHARACTER_MAXIMUM_LENGTH, + INFORMATION_SCHEMA.STATISTICS.INDEX_NAME, + INFORMATION_SCHEMA.STATISTICS.NON_UNIQUE, + INFORMATION_SCHEMA.STATISTICS.SEQ_IN_INDEX, + INFORMATION_SCHEMA.STATISTICS.NULLABLE + FROM INFORMATION_SCHEMA.COLUMNS + LEFT JOIN INFORMATION_SCHEMA.STATISTICS ON INFORMATION_SCHEMA.COLUMNS.TABLE_NAME=INFORMATION_SCHEMA.STATISTICS.TABLE_NAME AND INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME=INFORMATION_SCHEMA.STATISTICS.COLUMN_NAME + WHERE INFORMATION_SCHEMA.COLUMNS.TABLE_SCHEMA = ''; ``` From 9d707e71c808d29360a8373495dc3b615065bd4b Mon Sep 17 00:00:00 2001 From: Chris Bonifacio Date: Wed, 15 Nov 2023 09:27:41 -0800 Subject: [PATCH 19/30] update cdk construct api --- .../index.mdx | 53 ++++++++++--------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx index 975213baeaa..be7d57cd0f0 100644 --- a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx +++ b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx @@ -250,35 +250,34 @@ In the main stack class, add the following code to define a new GraphQL API. Rep ```ts new AmplifyGraphqlApi(stack, 'SqlBoundApi', { apiName: 'MySqlBoundApi', - definition: AmplifyGraphqlDefinition.fromFilesAndDefinition( + definition: AmplifyGraphqlDefinition.fromFilesAndStrategy( [path.join(__dirname, 'schema.sql.graphql')], { - strategy: { - dbType: 'MYSQL', - vpcConfiguration: { - vpcId: 'vpc-123456', - securityGroupIds: ['sg-123', 'sg-456'], - subnetAvailabilityZoneConfig: [ - { subnetId: 'sn-123456', availabilityZone: 'us-east-1a' }, - { subnetId: 'sn-987654', availabilityZone: 'us-east-1b' } - ] - }, - dbConnectionConfig: { - hostnameSsmPath: - '/path/to/ssm/SecretString/containing/value/of/hostname', - portSsmPath: '/path/to/ssm/SecretString/containing/value/of/port', - usernameSsmPath: - '/path/to/ssm/SecretString/containing/value/of/username', - passwordSsmPath: - '/path/to/ssm/SecretString/containing/value/of/password', - databaseNameSsmPath: - '/path/to/ssm/SecretString/containing/value/of/databaseName' - } + name: 'MyBlogSiteDatabase', + dbType: 'MYSQL', + vpcConfiguration: { + vpcId: 'vpc-123456', + securityGroupIds: ['sg-123', 'sg-456'], + subnetAvailabilityZoneConfig: [ + { subnetId: 'sn-123456', availabilityZone: 'us-east-1a' }, + { subnetId: 'sn-987654', availabilityZone: 'us-east-1b' } + ] + }, + dbConnectionConfig: { + hostnameSsmPath: + '/path/to/ssm/SecretString/containing/value/of/hostname', + portSsmPath: '/path/to/ssm/SecretString/containing/value/of/port', + usernameSsmPath: + '/path/to/ssm/SecretString/containing/value/of/username', + passwordSsmPath: + '/path/to/ssm/SecretString/containing/value/of/password', + databaseNameSsmPath: + '/path/to/ssm/SecretString/containing/value/of/databaseName' } } ), authorizationModes: { - apiKeyConfig: { expires: Duration.days(7) } + apiKeyConfig: { expires: cdk.Duration.days(7) } }, translationBehavior: { sandboxModeEnabled: true @@ -290,11 +289,13 @@ The API will have an API key enabled for authorization. Sandbox mode is enabled Before deploying, make sure to: -- Change the `dbType` to match your database engine of either MySQL or PostgreSQL. +- Set a value for `name`. This will be used to name the AppSync DataSource itself, plus any associated resources like resolver Lambdas. This name must be unique across all schema definitions in a GraphQL API. -- Update the `vpcId`, `securityGroupIds`, and `subnetAvailabilityZoneConfig` with your vpc details. +- Change the `dbType` to match your database engine. This is the type of the SQL database used to process model operations for this definition.Supported engines are `"MYSQL"`, `"POSTGRES"`, or `"DYNAMODB"`. -- Update the SSM parameter paths within `dbConnectionConfig` to point to those existing in your AWS account. +- Update the `vpcId`, `securityGroupIds`, and `subnetAvailabilityZoneConfig` with your vpc details. This is the configuration of the VPC into which to install the SQL Lambda. + +- Update the SSM parameter paths within `dbConnectionConfig` to point to those existing in your AWS account. These are the parameters the SQL Lambda will use to connect to the database. From 11121ec8b8385310bd69398b001e87a7fbb2ef96 Mon Sep 17 00:00:00 2001 From: Chris Bonifacio Date: Wed, 15 Nov 2023 11:33:31 -0800 Subject: [PATCH 20/30] update sql script for postgres --- .../index.mdx | 61 +++++++++---------- 1 file changed, 30 insertions(+), 31 deletions(-) diff --git a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx index be7d57cd0f0..15ea1896657 100644 --- a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx +++ b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx @@ -204,37 +204,36 @@ SELECT ```sql -SELECT enum_name, - enum_values, - table_name, - column_name, - column_default, - ordinal_position, - data_type, - udt_name, - is_nullable, - character_maximum_length, - indexname, - REPLACE(Substring(indexdef FROM '\((.*)\)'), '"', '') AS index_columns -FROM information_schema.columns - LEFT JOIN pg_indexes - ON information_schema.columns.table_name = pg_indexes.tablename - AND information_schema.columns.column_name = any ( - String_to_array( - REPLACE(Substring - (indexdef FROM '\((.*)\)'), '"', ''), ', ') ) - LEFT JOIN (SELECT t.typname AS enum_name, - Array_agg(e.enumlabel) AS enum_values - FROM pg_type t - JOIN pg_enum e - ON t.oid = e.enumtypid - JOIN pg_catalog.pg_namespace n - ON n.oid = t.typnamespace - WHERE n.nspname = 'public' - GROUP BY enum_name) enums - ON enums.enum_name = information_schema.columns.udt_name -WHERE table_schema = 'public' - AND table_catalog = '' +SELECT + enum_name, + enum_values, + table_name, + column_name, + column_default, + ordinal_position, + data_type, + udt_name, + is_nullable, + character_maximum_length, + indexname, + REPLACE(SUBSTRING(indexdef from '\((.*)\)'), '"', '') as index_columns + FROM INFORMATION_SCHEMA.COLUMNS + LEFT JOIN pg_indexes + ON + INFORMATION_SCHEMA.COLUMNS.table_name = pg_indexes.tablename + AND INFORMATION_SCHEMA.COLUMNS.column_name = ANY(STRING_TO_ARRAY(REPLACE(SUBSTRING(indexdef from '\((.*)\)'), '"', ''), ', ')) + LEFT JOIN ( + SELECT + t.typname AS enum_name, + ARRAY_AGG(e.enumlabel) as enum_values + FROM pg_type t JOIN + pg_enum e ON t.oid = e.enumtypid JOIN + pg_catalog.pg_namespace n ON n.oid = t.typnamespace + WHERE n.nspname = 'public' + GROUP BY enum_name + ) enums + ON enums.enum_name = INFORMATION_SCHEMA.COLUMNS.udt_name + WHERE table_schema = 'public' AND TABLE_CATALOG = ''; ``` From 684cf6649bcc3a4883d4820560785b95a5c1c75a Mon Sep 17 00:00:00 2001 From: Chris Bonifacio Date: Wed, 15 Nov 2023 11:35:18 -0800 Subject: [PATCH 21/30] update sql scripts under iterative changes section --- .../index.mdx | 89 ++++++++++--------- 1 file changed, 46 insertions(+), 43 deletions(-) diff --git a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx index 15ea1896657..60c886971dc 100644 --- a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx +++ b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx @@ -485,53 +485,56 @@ Replace `` with the name of your database/schema. ```sql -SELECT information_schema.columns.*, - information_schema.statistics.index_name, - information_schema.statistics.non_unique, - information_schema.statistics.seq_in_index, - information_schema.statistics.nullable -FROM information_schema.columns - LEFT JOIN information_schema.statistics - ON information_schema.columns.table_name = - information_schema.statistics.table_name - AND information_schema.columns.column_name = - information_schema.statistics.column_name -WHERE information_schema.columns.table_schema = '' +SELECT + INFORMATION_SCHEMA.COLUMNS.TABLE_NAME, + INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME, + INFORMATION_SCHEMA.COLUMNS.COLUMN_DEFAULT, + INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION, + INFORMATION_SCHEMA.COLUMNS.DATA_TYPE, + INFORMATION_SCHEMA.COLUMNS.COLUMN_TYPE, + INFORMATION_SCHEMA.COLUMNS.IS_NULLABLE, + INFORMATION_SCHEMA.COLUMNS.CHARACTER_MAXIMUM_LENGTH, + INFORMATION_SCHEMA.STATISTICS.INDEX_NAME, + INFORMATION_SCHEMA.STATISTICS.NON_UNIQUE, + INFORMATION_SCHEMA.STATISTICS.SEQ_IN_INDEX, + INFORMATION_SCHEMA.STATISTICS.NULLABLE + FROM INFORMATION_SCHEMA.COLUMNS + LEFT JOIN INFORMATION_SCHEMA.STATISTICS ON INFORMATION_SCHEMA.COLUMNS.TABLE_NAME=INFORMATION_SCHEMA.STATISTICS.TABLE_NAME AND INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME=INFORMATION_SCHEMA.STATISTICS.COLUMN_NAME + WHERE INFORMATION_SCHEMA.COLUMNS.TABLE_SCHEMA = ''; ``` ```sql -SELECT enum_name, - enum_values, - table_name, - column_name, - column_default, - ordinal_position, - data_type, - udt_name, - is_nullable, - character_maximum_length, - indexname, - REPLACE(Substring(indexdef FROM '\((.*)\)'), '"', '') AS index_columns -FROM information_schema.columns - LEFT JOIN pg_indexes - ON information_schema.columns.table_name = pg_indexes.tablename - AND information_schema.columns.column_name = any ( - String_to_array( - REPLACE(Substring - (indexdef FROM '\((.*)\)'), '"', ''), ', ') ) - LEFT JOIN (SELECT t.typname AS enum_name, - Array_agg(e.enumlabel) AS enum_values - FROM pg_type t - JOIN pg_enum e - ON t.oid = e.enumtypid - JOIN pg_catalog.pg_namespace n - ON n.oid = t.typnamespace - WHERE n.nspname = 'public' - GROUP BY enum_name) enums - ON enums.enum_name = information_schema.columns.udt_name -WHERE table_schema = 'public' - AND table_catalog = '' +SELECT + enum_name, + enum_values, + table_name, + column_name, + column_default, + ordinal_position, + data_type, + udt_name, + is_nullable, + character_maximum_length, + indexname, + REPLACE(SUBSTRING(indexdef from '\((.*)\)'), '"', '') as index_columns + FROM INFORMATION_SCHEMA.COLUMNS + LEFT JOIN pg_indexes + ON + INFORMATION_SCHEMA.COLUMNS.table_name = pg_indexes.tablename + AND INFORMATION_SCHEMA.COLUMNS.column_name = ANY(STRING_TO_ARRAY(REPLACE(SUBSTRING(indexdef from '\((.*)\)'), '"', ''), ', ')) + LEFT JOIN ( + SELECT + t.typname AS enum_name, + ARRAY_AGG(e.enumlabel) as enum_values + FROM pg_type t JOIN + pg_enum e ON t.oid = e.enumtypid JOIN + pg_catalog.pg_namespace n ON n.oid = t.typnamespace + WHERE n.nspname = 'public' + GROUP BY enum_name + ) enums + ON enums.enum_name = INFORMATION_SCHEMA.COLUMNS.udt_name + WHERE table_schema = 'public' AND TABLE_CATALOG = ''; ``` From 8f2e19a6534738d68a1bd8b7099ccc2ba069aaf0 Mon Sep 17 00:00:00 2001 From: Chris Bonifacio Date: Fri, 24 Nov 2023 16:44:12 -0500 Subject: [PATCH 22/30] refactor to CDK only workflow --- public/images/storing-db-creds-in-ssm.png | Bin 0 -> 332721 bytes .../index.mdx | 782 +++++++++--------- 2 files changed, 381 insertions(+), 401 deletions(-) create mode 100644 public/images/storing-db-creds-in-ssm.png diff --git a/public/images/storing-db-creds-in-ssm.png b/public/images/storing-db-creds-in-ssm.png new file mode 100644 index 0000000000000000000000000000000000000000..68405237eefe3de076346162a0de3d19790e169a GIT binary patch literal 332721 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

0{?i);lpO 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%0AILYBvol^UWJQ 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%0AL>eU6|2L%WhYN071 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%0Dq?ro9N|M5Go}!xI7@B6! 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 + **NOTE:** This feature and workflow is currently only supported with the AWS + CDK. + + - + Pre-requisites: - Have an existing MySQL or PostgreSQL database deployed -- The [Amplify CLI is installed and configured](/cli/start/install/) -- Have an Amplify [project already initialized](/cli/start/workflows/#initialize-new-project) - -Amplify CLI supports connecting to any existing MySQL or PostgreSQL database. +- The [AWS CDK CLI is installed](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_install) +- Have an [AWS CDK application initialized](https://docs.aws.amazon.com/cdk/v2/guide/hello_world.html) - +First, place your database connection information (hostname, username, password, port, and database name) into Systems Manager, each as a `SecureString`. -If your database exists within a VPC, the RDS instance must be configured to be `Publicly accessible`. This does not mean the instance needs to accessible from the internet. +Go to the Systems Manager console, navigate to Parameter Store, and click "Create Parameter". Create five different SecureStrings: one each for the hostname of your database server, the username and password to connect, the database port, and the database name. -When importing a database schema, the Amplify CLI will automatically discover that the RDS instance is in a VPC and install a Lambda function into that VPC, subnets, and security groups. +Your Systems Manager configuration should look something like this: -The target security group(s) must have two inbound rules set up: +![Storing Database Credentials in SSM](/images/storing-db-creds-in-ssm.png) -- A rule allowing traffic on port 443 from the security group. +Install the following package to add the Amplify GraphQL API construct to your dependencies: -- An inbound rule allowing traffic on the database port from the security group. (Default: 3306 for MySQL. 5432 for PostgreSQL.) +```sh +npm install @aws-amplify/graphql-api-construct +``` - - **NOTE:** Make sure to limit the type of inbound traffic your security group - allows according to your security needs and/or use cases. For information on - security group rules, please refer to the Amazon EC2 documentation: - https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules-reference.html?icmpid=docs_ec2_console - +Create a new `schema.graphql` file within your CDK app’s `lib/` folder that includes the APIs you want to expose. Define your GraphQL object types, queries, and mutations to match the APIs you wish to expose. For example, define object types for database tables, queries to fetch data from those tables, and mutations to modify those tables. - +```graphql +type Blog @refersTo(name: "blogs") { + id: Int! + title: String! +} -First, set up your GraphQL API by running: +type Query { + listBlogs(contains: String!): [Blog] + @sql( + statement: "SELECT * FROM blogs WHERE title LIKE CONCAT('%', :contains, '%');" + ) + @auth(rules: [{ allow: public }]) +} -```sh -amplify import api +type Mutation { + createBlog(title: String!): AWSJSON + @sql(statement: "INSERT INTO blogs (title) VALUES (:title);") + @auth(rules: [{ allow: public }]) +} ``` -Answer the prompts with your database connection details: +You can use the `:variable` notation to reference input variables from the query request. -```console -? Here is the GraphQL API that we will create. Select a setting to edit or continue: - > Continue -? Select the database type: - > MySQL // or PostgreSQL -Please provide the following database connection information: -? Enter the database url or host name: - > -? Enter the port number: - > 3306 -? Enter the username: - > -? Enter the password: - > -? Enter the database name: - > -``` - -Upon successfully connecting, the Amplify CLI will fetch the database schema and import it by generating an Amplify GraphQL schema from it into `/amplify/backend/api//schema.sql.graphql`. + +Amplify’s GraphQL API operates on a deny-by-default basis. The `{ allow: public }` auth rule in the example schema above designates that anyone using an API Key is authorized to execute the query. - - **NOTE:** Only tables that have a primary key will be imported into the - generated schema. - +Review [Authorization rules](/[platform]/build-a-backend/graphqlapi/customize-authorization-rules/) to limit access to these queries and mutations based on API Key, Amazon Cognito User Pool, OpenID Connect, AWS Identity and Access Management (IAM), or a custom Lambda function. - + -If you need to update the credentials used to connect to the database, run the following command: +Next, open the main stack file in your CDK project (usually located in `lib/-stack.ts`). Import the necessary constructs at the top of the file: -```sh -amplify api update-secrets +```ts +import { + AmplifyGraphqlApi, + AmplifyGraphqlDefinition +} from '@aws-amplify/graphql-api-construct'; ``` -This will prompt you to re-enter the database connection details. Once completed, the Amplify CLI will store the updated values in the SSM parameters that the SQL Lambda retrieves to connect to the SQL database. - -Test the connection by running: +In the main stack class, add the following code to define a new GraphQL API. Replace `stack` with the name of your stack instance: -```sh -amplify api generate-schema +```ts +new AmplifyGraphqlApi(stack, 'SqlBoundApi', { + apiName: 'MySqlBoundApi', + definition: AmplifyGraphqlDefinition.fromFilesAndStrategy( + [path.join(__dirname, 'schema.graphql')], + { + name: 'MyBlogSiteDatabase', + dbType: 'MYSQL', + vpcConfiguration: { + vpcId: 'vpc-123456', + securityGroupIds: ['sg-123', 'sg-456'], + subnetAvailabilityZoneConfig: [ + { subnetId: 'sn-123456', availabilityZone: 'us-east-1a' }, + { subnetId: 'sn-987654', availabilityZone: 'us-east-1b' } + ] + }, + dbConnectionConfig: { + hostnameSsmPath: + '/path/to/ssm/SecureString/containing/value/of/hostname', + portSsmPath: '/path/to/ssm/SecureString/containing/value/of/port', + usernameSsmPath: + '/path/to/ssm/SecureString/containing/value/of/username', + passwordSsmPath: + '/path/to/ssm/SecureString/containing/value/of/password', + databaseNameSsmPath: + '/path/to/ssm/SecureString/containing/value/of/databaseName' + } + } + ), + authorizationModes: { + apiKeyConfig: { expires: cdk.Duration.days(7) } + }, + translationBehavior: { + sandboxModeEnabled: true + } +}); ``` -The Amplify CLI will attempt to fetch the database schema and regenerate the GraphQL schema in `/amplify/backend/api//schema.sql.graphql`. +The API will have an API key enabled for authorization. Sandbox mode is enabled for testing. - +Before deploying, make sure to: - +- Set a value for `name`. This will be used to name the AppSync DataSource itself, plus any associated resources like resolver Lambdas. This name must be unique across all schema definitions in a GraphQL API. - +- Change the `dbType` to match your database engine. This is the type of the SQL database used to process model operations for this definition.Supported engines are `"MYSQL"`, `"POSTGRES"`, or `"DYNAMODB"`. -Pre-requisites: +- Update the SSM parameter paths within `dbConnectionConfig` to point to those existing in your AWS account. These are the parameters the SQL Lambda will use to connect to the database. -- Have an existing MySQL or PostgreSQL database deployed -- The [AWS CDK CLI is installed](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_install) -- Have an [AWS CDK application initialized](https://docs.aws.amazon.com/cdk/v2/guide/hello_world.html) +- If your database instance exists within a VPC, update the `vpcConfiguration` properties - `vpcId`, `securityGroupIds`, and `subnetAvailabilityZoneConfig` with your vpc details. This is the configuration of the VPC into which to install the SQL Lambda. @@ -145,173 +170,218 @@ The target security group(s) must have two inbound rules set up: security group rules, please refer to the Amazon EC2 documentation: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules-reference.html?icmpid=docs_ec2_console + + + + + + + +Consider adding an RDS Proxy in front of the cluster to manage database connections. + +When using AWS AppSync with a relational database like Amazon RDS, each query from your application needs to open a separate connection to the database. + +If there are a large number of queries occurring concurrently, it can exceed the connection limit on the database and result in errors like "Too many connections". To avoid this, the Amplify CLI can use an RDS Proxy when connecting your AppSync API to a database. + +The RDS Proxy acts as an intermediary sitting in front of your database. Instead of each application query opening a direct connection to the database, they will connect through the Proxy. The Proxy helps manage and pool these connections to avoid overwhelming your database cluster. This improves the availability of your API, allowing more queries to execute concurrently without hitting connection limits. + +However, there is a tradeoff of increased latency - queries may take slightly longer as they wait for an available connection from the Proxy pool. There are also additional costs associated with using RDS Proxy. Please refer to the [pricing page for RDS Proxy](https://aws.amazon.com/rds/proxy/pricing/) to learn more. -First, install required packages: +## Create custom queries and mutations -```sh -npm install @aws-amplify/graphql-api-construct -``` +Amplify GraphQL API for SQL databases introduces the `@sql` directive, which allows you to define SQL statements in custom GraphQL queries and mutations. This provides more flexibility when the default, auto-generated GraphQL queries and mutations are not sufficient. -Open the main stack file in your CDK project (usually located in `lib/-stack.ts`). Import the necessary constructs at the top of the file: +There are two ways to specify the SQL statement - inline or by referencing a `.sql` file. -```ts -import { - AmplifyGraphqlApi, - AmplifyGraphqlDefinition -} from '@aws-amplify/graphql-api-construct'; -``` +### Inline SQL Statement -Create a `blogs` table in your database: +You can embed the SQL statement directly in the schema using the `statement` argument. -```sql -CREATE TABLE blogs ( - id varchar(255) NOT NULL PRIMARY KEY, - title varchar(255) NOT NULL, -); +The SQL statement can use parameters in the format `:variable`, which will be bound to the input variables passed when executing a custom GraphQL query or mutation. + +In the example below, a SQL statement is defined, accepting a `searchTerm` input variable. + +```graphql +type Query { + searchPosts(searchTerm: String): [Post] + @sql(statement: "SELECT * FROM posts WHERE title LIKE :searchTerm;") +} ``` -Execute the following SQL statement on your database using a MySQL, PostgreSQL Client or CLI tool similar to `psql` and export the output to a CSV file: +{/* TODO: Add a NOTE: about proxy/connection pinning here. */} - - **NOTE:** Make sure to include column headers when exporting the output to a - CSV file. - +### SQL File Reference -Replace `` with the name of your database/schema. +For longer, more complex SQL queries, you can specify the statement in separate `.sql` files rather than inline. Referencing a file keeps your schema clean and allows reuse of SQL statements across fields. - + + +First, create a new `lib/sql-statements` folder and add any SQL queries or statements to custom `.sql` files within that folder. + +For example, you could create several files: + ```sql -SELECT - INFORMATION_SCHEMA.COLUMNS.TABLE_NAME, - INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME, - INFORMATION_SCHEMA.COLUMNS.COLUMN_DEFAULT, - INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION, - INFORMATION_SCHEMA.COLUMNS.DATA_TYPE, - INFORMATION_SCHEMA.COLUMNS.COLUMN_TYPE, - INFORMATION_SCHEMA.COLUMNS.IS_NULLABLE, - INFORMATION_SCHEMA.COLUMNS.CHARACTER_MAXIMUM_LENGTH, - INFORMATION_SCHEMA.STATISTICS.INDEX_NAME, - INFORMATION_SCHEMA.STATISTICS.NON_UNIQUE, - INFORMATION_SCHEMA.STATISTICS.SEQ_IN_INDEX, - INFORMATION_SCHEMA.STATISTICS.NULLABLE - FROM INFORMATION_SCHEMA.COLUMNS - LEFT JOIN INFORMATION_SCHEMA.STATISTICS ON INFORMATION_SCHEMA.COLUMNS.TABLE_NAME=INFORMATION_SCHEMA.STATISTICS.TABLE_NAME AND INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME=INFORMATION_SCHEMA.STATISTICS.COLUMN_NAME - WHERE INFORMATION_SCHEMA.COLUMNS.TABLE_SCHEMA = ''; +-- getBlogById.sql +SELECT * FROM blogs WHERE id = :id; ``` - - + ```sql -SELECT - enum_name, - enum_values, - table_name, - column_name, - column_default, - ordinal_position, - data_type, - udt_name, - is_nullable, - character_maximum_length, - indexname, - REPLACE(SUBSTRING(indexdef from '\((.*)\)'), '"', '') as index_columns - FROM INFORMATION_SCHEMA.COLUMNS - LEFT JOIN pg_indexes - ON - INFORMATION_SCHEMA.COLUMNS.table_name = pg_indexes.tablename - AND INFORMATION_SCHEMA.COLUMNS.column_name = ANY(STRING_TO_ARRAY(REPLACE(SUBSTRING(indexdef from '\((.*)\)'), '"', ''), ', ')) - LEFT JOIN ( - SELECT - t.typname AS enum_name, - ARRAY_AGG(e.enumlabel) as enum_values - FROM pg_type t JOIN - pg_enum e ON t.oid = e.enumtypid JOIN - pg_catalog.pg_namespace n ON n.oid = t.typnamespace - WHERE n.nspname = 'public' - GROUP BY enum_name - ) enums - ON enums.enum_name = INFORMATION_SCHEMA.COLUMNS.udt_name - WHERE table_schema = 'public' AND TABLE_CATALOG = ''; +-- getPublishedPostsByRange.sql +SELECT p.id, p.title, p.content, p.published_date +FROM posts p +WHERE p.published = 1 + AND p.published_date > :startDate + AND p.published_date < :endDate +ORDER BY p.published_date DESC +LIMIT 10 ``` - - -Generate an Amplify GraphQL API schema by running the following command, replacing the `--sql-schema` value with the path to the CSV file created in the previous step: +Then you can import the `SQLLambdaModelDataSourceStrategyFactory` which helps define the datasource strategy from the custom `.sql` files you've created. -```sh -npx @aws-amplify/cli api generate-schema --sql-schema --engine-type mysql --out schema.sql.graphql +```js +import { SQLLambdaModelDataSourceStrategyFactory } from '@aws-amplify/graphql-api-construct'; ``` -In the main stack class, add the following code to define a new GraphQL API. Replace `stack` with the name of your stack instance and update the path to the `schema.sql.graphql` file generated in the previous step: +In your `lib/-stack.ts` file, read from the `sql-statements/` folder and add them as custom SQL statements to your Amplify GraphQL API: -```ts -new AmplifyGraphqlApi(stack, 'SqlBoundApi', { - apiName: 'MySqlBoundApi', - definition: AmplifyGraphqlDefinition.fromFilesAndStrategy( - [path.join(__dirname, 'schema.sql.graphql')], - { - name: 'MyBlogSiteDatabase', - dbType: 'MYSQL', - vpcConfiguration: { - vpcId: 'vpc-123456', - securityGroupIds: ['sg-123', 'sg-456'], - subnetAvailabilityZoneConfig: [ - { subnetId: 'sn-123456', availabilityZone: 'us-east-1a' }, - { subnetId: 'sn-987654', availabilityZone: 'us-east-1b' } - ] - }, - dbConnectionConfig: { - hostnameSsmPath: - '/path/to/ssm/SecretString/containing/value/of/hostname', - portSsmPath: '/path/to/ssm/SecretString/containing/value/of/port', - usernameSsmPath: - '/path/to/ssm/SecretString/containing/value/of/username', - passwordSsmPath: - '/path/to/ssm/SecretString/containing/value/of/password', - databaseNameSsmPath: - '/path/to/ssm/SecretString/containing/value/of/databaseName' - } +```js +// Define custom SQL statements folder path +const sqlStatementsPath = path.join(__dirname, 'sql-statements'); + +// Use the Factory to define the SQL data source strategy +const sqlStrategy = SQLLambdaModelDataSourceStrategyFactory.fromCustomSqlFiles( + // File paths to all SQL statements + fs + .readdirSync(sqlStatementsPath) + .map((file) => path.join(sqlStatementsPath, file)), + // Move your connection information and VPC config into here + { + dbType: 'MYSQL', + name: 'MySQLSchemaDefinition', + dbConnectionConfig: { + //... + }, + vpcConfiguration: { + //... } + } +); + +const amplifyApi = new AmplifyGraphqlApi(this, 'AmplifyApi', { + definition: AmplifyGraphqlDefinition.fromFilesAndStrategy( + path.join(__dirname, 'schema.graphql'), + sqlStrategy ), authorizationModes: { - apiKeyConfig: { expires: cdk.Duration.days(7) } - }, - translationBehavior: { - sandboxModeEnabled: true + defaultAuthorizationMode: 'API_KEY', + apiKeyConfig: { + expires: cdk.Duration.days(30) + } } }); ``` -The API will have an API key enabled for authorization. Sandbox mode is enabled for testing. +The SQL statements defined in the `.sql` files will be executed as if they were defined inline in the schema. The same rules apply in terms of using parameters, ensuring valid SQL syntax, and matching the return type to row data. -Before deploying, make sure to: + -- Set a value for `name`. This will be used to name the AppSync DataSource itself, plus any associated resources like resolver Lambdas. This name must be unique across all schema definitions in a GraphQL API. + -- Change the `dbType` to match your database engine. This is the type of the SQL database used to process model operations for this definition.Supported engines are `"MYSQL"`, `"POSTGRES"`, or `"DYNAMODB"`. +### Custom Query -- Update the `vpcId`, `securityGroupIds`, and `subnetAvailabilityZoneConfig` with your vpc details. This is the configuration of the VPC into which to install the SQL Lambda. +```graphql +type Query { + searchPostsByTitle(title: String): [Post] + @sql( + statement: "SELECT * FROM Post WHERE title LIKE CONCAT('%', :title, '%');" + ) +} +``` -- Update the SSM parameter paths within `dbConnectionConfig` to point to those existing in your AWS account. These are the parameters the SQL Lambda will use to connect to the database. +### Custom Mutation - - +```graphql +type Mutation { + publishPostById(id: ID!): AWSJSON + @sql(statement: "UPDATE posts SET published = :published WHERE id = :id;") +} +``` - +### Returning row data from custom mutations -Consider adding an RDS Proxy in front of the cluster to manage database connections. +SQL statements such as `INSERT`, `UPDATE` and `DELETE` return the number of rows affected. -When using AWS AppSync with a relational database like Amazon RDS, each query from your application needs to open a separate connection to the database. +If you want to return the result of the SQL statement, you can use `AWSJSON` as the return type. -If there are a large number of queries occurring concurrently, it can exceed the connection limit on the database and result in errors like "Too many connections". To avoid this, the Amplify CLI can use an RDS Proxy when connecting your AppSync API to a database. +```graphql +type Mutation { + publishPosts: AWSJSON @sql(statement: "UPDATE Post SET published = 1;") +} +``` -The RDS Proxy acts as an intermediary sitting in front of your database. Instead of each application query opening a direct connection to the database, they will connect through the Proxy. The Proxy helps manage and pool these connections to avoid overwhelming your database cluster. This improves the availability of your API, allowing more queries to execute concurrently without hitting connection limits. +This will return a JSON response similar to this: -However, there is a tradeoff of increased latency - queries may take slightly longer as they wait for an available connection from the Proxy pool. There are also additional costs associated with using RDS Proxy. Please refer to the [pricing page for RDS Proxy](https://aws.amazon.com/rds/proxy/pricing/) to learn more. +```json +{ + "data": { + "publishPosts": "{\"fieldCount\":0,\"affectedRows\":7,\"insertId\":0,\"info\":\"Rows matched: 7 Changed: 7 Warnings: 0\",\"serverStatus\":34,\"warningStatus\":0,\"changedRows\":7}" + } +} +``` - +However, you might want to return the actual row data instead. + + + + +In MySQL, you can create and call a stored procedure that performs both an UPDATE statement and SELECT query to return a single post. + +Create a stored procedure: + +```sql +CREATE PROCEDURE publish_post (IN postId VARCHAR(255)) + +BEGIN +UPDATE posts SET published = 1 WHERE id = postId; + +SELECT * FROM posts WHERE id = postId LIMIT 1; +END +``` + +Call the stored procedure from the custom mutation: + +```graphql +type Mutation { + publishPostById(id: String!): [Post] + @sql(statement: "CALL publish_post(:id);") +} +``` + + + **NOTE:** Unlike the Amplify CLI-generated mutations that return a single + item, the return type for custom queries and mutations expecting row data must + be an array of the corresponding model. + + + + + +In PostgreSQL, you can add a `RETURNING` clause to an `INSERT`, `UPDATE`, or `DELETE` statement and get the actual modified row data. + +Example: + +```graphql +type Mutation { + publishPostById(id: String!): [Post] + @sql(statement: "UPDATE posts SET price = :id RETURNING *;") +} +``` + + + ## Apply authorization rules on the models @@ -339,23 +409,6 @@ For more information on each rule please refer to our documentation on [Authoriz ## Deploy your API - -To deploy the API, you can use the `amplify push` command: - -```sh -amplify push -``` - -```console -? Are you sure you want to continue? Y -? Do you want to generate code for your newly created GraphQL API? Y -? Choose the code generation language target: javascript (or your preferred language target) -? Enter the file name pattern of graphql queries, mutations and subscriptions src/graphql/**/*.js -? Do you want to generate/update all possible GraphQL operations - queries, mutations and subscriptions? Y -? Enter maximum statement depth [increase from default if your schema is deeply nested]: 2 -``` - - To deploy the API, you can use the `cdk deploy` command: @@ -412,60 +465,28 @@ Unlike MySQL, PostgreSQL does support date time or timestamp values with an offs | numeric | Float | | **Date and Time** | | | date | AWSDate | -| datetime | AWSDateTime | -| timestamp | AWSDateTime | -| time | AWSTime | -| year | Int | -| **Binary** | | -| binary | String | -| varbinary | String | -| tinyblob | String | -| blob | String | -| mediumblob | String | -| longblob | String | -| **Others** | | -| bool | Boolean | -| boolean | Boolean | -| bit | Int | -| json | AWSJSON | -| enum | ENUM | - - - - - - -1. Make any adjustments to your SQL statements such as: - -```sql -CREATE TABLE posts ( - id varchar(255) NOT NULL PRIMARY KEY, - title varchar(255) NOT NULL, - content varchar(255) NOT NULL, - published tinyint(1) DEFAULT 0 NOT NULL - published_date date NULL -); -``` - -2. Generate an updated schema: - -```sh -amplify api generate-schema -``` - - - **NOTE:** If the connection to the database fails, the CLI will prompt you to - retry using a VPC endpoint. - - -3. Deploy your changes to the cloud: +| datetime | AWSDateTime | +| timestamp | AWSDateTime | +| time | AWSTime | +| year | Int | +| **Binary** | | +| binary | String | +| varbinary | String | +| tinyblob | String | +| blob | String | +| mediumblob | String | +| longblob | String | +| **Others** | | +| bool | Boolean | +| boolean | Boolean | +| bit | Int | +| json | AWSJSON | +| enum | ENUM | -```sh -amplify push -y -``` + - - + + 1. Make any adjustments to your SQL statements such as: ```sql @@ -590,150 +611,6 @@ type Post @refersTo(name: "posts") @model { } ``` -## Create custom queries and mutations - -Amplify GraphQL API for SQL databases introduces the `@sql` directive, which allows you to define SQL statements in custom GraphQL queries and mutations. This provides more flexibility when the default, auto-generated GraphQL queries and mutations are not sufficient. - -There are two ways to specify the SQL statement - inline or by referencing a `.sql` file. - -**Inline SQL Statement** - -You can embed the SQL statement directly in the schema using the `statement` argument. - -The SQL statement can use parameters in the format `:variable`, which will be bound to the input variables passed when executing a custom GraphQL query or mutation. - -In the example below, a SQL statement is defined, accepting a `searchTerm` input variable. - -```graphql -type Query { - searchPosts(searchTerm: String): [Post] - @sql(statement: "SELECT * FROM posts WHERE title LIKE :searchTerm;") -} -``` - -{/* TODO: Add a NOTE: about proxy/connection pinning here. */} - -**SQL File Reference** - -For longer, more complex SQL queries, you can specify the statement in a separate `.sql` file rather than inline. Referencing a file keeps your schema clean and allows reuse of SQL statements across fields. - -The reference value must match the name of a `.sql` file located in the `amplify/backend/api//sql-statements` folder. - -In the example below, a `getPublishedPostsByDateRange.sql` file containing a SQL statement is being referenced. - -```sql --- getPublishedPostsByRange.sql -SELECT p.id, p.title, p.content, p.published_date -FROM posts p -WHERE p.published = 1 - AND p.published_date > :startDate - AND p.published_date < :endDate -ORDER BY p.published_date DESC -LIMIT 10 -``` - -```graphql -type Query { - getPublishedPostsByDateRange(startDate: AWSDate, endDate: AWSDate): [Post] - @sql(reference: "getPublishedPostsByDateRange") -} -``` - -The SQL statement will be executed as if it were defined inline in the schema. The same rules apply in terms of using parameters, ensuring valid SQL syntax, and matching the return type to row data. - -### Custom Query - -```graphql -type Query { - searchPostsByTitle(title: String): [Post] - @sql( - statement: "SELECT * FROM Post WHERE title LIKE CONCAT('%', :title, '%');" - ) -} -``` - -### Custom Mutation - -```graphql -type Mutation { - publishPostById(id: ID!): AWSJSON - @sql(statement: "UPDATE posts SET published = :published WHERE id = :id;") -} -``` - -### Returning row data from custom mutations - -SQL statements such as `INSERT`, `UPDATE` and `DELETE` return the number of rows affected. - -If you want to return the result of the SQL statement, you can use `AWSJSON` as the return type. - -```graphql -type Mutation { - publishPosts: AWSJSON @sql(statement: "UPDATE Post SET published = 1;") -} -``` - -This will return a JSON response similar to this: - -```json -{ - "data": { - "publishPosts": "{\"fieldCount\":0,\"affectedRows\":7,\"insertId\":0,\"info\":\"Rows matched: 7 Changed: 7 Warnings: 0\",\"serverStatus\":34,\"warningStatus\":0,\"changedRows\":7}" - } -} -``` - -However, you might want to return the actual row data instead. - - - - -In MySQL, you can create and call a stored procedure that performs both an UPDATE statement and SELECT query to return a single post. - -Create a stored procedure: - -```sql -CREATE PROCEDURE publish_post (IN postId VARCHAR(255)) - -BEGIN -UPDATE posts SET published = 1 WHERE id = postId; - -SELECT * FROM posts WHERE id = postId LIMIT 1; -END -``` - -Call the stored procedure from the custom mutation: - -```graphql -type Mutation { - publishPostById(id: String!): [Post] - @sql(statement: "CALL publish_post(:id);") -} -``` - - - **NOTE:** Unlike the Amplify CLI-generated mutations that return a single - item, the return type for custom queries and mutations expecting row data must - be an array of the corresponding model. - - - - - -In PostgreSQL, you can add a `RETURNING` clause to an `INSERT`, `UPDATE`, or `DELETE` statement and get the actual modified row data. - -Example: - -```graphql -type Mutation { - publishPostById(id: String!): [Post] - @sql(statement: "UPDATE posts SET price = :id RETURNING *;") -} -``` - - - - ## Create relationships between models You can use the `@hasOne`, `@hasMany`, and `@belongsTo` relational directives to create relationships between models. The field named in the `references` parameter of the relational directives must exist on the child model. @@ -792,6 +669,109 @@ type Post @model { } ``` +## Auto-generate CRUDL operations for existing tables + + + **NOTE:** This feature is experimental and is subject to change. + + +You can use the Amplify CLI to generate common CRUDL operations for your database schema, saving time from having to author them by hand. + +Create a `blogs` table in your database: + +```sql +CREATE TABLE blogs ( + id varchar(255) NOT NULL PRIMARY KEY, + title varchar(255) NOT NULL, +); +``` + +Execute the following SQL statement on your database using a MySQL, PostgreSQL Client or CLI tool similar to `psql` and export the output to a CSV file: + + + **NOTE:** Make sure to include column headers when exporting the output to a + CSV file. + + +Replace `` with the name of your database/schema. + + + +```sql +SELECT + INFORMATION_SCHEMA.COLUMNS.TABLE_NAME, + INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME, + INFORMATION_SCHEMA.COLUMNS.COLUMN_DEFAULT, + INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION, + INFORMATION_SCHEMA.COLUMNS.DATA_TYPE, + INFORMATION_SCHEMA.COLUMNS.COLUMN_TYPE, + INFORMATION_SCHEMA.COLUMNS.IS_NULLABLE, + INFORMATION_SCHEMA.COLUMNS.CHARACTER_MAXIMUM_LENGTH, + INFORMATION_SCHEMA.STATISTICS.INDEX_NAME, + INFORMATION_SCHEMA.STATISTICS.NON_UNIQUE, + INFORMATION_SCHEMA.STATISTICS.SEQ_IN_INDEX, + INFORMATION_SCHEMA.STATISTICS.NULLABLE + FROM INFORMATION_SCHEMA.COLUMNS + LEFT JOIN INFORMATION_SCHEMA.STATISTICS ON INFORMATION_SCHEMA.COLUMNS.TABLE_NAME=INFORMATION_SCHEMA.STATISTICS.TABLE_NAME AND INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME=INFORMATION_SCHEMA.STATISTICS.COLUMN_NAME + WHERE INFORMATION_SCHEMA.COLUMNS.TABLE_SCHEMA = ''; +``` + + +```sql +SELECT + enum_name, + enum_values, + table_name, + column_name, + column_default, + ordinal_position, + data_type, + udt_name, + is_nullable, + character_maximum_length, + indexname, + REPLACE(SUBSTRING(indexdef from '\((.*)\)'), '"', '') as index_columns + FROM INFORMATION_SCHEMA.COLUMNS + LEFT JOIN pg_indexes + ON + INFORMATION_SCHEMA.COLUMNS.table_name = pg_indexes.tablename + AND INFORMATION_SCHEMA.COLUMNS.column_name = ANY(STRING_TO_ARRAY(REPLACE(SUBSTRING(indexdef from '\((.*)\)'), '"', ''), ', ')) + LEFT JOIN ( + SELECT + t.typname AS enum_name, + ARRAY_AGG(e.enumlabel) as enum_values + FROM pg_type t JOIN + pg_enum e ON t.oid = e.enumtypid JOIN + pg_catalog.pg_namespace n ON n.oid = t.typnamespace + WHERE n.nspname = 'public' + GROUP BY enum_name + ) enums + ON enums.enum_name = INFORMATION_SCHEMA.COLUMNS.udt_name + WHERE table_schema = 'public' AND TABLE_CATALOG = ''; +``` + + + +Generate an Amplify GraphQL API schema by running the following command, replacing the `--sql-schema` value with the path to the CSV file created in the previous step: + +```sh +npx @aws-amplify/cli api generate-schema --sql-schema --engine-type mysql --out schema.sql.graphql +``` + +Finally, update the first argument of `AmplifyGraphqlDefinition.fromFilesAndStrategy` to include the `schema.sql.graphql` file generated in the previous step: + +```ts +new AmplifyGraphqlApi(stack, 'SqlBoundApi', { + apiName: 'MySqlBoundApi', + definition: AmplifyGraphqlDefinition.fromFilesAndStrategy( + [path.join(__dirname, 'schema.sql.graphql')], // file path + { + // ...strategy options + } + ) +}); +``` + ## How does it work? The Amplify CLI uses AWS Lambda functions to enable features like querying data from your database. To work properly, these Lambda functions need access to common logic and dependencies. @@ -825,7 +805,7 @@ This allows the Amplify team to maintain and enhance the SQL Layer without needi ### Debug Mode -To return the actual SQL error instead of a generic error from AppSync responses, an environment variable `DEBUG_MODE` can be set to `true` on the Amplify CLI-generated `RDSLambdaLogicalID` lambda function. +To return the actual SQL error instead of a generic error from AppSync responses, an environment variable `DEBUG_MODE` can be set to `true` on the Amplify CLI-generated SQL Lambda function. ## Conclusion From 5e22369138e9662f18cd5b2c81bcfb6306c393dd Mon Sep 17 00:00:00 2001 From: Chris Bonifacio Date: Fri, 24 Nov 2023 16:49:00 -0500 Subject: [PATCH 23/30] Add experimental note to iterative change section --- .../index.mdx | 156 +++++++++--------- 1 file changed, 80 insertions(+), 76 deletions(-) diff --git a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx index 3a7c0ca5c5a..02f90b54f53 100644 --- a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx +++ b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx @@ -423,8 +423,88 @@ Now the API has been deployed and you can start using it! You can start querying from the AWS AppSync console or integrate it into your application using the AWS Amplify libraries! +### Rename & map models to tables + +To rename models and fields, you can use the `@refersTo` directive to map the models in the GraphQL schema to the corresponding table or field by name. + +By default, the Amplify CLI singularizes each model name using PascalCase and field names that are either snake_case or kebab-case will be converted to camelCase. + +In the example below, the Post model in the GraphQL schema is now mapped to the posts table in the database schema. Also, the isPublished is now mapped to the published column on the posts table. + +```graphql +type Post @refersTo(name: "posts") @model { + id: String! @primaryKey + title: String! + content: String! + isPublished: Boolean @refersTo(name: "is-published") + publishedDate: AWSDate @refersTo(name: "published_date") +} +``` + +## Create relationships between models + +You can use the `@hasOne`, `@hasMany`, and `@belongsTo` relational directives to create relationships between models. The field named in the `references` parameter of the relational directives must exist on the child model. + +### Has One relationship + +Create a one-directional one-to-one relationship between two models using the `@hasOne` directive. + +In the example below, a User has a single Profile. + +```graphql +type User + @refersTo(name: "users") + @model + @auth(rules: [{ allow: owner }, { allow: groups, groups: ["Admin"] }]) { + id: String! @primaryKey + name: String! + owner: String + profile: Profile @hasOne(references: ["userId"]) +} +``` + +### Has Many relationship + +Create a one-directional one-to-many relationship between two models using the `@hasMany` directive. + +In the example below, a Blog has many Posts. + +```graphql +type Blog @model { + id: String! @primaryKey + title: String! + posts: [Post] @hasMany(references: ["blogId"]) +} + +type Post @model { + id: String! @primaryKey + title: String! + content: String! +} +``` + +### Belongs To relationship + +Make a "has one" or "has many" relationship bi-directional with the `@belongsTo` directive. + +In the example below, a Post belongs to a Blog. + +```graphql +type Post @model { + id: String! @primaryKey + title: String! + content: String! + blogId: String! @refersTo(name: "blog_id") + blog: Blog @belongsTo(references: ["blogId"]) +} +``` + ## Apply iterative changes from the database definition + + **NOTE:** This feature is experimental and is subject to change. + + -### Rename & map models to tables - -To rename models and fields, you can use the `@refersTo` directive to map the models in the GraphQL schema to the corresponding table or field by name. - -By default, the Amplify CLI singularizes each model name using PascalCase and field names that are either snake_case or kebab-case will be converted to camelCase. - -In the example below, the Post model in the GraphQL schema is now mapped to the posts table in the database schema. Also, the isPublished is now mapped to the published column on the posts table. - -```graphql -type Post @refersTo(name: "posts") @model { - id: String! @primaryKey - title: String! - content: String! - isPublished: Boolean @refersTo(name: "is-published") - publishedDate: AWSDate @refersTo(name: "published_date") -} -``` - -## Create relationships between models - -You can use the `@hasOne`, `@hasMany`, and `@belongsTo` relational directives to create relationships between models. The field named in the `references` parameter of the relational directives must exist on the child model. - -### Has One relationship - -Create a one-directional one-to-one relationship between two models using the `@hasOne` directive. - -In the example below, a User has a single Profile. - -```graphql -type User - @refersTo(name: "users") - @model - @auth(rules: [{ allow: owner }, { allow: groups, groups: ["Admin"] }]) { - id: String! @primaryKey - name: String! - owner: String - profile: Profile @hasOne(references: ["userId"]) -} -``` - -### Has Many relationship - -Create a one-directional one-to-many relationship between two models using the `@hasMany` directive. - -In the example below, a Blog has many Posts. - -```graphql -type Blog @model { - id: String! @primaryKey - title: String! - posts: [Post] @hasMany(references: ["blogId"]) -} - -type Post @model { - id: String! @primaryKey - title: String! - content: String! -} -``` - -### Belongs To relationship - -Make a "has one" or "has many" relationship bi-directional with the `@belongsTo` directive. - -In the example below, a Post belongs to a Blog. - -```graphql -type Post @model { - id: String! @primaryKey - title: String! - content: String! - blogId: String! @refersTo(name: "blog_id") - blog: Blog @belongsTo(references: ["blogId"]) -} -``` - ## Auto-generate CRUDL operations for existing tables From ff6e457b1d214fd40e279c8d9413b9400d00e44f Mon Sep 17 00:00:00 2001 From: Rene Brandel Date: Mon, 27 Nov 2023 09:14:32 -0500 Subject: [PATCH 24/30] applied edits for launch --- .../index.mdx | 317 +++++++++--------- 1 file changed, 159 insertions(+), 158 deletions(-) diff --git a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx index 02f90b54f53..2f108d16ead 100644 --- a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx +++ b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx @@ -1,10 +1,10 @@ import { getCustomStaticPath } from '@/utils/getCustomStaticPath'; export const meta = { - title: 'Connect your API to an existing database', + title: 'Connect API to existing MySQL or PostgreSQL database', description: 'Learn how to connect your API to an existing MySQL or PostgreSQL database.', - platforms: ['javascript', 'react-native', 'flutter', 'swift', 'android'] + platforms: ['javascript', 'react', 'nextjs', 'angular', 'vue', 'react-native', 'flutter', 'swift', 'android'] }; @@ -21,27 +21,26 @@ export function getStaticProps(context) { }; } - + + +The following content requires you to deploy the Amplify GraphQL APIs via AWS Cloud Development Kit (CDK). If you have not yet deployed an Amplify GraphQL API with AWS CDK yet, review [Set up GraphQL API](/[platform]/build-a-backend/graphqlapi/set-up-graphql-api). + + + In this section, you'll learn how to: -- Connect to an existing MySQL or PostgreSQL database +- Connect Amplify GraphQL API to an existing MySQL or PostgreSQL database - Execute SQL statements with custom GraphQL queries and mutations using the new `@sql` directive -- Deploy an AWS AppSync GraphQL API. ## Connect your API with an existing MySQL or PostgreSQL database - - **NOTE:** This feature and workflow is currently only supported with the AWS - CDK. - - Pre-requisites: -- Have an existing MySQL or PostgreSQL database deployed +- Have an existing [MySQL database](https://aws.amazon.com/getting-started/hands-on/create-mysql-db/) or [PostgreSQL database](https://aws.amazon.com/getting-started/hands-on/create-connect-postgresql-db/) deployed - The [AWS CDK CLI is installed](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_install) - Have an [AWS CDK application initialized](https://docs.aws.amazon.com/cdk/v2/guide/hello_world.html) @@ -100,7 +99,7 @@ import { } from '@aws-amplify/graphql-api-construct'; ``` -In the main stack class, add the following code to define a new GraphQL API. Replace `stack` with the name of your stack instance: +In the main stack class, add the following code to define a new GraphQL API. Replace `stack` with the name of your stack instance (often referenced via `this`): ```ts new AmplifyGraphqlApi(stack, 'SqlBoundApi', { @@ -133,9 +132,6 @@ new AmplifyGraphqlApi(stack, 'SqlBoundApi', { ), authorizationModes: { apiKeyConfig: { expires: cdk.Duration.days(7) } - }, - translationBehavior: { - sandboxModeEnabled: true } }); ``` @@ -156,7 +152,7 @@ Before deploying, make sure to: If your database exists within a VPC, the RDS instance must be configured to be `Publicly accessible`. This does not mean the instance needs to accessible from the internet. -When importing a database schema, the Amplify CLI will automatically discover that the RDS instance is in a VPC and install a Lambda function into that VPC, subnets, and security groups. +{/* When importing a database schema, the Amplify CLI will automatically discover that the RDS instance is in a VPC and install a Lambda function into that VPC, subnets, and security groups. */} The target security group(s) must have two inbound rules set up: @@ -167,8 +163,7 @@ The target security group(s) must have two inbound rules set up: **NOTE:** Make sure to limit the type of inbound traffic your security group allows according to your security needs and/or use cases. For information on - security group rules, please refer to the Amazon EC2 documentation: - https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules-reference.html?icmpid=docs_ec2_console + security group rules, please refer to the [Amazon EC2 Security Group Rules reference](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules-reference.html?icmpid=docs_ec2_console). @@ -179,9 +174,9 @@ The target security group(s) must have two inbound rules set up: Consider adding an RDS Proxy in front of the cluster to manage database connections. -When using AWS AppSync with a relational database like Amazon RDS, each query from your application needs to open a separate connection to the database. +When using Amplify GraphQL API with a relational database like Amazon RDS, each query from your application needs to open a separate connection to the database. -If there are a large number of queries occurring concurrently, it can exceed the connection limit on the database and result in errors like "Too many connections". To avoid this, the Amplify CLI can use an RDS Proxy when connecting your AppSync API to a database. +If there are a large number of queries occurring concurrently, it can exceed the connection limit on the database and result in errors like "Too many connections". To avoid this, Amplify can use an RDS Proxy when connecting your GraphQL API to a database. The RDS Proxy acts as an intermediary sitting in front of your database. Instead of each application query opening a direct connection to the database, they will connect through the Proxy. The Proxy helps manage and pool these connections to avoid overwhelming your database cluster. This improves the availability of your API, allowing more queries to execute concurrently without hitting connection limits. @@ -197,7 +192,7 @@ There are two ways to specify the SQL statement - inline or by referencing a `.s ### Inline SQL Statement -You can embed the SQL statement directly in the schema using the `statement` argument. +For getting started, you can embed the SQL statement directly in the schema using the `statement` argument. The SQL statement can use parameters in the format `:variable`, which will be bound to the input variables passed when executing a custom GraphQL query or mutation. @@ -219,17 +214,19 @@ For longer, more complex SQL queries, you can specify the statement in separate -First, create a new `lib/sql-statements` folder and add any SQL queries or statements to custom `.sql` files within that folder. - -For example, you could create several files: +First, update your GraphQL schema file to reference a SQL file name without the `.sql` extension: -```sql --- getBlogById.sql -SELECT * FROM blogs WHERE id = :id; +```graphql +type Query { + getPublishedPosts(start: AWSDate, end: AWSDate): [Post] + @sql(reference: "getPublishedPostsByRange") +} ``` +Next, create a new `lib/sql-statements` folder and add any custom queries or mutations as SQL files. For example, you could create different `.sql` files for different queries: + ```sql --- getPublishedPostsByRange.sql +-- lib/sql-statements/getPublishedPostsByRange.sql SELECT p.id, p.title, p.content, p.published_date FROM posts p WHERE p.published = 1 @@ -239,7 +236,12 @@ ORDER BY p.published_date DESC LIMIT 10 ``` -Then you can import the `SQLLambdaModelDataSourceStrategyFactory` which helps define the datasource strategy from the custom `.sql` files you've created. +```sql +-- lib/sql-statements/getBlogById.sql +SELECT * FROM blogs WHERE id = :id; +``` + +Then, you can import the `SQLLambdaModelDataSourceStrategyFactory` which helps define the datasource strategy from the custom `.sql` files you've created. ```js import { SQLLambdaModelDataSourceStrategyFactory } from '@aws-amplify/graphql-api-construct'; @@ -292,6 +294,8 @@ The SQL statements defined in the `.sql` files will be executed as if they were ### Custom Query +For reference, you define a GraphQL query by adding a new field under a `type Query` object: + ```graphql type Query { searchPostsByTitle(title: String): [Post] @@ -303,6 +307,8 @@ type Query { ### Custom Mutation +For reference, you define a GraphQL mutation by adding a new field under a `type Mutation` object: + ```graphql type Mutation { publishPostById(id: ID!): AWSJSON @@ -339,7 +345,7 @@ However, you might want to return the actual row data instead. In MySQL, you can create and call a stored procedure that performs both an UPDATE statement and SELECT query to return a single post. -Create a stored procedure: +Create a stored procedure by running the following SQL statement in your MySQL database: ```sql CREATE PROCEDURE publish_post (IN postId VARCHAR(255)) @@ -360,12 +366,6 @@ type Mutation { } ``` - - **NOTE:** Unlike the Amplify CLI-generated mutations that return a single - item, the return type for custom queries and mutations expecting row data must - be an array of the corresponding model. - - @@ -383,13 +383,19 @@ type Mutation { + + The return type for custom queries and mutations expecting row data must + be an array of the corresponding model. + + + ## Apply authorization rules on the models The `@auth` directive can be used to restrict access to data and operations by specifying authorization rules. It allows granular access control over the GraphQL API based on the user's identity and attributes. -All model level authorization rules are supported for Amplify GraphQL schemas generated from MySQL and PostgreSQL databases. +All model-level authorization rules are supported for Amplify GraphQL schemas generated from MySQL and PostgreSQL databases. -**NOTE:** Field level auth rules are not supported. +**Known limitation:** Field level auth rules are not supported. In the example below, public users authorized via API Key are granted unrestricted access to all posts. @@ -423,6 +429,110 @@ Now the API has been deployed and you can start using it! You can start querying from the AWS AppSync console or integrate it into your application using the AWS Amplify libraries! +{/* +## (Experimental) Auto-generate CRUDL operations for existing tables + + + **NOTE:** This feature is experimental and is subject to change. + + +You can use the Amplify CLI to generate common CRUDL operations for your database schema, saving time from having to author them by hand. + +Create a `blogs` table in your database: + +```sql +CREATE TABLE blogs ( + id varchar(255) NOT NULL PRIMARY KEY, + title varchar(255) NOT NULL, +); +``` + +Execute the following SQL statement on your database using a MySQL, PostgreSQL Client or CLI tool similar to `psql` and export the output to a CSV file: + + + **NOTE:** Make sure to include column headers when exporting the output to a + CSV file. + + +Replace `` with the name of your database/schema. + + + +```sql +SELECT + INFORMATION_SCHEMA.COLUMNS.TABLE_NAME, + INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME, + INFORMATION_SCHEMA.COLUMNS.COLUMN_DEFAULT, + INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION, + INFORMATION_SCHEMA.COLUMNS.DATA_TYPE, + INFORMATION_SCHEMA.COLUMNS.COLUMN_TYPE, + INFORMATION_SCHEMA.COLUMNS.IS_NULLABLE, + INFORMATION_SCHEMA.COLUMNS.CHARACTER_MAXIMUM_LENGTH, + INFORMATION_SCHEMA.STATISTICS.INDEX_NAME, + INFORMATION_SCHEMA.STATISTICS.NON_UNIQUE, + INFORMATION_SCHEMA.STATISTICS.SEQ_IN_INDEX, + INFORMATION_SCHEMA.STATISTICS.NULLABLE + FROM INFORMATION_SCHEMA.COLUMNS + LEFT JOIN INFORMATION_SCHEMA.STATISTICS ON INFORMATION_SCHEMA.COLUMNS.TABLE_NAME=INFORMATION_SCHEMA.STATISTICS.TABLE_NAME AND INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME=INFORMATION_SCHEMA.STATISTICS.COLUMN_NAME + WHERE INFORMATION_SCHEMA.COLUMNS.TABLE_SCHEMA = ''; +``` + + +```sql +SELECT + enum_name, + enum_values, + table_name, + column_name, + column_default, + ordinal_position, + data_type, + udt_name, + is_nullable, + character_maximum_length, + indexname, + REPLACE(SUBSTRING(indexdef from '\((.*)\)'), '"', '') as index_columns + FROM INFORMATION_SCHEMA.COLUMNS + LEFT JOIN pg_indexes + ON + INFORMATION_SCHEMA.COLUMNS.table_name = pg_indexes.tablename + AND INFORMATION_SCHEMA.COLUMNS.column_name = ANY(STRING_TO_ARRAY(REPLACE(SUBSTRING(indexdef from '\((.*)\)'), '"', ''), ', ')) + LEFT JOIN ( + SELECT + t.typname AS enum_name, + ARRAY_AGG(e.enumlabel) as enum_values + FROM pg_type t JOIN + pg_enum e ON t.oid = e.enumtypid JOIN + pg_catalog.pg_namespace n ON n.oid = t.typnamespace + WHERE n.nspname = 'public' + GROUP BY enum_name + ) enums + ON enums.enum_name = INFORMATION_SCHEMA.COLUMNS.udt_name + WHERE table_schema = 'public' AND TABLE_CATALOG = ''; +``` + + + +Generate an Amplify GraphQL API schema by running the following command, replacing the `--sql-schema` value with the path to the CSV file created in the previous step: + +```sh +npx @aws-amplify/cli api generate-schema --sql-schema --engine-type mysql --out schema.sql.graphql +``` + +Finally, update the first argument of `AmplifyGraphqlDefinition.fromFilesAndStrategy` to include the `schema.sql.graphql` file generated in the previous step: + +```ts +new AmplifyGraphqlApi(stack, 'SqlBoundApi', { + apiName: 'MySqlBoundApi', + definition: AmplifyGraphqlDefinition.fromFilesAndStrategy( + [path.join(__dirname, 'schema.sql.graphql')], // file path + { + // ...strategy options + } + ) +}); +``` + ### Rename & map models to tables To rename models and fields, you can use the `@refersTo` directive to map the models in the GraphQL schema to the corresponding table or field by name. @@ -441,11 +551,11 @@ type Post @refersTo(name: "posts") @model { } ``` -## Create relationships between models +### Create relationships between models You can use the `@hasOne`, `@hasMany`, and `@belongsTo` relational directives to create relationships between models. The field named in the `references` parameter of the relational directives must exist on the child model. -### Has One relationship +#### Has One relationship Create a one-directional one-to-one relationship between two models using the `@hasOne` directive. @@ -463,7 +573,7 @@ type User } ``` -### Has Many relationship +#### Has Many relationship Create a one-directional one-to-many relationship between two models using the `@hasMany` directive. @@ -483,7 +593,7 @@ type Post @model { } ``` -### Belongs To relationship +#### Belongs To relationship Make a "has one" or "has many" relationship bi-directional with the `@belongsTo` directive. @@ -499,7 +609,7 @@ type Post @model { } ``` -## Apply iterative changes from the database definition +### Apply iterative changes from the database definition **NOTE:** This feature is experimental and is subject to change. @@ -671,116 +781,13 @@ cdk deploy | `@mapsTo` | ❌ | ❌ | ❌ | ❌ | Maps a model to a DynamoDB table. | | `@sql` | ✅ | ❌ | ✅ | ✅ | Accepts an inline SQL statement or reference to a .sql file to be executed to resolve a Custom Query or Mutation. | - - -## Auto-generate CRUDL operations for existing tables - - - **NOTE:** This feature is experimental and is subject to change. - - -You can use the Amplify CLI to generate common CRUDL operations for your database schema, saving time from having to author them by hand. - -Create a `blogs` table in your database: - -```sql -CREATE TABLE blogs ( - id varchar(255) NOT NULL PRIMARY KEY, - title varchar(255) NOT NULL, -); -``` - -Execute the following SQL statement on your database using a MySQL, PostgreSQL Client or CLI tool similar to `psql` and export the output to a CSV file: - - - **NOTE:** Make sure to include column headers when exporting the output to a - CSV file. - - -Replace `` with the name of your database/schema. - - - -```sql -SELECT - INFORMATION_SCHEMA.COLUMNS.TABLE_NAME, - INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME, - INFORMATION_SCHEMA.COLUMNS.COLUMN_DEFAULT, - INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION, - INFORMATION_SCHEMA.COLUMNS.DATA_TYPE, - INFORMATION_SCHEMA.COLUMNS.COLUMN_TYPE, - INFORMATION_SCHEMA.COLUMNS.IS_NULLABLE, - INFORMATION_SCHEMA.COLUMNS.CHARACTER_MAXIMUM_LENGTH, - INFORMATION_SCHEMA.STATISTICS.INDEX_NAME, - INFORMATION_SCHEMA.STATISTICS.NON_UNIQUE, - INFORMATION_SCHEMA.STATISTICS.SEQ_IN_INDEX, - INFORMATION_SCHEMA.STATISTICS.NULLABLE - FROM INFORMATION_SCHEMA.COLUMNS - LEFT JOIN INFORMATION_SCHEMA.STATISTICS ON INFORMATION_SCHEMA.COLUMNS.TABLE_NAME=INFORMATION_SCHEMA.STATISTICS.TABLE_NAME AND INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME=INFORMATION_SCHEMA.STATISTICS.COLUMN_NAME - WHERE INFORMATION_SCHEMA.COLUMNS.TABLE_SCHEMA = ''; -``` - - -```sql -SELECT - enum_name, - enum_values, - table_name, - column_name, - column_default, - ordinal_position, - data_type, - udt_name, - is_nullable, - character_maximum_length, - indexname, - REPLACE(SUBSTRING(indexdef from '\((.*)\)'), '"', '') as index_columns - FROM INFORMATION_SCHEMA.COLUMNS - LEFT JOIN pg_indexes - ON - INFORMATION_SCHEMA.COLUMNS.table_name = pg_indexes.tablename - AND INFORMATION_SCHEMA.COLUMNS.column_name = ANY(STRING_TO_ARRAY(REPLACE(SUBSTRING(indexdef from '\((.*)\)'), '"', ''), ', ')) - LEFT JOIN ( - SELECT - t.typname AS enum_name, - ARRAY_AGG(e.enumlabel) as enum_values - FROM pg_type t JOIN - pg_enum e ON t.oid = e.enumtypid JOIN - pg_catalog.pg_namespace n ON n.oid = t.typnamespace - WHERE n.nspname = 'public' - GROUP BY enum_name - ) enums - ON enums.enum_name = INFORMATION_SCHEMA.COLUMNS.udt_name - WHERE table_schema = 'public' AND TABLE_CATALOG = ''; -``` - - - -Generate an Amplify GraphQL API schema by running the following command, replacing the `--sql-schema` value with the path to the CSV file created in the previous step: - -```sh -npx @aws-amplify/cli api generate-schema --sql-schema --engine-type mysql --out schema.sql.graphql -``` - -Finally, update the first argument of `AmplifyGraphqlDefinition.fromFilesAndStrategy` to include the `schema.sql.graphql` file generated in the previous step: - -```ts -new AmplifyGraphqlApi(stack, 'SqlBoundApi', { - apiName: 'MySqlBoundApi', - definition: AmplifyGraphqlDefinition.fromFilesAndStrategy( - [path.join(__dirname, 'schema.sql.graphql')], // file path - { - // ...strategy options - } - ) -}); -``` + */} ## How does it work? -The Amplify CLI uses AWS Lambda functions to enable features like querying data from your database. To work properly, these Lambda functions need access to common logic and dependencies. +The Amplify uses AWS Lambda functions to enable features like querying data from your database. To work properly, these Lambda functions need access to common logic and dependencies. -Amplify CLI provides this shared code in the form of Lambda Layers. You can think of Lambda Layers as a package of reusable runtime code that Lambda functions can reference. +Amplify provides this shared code in the form of Lambda Layers. You can think of Lambda Layers as a package of reusable runtime code that Lambda functions can reference. When you deploy an Amplify API, it will create two Lambda functions: @@ -809,18 +816,12 @@ This allows the Amplify team to maintain and enhance the SQL Layer without needi ### Debug Mode -To return the actual SQL error instead of a generic error from AppSync responses, an environment variable `DEBUG_MODE` can be set to `true` on the Amplify CLI-generated SQL Lambda function. - -## Conclusion - -Congratulations! You have finished the **Connect your API to an existing database** guide. In this guide, you reviewed connecting to an existing database, making iterative changes to your database schema to ultimately generate and deploy a GraphQL API. You also reviewed which changes and directives are preserved, such as renaming and mapping models to tables, as well as creating custom queries and mutations using inline statements and references to SQL files. +To return the actual SQL error instead of a generic error from GraphQL responses, an environment variable `DEBUG_MODE` can be set to `true` on the Amplify-generated SQL Lambda function. You can find this Lambda function in the AWS Lambda console with the naming convention of: `--SQLLambdaFunction`. ## Next steps -Our recommended next steps include using the API to mutate and query data. You can also review how to subscribe to real-time events to look for mutations in your data. Some resources that will help with this work include: +Our recommended next steps include using the GraphQL API to mutate and query data on app clients or how to customize the authorization rules for your custom queries and mutations. Some resources that will help with this work include: - [Create, update, and delete application data](/[platform]/build-a-backend/graphqlapi/mutate-data/) - [Read application data](/[platform]/build-a-backend/graphqlapi/query-data/) -- [Subscribe to real-time events](/[platform]/build-a-backend/graphqlapi/subscribe-data/) - - +- [Customize Authorization Rules](/[platform]/build-a-backend/graphqlapi/customize-authorization-rules/) From a33e67ed1908c5afe4606c4331d500e1dad810d0 Mon Sep 17 00:00:00 2001 From: Rene Brandel Date: Mon, 27 Nov 2023 09:17:12 -0500 Subject: [PATCH 25/30] reverted unintende file changes --- src/pages/gen2/reference/CDK-constructs/index.mdx | 1 + src/pages/gen2/reference/CLI-commands/index.mdx | 1 + 2 files changed, 2 insertions(+) diff --git a/src/pages/gen2/reference/CDK-constructs/index.mdx b/src/pages/gen2/reference/CDK-constructs/index.mdx index 86a4a7e93e0..8d6d86612bf 100644 --- a/src/pages/gen2/reference/CDK-constructs/index.mdx +++ b/src/pages/gen2/reference/CDK-constructs/index.mdx @@ -11,6 +11,7 @@ export function getStaticProps(context) { }; } + Here you will find a collection of backend components known as "constructs" for use with [AWS Cloud Development Kit (CDK)](https://aws.amazon.com/cdk/). ## Amplify Data diff --git a/src/pages/gen2/reference/CLI-commands/index.mdx b/src/pages/gen2/reference/CLI-commands/index.mdx index 0189bca1219..2c2c3d6b787 100644 --- a/src/pages/gen2/reference/CLI-commands/index.mdx +++ b/src/pages/gen2/reference/CLI-commands/index.mdx @@ -23,6 +23,7 @@ export function getStaticProps(context) { }; } + This page serves as a reference for commands found in the [`@aws-amplify/backend-cli`](https://www.npmjs.com/package/@aws-amplify/backend-cli) package. All commands can be prefixed with [AWS CLI Environment Variables](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html#envvars-list) to change the AWS account behavior with Amplify (Gen 2) commands. From 58ef119ccca7aba96a8582c105d008296d294c12 Mon Sep 17 00:00:00 2001 From: Rene Brandel Date: Mon, 27 Nov 2023 09:21:12 -0500 Subject: [PATCH 26/30] reverted unencessary file changes --- .../gen2/reference/{CDK-constructs => cdk-constructs}/index.mdx | 0 src/pages/gen2/reference/{CLI-commands => cli-commands}/index.mdx | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename src/pages/gen2/reference/{CDK-constructs => cdk-constructs}/index.mdx (100%) rename src/pages/gen2/reference/{CLI-commands => cli-commands}/index.mdx (100%) diff --git a/src/pages/gen2/reference/CDK-constructs/index.mdx b/src/pages/gen2/reference/cdk-constructs/index.mdx similarity index 100% rename from src/pages/gen2/reference/CDK-constructs/index.mdx rename to src/pages/gen2/reference/cdk-constructs/index.mdx diff --git a/src/pages/gen2/reference/CLI-commands/index.mdx b/src/pages/gen2/reference/cli-commands/index.mdx similarity index 100% rename from src/pages/gen2/reference/CLI-commands/index.mdx rename to src/pages/gen2/reference/cli-commands/index.mdx From b5cfe13f13ddab367730ff026ff337a344e1cb2f Mon Sep 17 00:00:00 2001 From: Rene Brandel Date: Mon, 27 Nov 2023 09:21:51 -0500 Subject: [PATCH 27/30] removed empty line hack --- src/pages/gen2/reference/cdk-constructs/index.mdx | 1 - src/pages/gen2/reference/cli-commands/index.mdx | 1 - 2 files changed, 2 deletions(-) diff --git a/src/pages/gen2/reference/cdk-constructs/index.mdx b/src/pages/gen2/reference/cdk-constructs/index.mdx index 8d6d86612bf..86a4a7e93e0 100644 --- a/src/pages/gen2/reference/cdk-constructs/index.mdx +++ b/src/pages/gen2/reference/cdk-constructs/index.mdx @@ -11,7 +11,6 @@ export function getStaticProps(context) { }; } - Here you will find a collection of backend components known as "constructs" for use with [AWS Cloud Development Kit (CDK)](https://aws.amazon.com/cdk/). ## Amplify Data diff --git a/src/pages/gen2/reference/cli-commands/index.mdx b/src/pages/gen2/reference/cli-commands/index.mdx index 2c2c3d6b787..0189bca1219 100644 --- a/src/pages/gen2/reference/cli-commands/index.mdx +++ b/src/pages/gen2/reference/cli-commands/index.mdx @@ -23,7 +23,6 @@ export function getStaticProps(context) { }; } - This page serves as a reference for commands found in the [`@aws-amplify/backend-cli`](https://www.npmjs.com/package/@aws-amplify/backend-cli) package. All commands can be prefixed with [AWS CLI Environment Variables](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html#envvars-list) to change the AWS account behavior with Amplify (Gen 2) commands. From e243d2ed852f6d5add29cf55cd63ae05c31600d3 Mon Sep 17 00:00:00 2001 From: Rene Brandel Date: Mon, 27 Nov 2023 09:28:12 -0500 Subject: [PATCH 28/30] removed final model reference --- .../connect-api-to-existing-database/index.mdx | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx index 2f108d16ead..cf9493f479f 100644 --- a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx +++ b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx @@ -202,6 +202,7 @@ In the example below, a SQL statement is defined, accepting a `searchTerm` input type Query { searchPosts(searchTerm: String): [Post] @sql(statement: "SELECT * FROM posts WHERE title LIKE :searchTerm;") + @auth(rules: [{ allow: public }]) } ``` @@ -220,6 +221,7 @@ First, update your GraphQL schema file to reference a SQL file name without the type Query { getPublishedPosts(start: AWSDate, end: AWSDate): [Post] @sql(reference: "getPublishedPostsByRange") + @auth(rules: [{ allow: public }]) } ``` @@ -302,6 +304,7 @@ type Query { @sql( statement: "SELECT * FROM Post WHERE title LIKE CONCAT('%', :title, '%');" ) + @auth(rules: [{ allow: public }]) } ``` @@ -313,6 +316,7 @@ For reference, you define a GraphQL mutation by adding a new field under a `type type Mutation { publishPostById(id: ID!): AWSJSON @sql(statement: "UPDATE posts SET published = :published WHERE id = :id;") + @auth(rules: [{ allow: public }]) } ``` @@ -325,6 +329,7 @@ If you want to return the result of the SQL statement, you can use `AWSJSON` as ```graphql type Mutation { publishPosts: AWSJSON @sql(statement: "UPDATE Post SET published = 1;") + @auth(rules: [{ allow: public }]) } ``` @@ -363,6 +368,7 @@ Call the stored procedure from the custom mutation: type Mutation { publishPostById(id: String!): [Post] @sql(statement: "CALL publish_post(:id);") + @auth(rules: [{ allow: public }]) } ``` @@ -377,6 +383,7 @@ Example: type Mutation { publishPostById(id: String!): [Post] @sql(statement: "UPDATE posts SET price = :id RETURNING *;") + @auth(rules: [{ allow: public }]) } ``` @@ -391,9 +398,9 @@ type Mutation { ## Apply authorization rules on the models -The `@auth` directive can be used to restrict access to data and operations by specifying authorization rules. It allows granular access control over the GraphQL API based on the user's identity and attributes. +The `@auth` directive can be used to restrict access to data and operations by specifying authorization rules. It allows granular access control over the GraphQL API based on the user's identity and attributes. You can for example, limit a query or mutation to only logged-in users via an `@auth(rules: [{ allow: private }])` rule or limit access to only users of the "Admin" group via an `@auth(rules: [{ allow: groups, groups: ["Admin"] }])` rule. -All model-level authorization rules are supported for Amplify GraphQL schemas generated from MySQL and PostgreSQL databases. +{/* All model-level authorization rules are supported for Amplify GraphQL schemas generated from MySQL and PostgreSQL databases. **Known limitation:** Field level auth rules are not supported. @@ -406,9 +413,9 @@ type Blog @model @refersTo(name: "blogs") @auth(rules: [{ allow: public }]) { id: String! @primaryKey title: String! } -``` +``` */} -In a real world scenario, you can instead define auth rules that only allow public users to read posts, and authenticated users the ability to update or delete their posts. +{/* In a real world scenario, you can instead define auth rules that only allow public users to read posts, and authenticated users the ability to update or delete their posts. */} For more information on each rule please refer to our documentation on [Authorization rules](/[platform]/build-a-backend/graphqlapi/customize-authorization-rules/). From cee25d83a025cd2ff37a4e4efe139590b78a9a5f Mon Sep 17 00:00:00 2001 From: Rene Brandel Date: Mon, 27 Nov 2023 09:28:49 -0500 Subject: [PATCH 29/30] removed the reference fo the word "model" --- .../graphqlapi/connect-api-to-existing-database/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx index cf9493f479f..769b43c7357 100644 --- a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx +++ b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx @@ -396,7 +396,7 @@ type Mutation { -## Apply authorization rules on the models +## Apply authorization rules The `@auth` directive can be used to restrict access to data and operations by specifying authorization rules. It allows granular access control over the GraphQL API based on the user's identity and attributes. You can for example, limit a query or mutation to only logged-in users via an `@auth(rules: [{ allow: private }])` rule or limit access to only users of the "Admin" group via an `@auth(rules: [{ allow: groups, groups: ["Admin"] }])` rule. From a0759285f6c80dbfbd437549a23aa8cb84afbfb3 Mon Sep 17 00:00:00 2001 From: Rene Brandel Date: Mon, 27 Nov 2023 09:53:38 -0500 Subject: [PATCH 30/30] removed sandbox reference --- .../graphqlapi/connect-api-to-existing-database/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx index 769b43c7357..cf5d7f448a6 100644 --- a/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx +++ b/src/pages/[platform]/build-a-backend/graphqlapi/connect-api-to-existing-database/index.mdx @@ -136,7 +136,7 @@ new AmplifyGraphqlApi(stack, 'SqlBoundApi', { }); ``` -The API will have an API key enabled for authorization. Sandbox mode is enabled for testing. +The API will have an API key enabled for authorization. Before deploying, make sure to: