Aurora Serverless Postgresql в качестве источника данных для синхронизации приложений - PullRequest
0 голосов
/ 28 марта 2020

Я столкнулся с проблемой приложения syn c, где источником данных является реляционная база данных.

Итак, моя цель - подключить сервер Aurora без postgresql кластера с приложением syn c в качестве источника данных и заставить его работать.

Шаги, которые я выполнил (все через без-сервера framework):

Создан кластер aurora postgreSQL.

Подключен кластер aurora postgreSQL к приложению syn c.

Создана схема graphql в приложении syn c .

Тип аутентификации - ключ API.

app syn c Конфигурация принята здесь (https://github.com/serverless-components/aws-app-sync#data -источники - шаблоны ). :

appSync:
name: Posts
authenticationType: API_KEY
apiKeys:
  - myApiKey
dataSources:
  - type: RELATIONAL_DATABASE
    name: Posts
    config:
      awsSecretStoreArn: 
        Ref: SecretsManager
      databaseName: "mydatabase"
      dbClusterIdentifier: 
        Ref: AuroraRDSCluster
schema: schema.graphql
mappingTemplates:
  - dataSource: Posts
    type: Query
    field: getPet
    request: "request.vtl"
    response: "response.vtl"
  - dataSource: Posts
    type: Query
    field: listPets
    request: "listPets_request.vtl"
    response: "listPets_response.vtl"

моя схема graphql взята отсюда (https://docs.aws.amazon.com/appsync/latest/devguide/tutorial-rds-resolvers.html)

    type Mutation {
createPet(input: CreatePetInput!): Pet
updatePet(input: UpdatePetInput!): Pet
deletePet(input: DeletePetInput!): Pet

}

    input CreatePetInput {
type: PetType
price: Float!

}

    input UpdatePetInput {id: ID!
type: PetType
price: Float!

}

    input DeletePetInput {
id: ID!

}

    type Pet {
id: ID!
type: PetType
price: Float

}

    enum PetType {
dog
cat
fish
bird
gecko

}

    type Query {
getPet(id: ID!): Pet
listPets: [Pet]
listPetsByPriceRange(min: Float, max: Float): [Pet]

}

    schema {
query: Query
mutation: Mutation

}

my getPet request.vtl:

{
"version": "2018-05-29",
    "statements": [
        $util.toJson("select * from Pets WHERE id='$ctx.args.id'")
]

}

my getPet ответ .vtl:

$utils.toJson($utils.rds.toJsonObject($ctx.result)[0][0])

и все развернуто идеально, как кластер Arn (dbClusterIdentifier), имя базы данных awsSecretStoreArn с приложением syn c источник данных, средства сопоставления со схемой.

И получил API-интерфейс graphql с API введите выходные данные развертывания.

После этого я создал таблицу Pets с идентификатором столбца, типом, ценой с одной записью через редактор запросов кластера rds.

Итак, теперь, когда я пытался выполнить запрос в консоли приложения syn c, я получал значение как нулевое. запрос:

    query {getPet(id: "1"){id type price }}

пробовал с node js кодом тоже, но результат тот же.



// url of your GraphQL API. If you configured a custom domain, you could use that instead


    const url =

  "https://z4#############.appsync-api.us-east-1.amazonaws.com/graphql";


// api key of your GraphQL API

const apiKey = "da2-7by6############";


// ID of the post you wanna query

const id = "1";


fetch(url, {

  method: "POST",

  headers: {

    "Content-Type": "application/json",

    "x-api-key": apiKey

  },

  body: JSON.stringify({

    query: `query {getPet(id: "${id}"){id}}`

  })

})

  .then(res => res.text())

  .then(post => console.log(post));```
any help how to make it working.

1 Ответ

0 голосов
/ 04 апреля 2020

Итак, проблема была в политике ролей iam по умолчанию, принятой appsyn c. По умолчанию appsyn c создаст роль iam со следующими политиками

- Effect: Allow
  Action:
    - secretsmanager:GetSecretValue
  Resource: "your resource mentioned"
- Effect: Allow
  Action:
    - rds-data:DeleteItems
    - rds-data:ExecuteSql
    - rds-data:GetItems
    - rds-data:InsertItems
    - rds-data:UpdateItems
  Resource: "your resource mentioned"

Теперь здесь отсутствует одна вещь:

- rds-data:ExecuteStatement

Итак, я создал новую роль iam с отсутствующей полицией и прикрепил его к appsyn c, и он работает для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...