Deploy an AppSync GraphQL API with DynamoDB backend (Part 1)

2020年05月09日


Image: Amazon Linux 2
Install Python3

$ sudo yum install -y git

$ curl -sL https://rpm.nodesource.com/setup_14.x | sudo bash -

$ sudo yum install -y nodejs

$ aws configure

AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name [None]: us-west-2
Default output format [None]:

# cd

# exit

$ sudo npm install -g aws-cdk
/usr/bin/cdk -> /usr/lib/node_modules/aws-cdk/bin/cdk
+ aws-cdk@1.38.0
added 213 packages from 187 contributors in 8.348s
PS: "npm i" is an alias for "npm install".

If encounter below error, try running this command again as root/Administrator.
npm ERR! Linux 4.14.173-137.229.amzn2.x86_64
npm ERR! argv "/usr/bin/node" "/usr/bin/npm" "install" "-g" "aws-cdk"
npm ERR! node v6.17.1
npm ERR! npm  v3.10.10
npm ERR! path /usr/lib/node_modules
npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall access

npm ERR! Error: EACCES: permission denied, access '/usr/lib/node_modules'
npm ERR!     at Error (native)
npm ERR!  { Error: EACCES: permission denied, access '/usr/lib/node_modules'
npm ERR!     at Error (native)
npm ERR!   errno: -13,
npm ERR!   code: 'EACCES',
npm ERR!   syscall: 'access',
npm ERR!   path: '/usr/lib/node_modules' }
npm ERR!
npm ERR! Please try running this command again as root/Administrator.

npm ERR! Please include the following file with any support request:
npm ERR!     /home/ec2-user/npm-debug.log

$ git clone https://github.com/aws-samples/aws-cdk-examples.git

$ cd aws-cdk-examples/python/appsync-graphql-dynamodb/

$ python3.8 -m venv .env

$ source .env/bin/activate

$ pip install -r requirements.txt

Fix bug of the file app_sync_cdk_stack.py around line 90:
$ vim app_sync_cdk/app_sync_cdk_stack.py
...
        items_table_role.add_managed_policy(
            ManagedPolicy.from_aws_managed_policy_name(
                'AmazonDynamoDBFullAccess'
            )
        )

Deploy / redeploy your Stack to your AWS Account.
Deploys the CloudFormation template
$ cdk deploy
This deployment will make potentially sensitive changes according to your current security approval level (--require-approval broadening).
Please confirm you intend to make the following modifications:

IAM Statement Changes
┌───┬──────────────────────────┬────────┬────────────────┬───────────────────────────────┬───────────┐
│   │ Resource                 │ Effect │ Action         │ Principal                     │ Condition │
├───┼──────────────────────────┼────────┼────────────────┼───────────────────────────────┼───────────┤
│ + │ ${ItemsDynamoDBRole.Arn} │ Allow  │ sts:AssumeRole │ Service:appsync.amazonaws.com │           │
└───┴──────────────────────────┴────────┴────────────────┴───────────────────────────────┴───────────┘
IAM Policy Changes
┌───┬──────────────────────┬────────────────────────────────────────────────────────────────┐
│   │ Resource             │ Managed Policy ARN                                             │
├───┼──────────────────────┼────────────────────────────────────────────────────────────────┤
│ + │ ${ItemsDynamoDBRole} │ arn:${AWS::Partition}:iam::aws:policy/AmazonDynamoDBFullAccess │
└───┴──────────────────────┴────────────────────────────────────────────────────────────────┘
(NOTE: There may be security-related changes not in this list. See https://github.com/aws/aws-cdk/issues/1299)

Do you wish to deploy these changes (y/n)? y
AppSyncGraphQLDynamoDBExample: deploying...
AppSyncGraphQLDynamoDBExample: creating CloudFormation changeset...
  0/12 | 4:54:43 AM | CREATE_IN_PROGRESS   | AWS::AppSync::GraphQLApi    | ItemsApi
  0/12 | 4:54:43 AM | CREATE_IN_PROGRESS   | AWS::CDK::Metadata          | CDKMetadata
  0/12 | 4:54:43 AM | CREATE_IN_PROGRESS   | AWS::DynamoDB::Table        | ItemsTable (ItemsTable5AAC2C46)
  0/12 | 4:54:43 AM | CREATE_IN_PROGRESS   | AWS::IAM::Role              | ItemsDynamoDBRole (ItemsDynamoDBRole7D2E3F6D)
  0/12 | 4:54:44 AM | CREATE_IN_PROGRESS   | AWS::DynamoDB::Table        | ItemsTable (ItemsTable5AAC2C46) Resource creation Initiated
  0/12 | 4:54:44 AM | CREATE_IN_PROGRESS   | AWS::IAM::Role              | ItemsDynamoDBRole (ItemsDynamoDBRole7D2E3F6D) Resource creation Initiated
  0/12 | 4:54:45 AM | CREATE_IN_PROGRESS   | AWS::CDK::Metadata          | CDKMetadata Resource creation Initiated
  1/12 | 4:54:45 AM | CREATE_COMPLETE      | AWS::CDK::Metadata          | CDKMetadata
  1/12 | 4:54:47 AM | CREATE_IN_PROGRESS   | AWS::AppSync::GraphQLApi    | ItemsApi Resource creation Initiated
  2/12 | 4:54:47 AM | CREATE_COMPLETE      | AWS::AppSync::GraphQLApi    | ItemsApi
  2/12 | 4:54:49 AM | CREATE_IN_PROGRESS   | AWS::AppSync::ApiKey        | ItemsApiKey
  2/12 | 4:54:50 AM | CREATE_IN_PROGRESS   | AWS::AppSync::GraphQLSchema | ItemsSchema
  2/12 | 4:54:51 AM | CREATE_IN_PROGRESS   | AWS::AppSync::GraphQLSchema | ItemsSchema Resource creation Initiated
  3/12 | 4:54:58 AM | CREATE_COMPLETE      | AWS::IAM::Role              | ItemsDynamoDBRole (ItemsDynamoDBRole7D2E3F6D)
  3/12 | 4:55:04 AM | CREATE_IN_PROGRESS   | AWS::AppSync::ApiKey        | ItemsApiKey Resource creation Initiated
  4/12 | 4:55:04 AM | CREATE_COMPLETE      | AWS::AppSync::ApiKey        | ItemsApiKey
  5/12 | 4:55:14 AM | CREATE_COMPLETE      | AWS::DynamoDB::Table        | ItemsTable (ItemsTable5AAC2C46)
  5/12 | 4:55:17 AM | CREATE_IN_PROGRESS   | AWS::AppSync::DataSource    | ItemsDataSource
  5/12 | 4:55:18 AM | CREATE_IN_PROGRESS   | AWS::AppSync::DataSource    | ItemsDataSource Resource creation Initiated
  6/12 | 4:55:19 AM | CREATE_COMPLETE      | AWS::AppSync::DataSource    | ItemsDataSource
 6/12 Currently in progress: ItemsSchema
  7/12 | 4:55:53 AM | CREATE_COMPLETE      | AWS::AppSync::GraphQLSchema | ItemsSchema
  7/12 | 4:55:55 AM | CREATE_IN_PROGRESS   | AWS::AppSync::Resolver      | GetOneQueryResolver
  7/12 | 4:55:55 AM | CREATE_IN_PROGRESS   | AWS::AppSync::Resolver      | GetAllQueryResolver
  7/12 | 4:55:55 AM | CREATE_IN_PROGRESS   | AWS::AppSync::Resolver      | DeleteMutationResolver
  7/12 | 4:55:56 AM | CREATE_IN_PROGRESS   | AWS::AppSync::Resolver      | SaveMutationResolver
  7/12 | 4:55:57 AM | CREATE_IN_PROGRESS   | AWS::AppSync::Resolver      | GetAllQueryResolver Resource creation Initiated
  8/12 | 4:55:57 AM | CREATE_COMPLETE      | AWS::AppSync::Resolver      | GetAllQueryResolver
  8/12 | 4:55:58 AM | CREATE_IN_PROGRESS   | AWS::AppSync::Resolver      | SaveMutationResolver Resource creation Initiated
  9/12 | 4:55:58 AM | CREATE_COMPLETE      | AWS::AppSync::Resolver      | SaveMutationResolver
  9/12 | 4:55:58 AM | CREATE_IN_PROGRESS   | AWS::AppSync::Resolver      | GetOneQueryResolver Resource creation Initiated
  9/12 | 4:55:58 AM | CREATE_IN_PROGRESS   | AWS::AppSync::Resolver      | DeleteMutationResolver Resource creation Initiated
 10/12 | 4:55:58 AM | CREATE_COMPLETE      | AWS::AppSync::Resolver      | GetOneQueryResolver
 11/12 | 4:55:58 AM | CREATE_COMPLETE      | AWS::AppSync::Resolver      | DeleteMutationResolver
 12/12 | 4:56:00 AM | CREATE_COMPLETE      | AWS::CloudFormation::Stack  | AppSyncGraphQLDynamoDBExample

 ✅  AppSyncGraphQLDynamoDBExample

Stack ARN:
arn:aws:cloudformation:us-west-2:123456789012:stack/AppSyncGraphQLDynamoDBExample/***

If encounter below error, make sure the Node.js version is >= 10.3.0. In some cases, this may be led by using "amazon-linux-extras install epel" and "yum install npm" commands to install npm on Amazon Linux 2 AMI.
/usr/lib/node_modules/aws-cdk/bin/cdk.js:22
async function parseCommandLineArguments() {
      ^^^^^^^^

SyntaxError: Unexpected token function
    at createScript (vm.js:56:10)
    at Object.runInThisContext (vm.js:97:10)
    at Module._compile (module.js:549:28)
    at Object.Module._extensions..js (module.js:586:10)
    at Module.load (module.js:494:32)
    at tryModuleLoad (module.js:453:12)
    at Function.Module._load (module.js:445:3)
    at Module.require (module.js:504:17)
    at require (internal/module.js:20:19)
    at Object.<anonymous> (/usr/lib/node_modules/aws-cdk/bin/cdk:2:1)

If encounter below error, make sure the file is corrected.
  1/12 | 4:25:39 AM | CREATE_FAILED        | AWS::IAM::Role              | ItemsDynamoDBRole (ItemsDynamoDBRole7D2E3F6D) ARN arn:aws:iam::aws:policy/arn:aws:iam::aws:policy/AmazonDynamoDBFullAccess is not valid. (Service: AmazonIdentityManagement; Status Code: 400; Error Code: InvalidInput; Request ID: ***)
        new Role (/tmp/jsii-kernel-uwXSzv/node_modules/@aws-cdk/aws-iam/lib/role.js:41:22)
        \_ /home/ec2-user/aws-cdk-examples/python/appsync-graphql-dynamodb/.env/lib/python3.8/site-packages/jsii/_embedded/jsii/jsii-runtime.js:7853:49
        \_ Kernel._wrapSandboxCode (/home/ec2-user/aws-cdk-examples/python/appsync-graphql-dynamodb/.env/lib/python3.8/site-packages/jsii/_embedded/jsii/jsii-runtime.js:8313:20)
        \_ Kernel._create (/home/ec2-user/aws-cdk-examples/python/appsync-graphql-dynamodb/.env/lib/python3.8/site-packages/jsii/_embedded/jsii/jsii-runtime.js:7853:26)
        \_ Kernel.create (/home/ec2-user/aws-cdk-examples/python/appsync-graphql-dynamodb/.env/lib/python3.8/site-packages/jsii/_embedded/jsii/jsii-runtime.js:7600:21)
        \_ KernelHost.processRequest (/home/ec2-user/aws-cdk-examples/python/appsync-graphql-dynamodb/.env/lib/python3.8/site-packages/jsii/_embedded/jsii/jsii-runtime.js:7388:28)
        \_ KernelHost.run (/home/ec2-user/aws-cdk-examples/python/appsync-graphql-dynamodb/.env/lib/python3.8/site-packages/jsii/_embedded/jsii/jsii-runtime.js:7328:14)
        \_ Immediate._onImmediate (/home/ec2-user/aws-cdk-examples/python/appsync-graphql-dynamodb/.env/lib/python3.8/site-packages/jsii/_embedded/jsii/jsii-runtime.js:7331:37)
        \_ processImmediate (internal/timers.js:456:21)
  2/12 | 4:25:40 AM | CREATE_FAILED        | AWS::DynamoDB::Table        | ItemsTable (ItemsTable5AAC2C46) Resource creation cancelled
        new Table (/tmp/jsii-kernel-uwXSzv/node_modules/@aws-cdk/aws-dynamodb/lib/table.js:230:22)
        \_ /home/ec2-user/aws-cdk-examples/python/appsync-graphql-dynamodb/.env/lib/python3.8/site-packages/jsii/_embedded/jsii/jsii-runtime.js:7853:49
        \_ Kernel._wrapSandboxCode (/home/ec2-user/aws-cdk-examples/python/appsync-graphql-dynamodb/.env/lib/python3.8/site-packages/jsii/_embedded/jsii/jsii-runtime.js:8313:20)
        \_ Kernel._create (/home/ec2-user/aws-cdk-examples/python/appsync-graphql-dynamodb/.env/lib/python3.8/site-packages/jsii/_embedded/jsii/jsii-runtime.js:7853:26)
        \_ Kernel.create (/home/ec2-user/aws-cdk-examples/python/appsync-graphql-dynamodb/.env/lib/python3.8/site-packages/jsii/_embedded/jsii/jsii-runtime.js:7600:21)
        \_ KernelHost.processRequest (/home/ec2-user/aws-cdk-examples/python/appsync-graphql-dynamodb/.env/lib/python3.8/site-packages/jsii/_embedded/jsii/jsii-runtime.js:7388:28)
        \_ KernelHost.run (/home/ec2-user/aws-cdk-examples/python/appsync-graphql-dynamodb/.env/lib/python3.8/site-packages/jsii/_embedded/jsii/jsii-runtime.js:7328:14)
        \_ Immediate._onImmediate (/home/ec2-user/aws-cdk-examples/python/appsync-graphql-dynamodb/.env/lib/python3.8/site-packages/jsii/_embedded/jsii/jsii-runtime.js:7331:37)
        \_ processImmediate (internal/timers.js:456:21)
  3/12 | 4:25:41 AM | CREATE_FAILED        | AWS::CDK::Metadata          | CDKMetadata Resource creation cancelled
  4/12 | 4:25:45 AM | CREATE_FAILED        | AWS::AppSync::GraphQLApi    | ItemsApi Resource creation cancelled
        /home/ec2-user/aws-cdk-examples/python/appsync-graphql-dynamodb/.env/lib/python3.8/site-packages/jsii/_embedded/jsii/jsii-runtime.js:7853:49
        \_ Kernel._wrapSandboxCode (/home/ec2-user/aws-cdk-examples/python/appsync-graphql-dynamodb/.env/lib/python3.8/site-packages/jsii/_embedded/jsii/jsii-runtime.js:8313:20)
        \_ Kernel._create (/home/ec2-user/aws-cdk-examples/python/appsync-graphql-dynamodb/.env/lib/python3.8/site-packages/jsii/_embedded/jsii/jsii-runtime.js:7853:26)
        \_ Kernel.create (/home/ec2-user/aws-cdk-examples/python/appsync-graphql-dynamodb/.env/lib/python3.8/site-packages/jsii/_embedded/jsii/jsii-runtime.js:7600:21)
        \_ KernelHost.processRequest (/home/ec2-user/aws-cdk-examples/python/appsync-graphql-dynamodb/.env/lib/python3.8/site-packages/jsii/_embedded/jsii/jsii-runtime.js:7388:28)
        \_ KernelHost.run (/home/ec2-user/aws-cdk-examples/python/appsync-graphql-dynamodb/.env/lib/python3.8/site-packages/jsii/_embedded/jsii/jsii-runtime.js:7328:14)
        \_ Immediate._onImmediate (/home/ec2-user/aws-cdk-examples/python/appsync-graphql-dynamodb/.env/lib/python3.8/site-packages/jsii/_embedded/jsii/jsii-runtime.js:7331:37)
        \_ processImmediate (internal/timers.js:456:21)
  4/12 | 4:25:46 AM | ROLLBACK_IN_PROGRESS | AWS::CloudFormation::Stack  | AppSyncGraphQLDynamoDBExample The following resource(s) failed to create: [ItemsDynamoDBRole7D2E3F6D, ItemsApi, ItemsTable5AAC2C46, CDKMetadata]. . Rollback requested by user.
  4/12 | 4:25:49 AM | DELETE_IN_PROGRESS   | AWS::CDK::Metadata          | CDKMetadata
  4/12 | 4:25:49 AM | DELETE_IN_PROGRESS   | AWS::AppSync::GraphQLApi    | ItemsApi
  4/12 | 4:25:49 AM | DELETE_IN_PROGRESS   | AWS::IAM::Role              | ItemsDynamoDBRole (ItemsDynamoDBRole7D2E3F6D)
  5/12 | 4:25:51 AM | DELETE_COMPLETE      | AWS::IAM::Role              | ItemsDynamoDBRole (ItemsDynamoDBRole7D2E3F6D)
  6/12 | 4:25:51 AM | DELETE_COMPLETE      | AWS::AppSync::GraphQLApi    | ItemsApi
  7/12 | 4:25:51 AM | DELETE_COMPLETE      | AWS::CDK::Metadata          | CDKMetadata
  7/12 | 4:25:54 AM | DELETE_IN_PROGRESS   | AWS::DynamoDB::Table        | ItemsTable (ItemsTable5AAC2C46)
 7/12 Currently in progress: AppSyncGraphQLDynamoDBExample, ItemsTable5AAC2C46

 ❌  AppSyncGraphQLDynamoDBExample failed: Error: The stack named AppSyncGraphQLDynamoDBExample failed creation, it may need to be manually deleted from the AWS console: ROLLBACK_COMPLETE
    at /usr/lib/node_modules/aws-cdk/lib/api/util/cloudformation.ts:245:13
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
    at waitFor (/usr/lib/node_modules/aws-cdk/lib/api/util/cloudformation.ts:157:20)
    at Object.deployStack (/usr/lib/node_modules/aws-cdk/lib/api/deploy-stack.ts:233:26)
    at CdkToolkit.deploy (/usr/lib/node_modules/aws-cdk/lib/cdk-toolkit.ts:181:24)
    at main (/usr/lib/node_modules/aws-cdk/bin/cdk.ts:235:16)
    at initCommandLine (/usr/lib/node_modules/aws-cdk/bin/cdk.ts:169:9)
The stack named AppSyncGraphQLDynamoDBExample failed creation, it may need to be manually deleted from the AWS console: ROLLBACK_COMPLETE

Add a mutation:
mutation save {
  save(name: "123") {
    itemsId
    name
  }
}



To destroy the resources:
$ cdk destroy







References

AppSync GraphQL API Acting on DynamoDB


-

Category: AWS Tags: public

Upvote


Downvote