Aurora Serverless Postgresql 作为应用程序同步的数据源

Posted

技术标签:

【中文标题】Aurora Serverless Postgresql 作为应用程序同步的数据源【英文标题】:Aurora Serverless Postgresql as data source for app sync 【发布时间】:2020-07-08 22:08:56 【问题描述】:

我遇到了数据源是关系数据库的应用同步问题。

因此,我的目标是将 Aurora serverless postgresql 集群与应用同步作为数据源连接并使其正常工作。

我执行的步骤(全部通过无服务器框架):

创建 aurora postgreSQL 集群。

将 aurora postgreSQL 集群连接到应用同步。

在应用同步中创建了 graphql Schema。

身份验证类型是 - API 密钥。

应用同步配置在此处(https://github.com/serverless-components/aws-app-sync#data-sources--templates)。 :

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

我的 getPet request.vtl :


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

my getPet response.vtl:

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

一切都部署得非常完美,例如集群 Arn(dbClusterIdentifier) 、带有应用同步数据源的 awsSecretStoreArn 数据库名称、带有架构的解析器。

并在部署的输出中获得了带有 api 密钥的 graphql api。

在此之后,我通过 rds 集群的查询编辑器创建了一个包含列 id、类型、价格和一条记录的表 Pets。

所以现在,当我尝试在应用同步控制台中查询时,我得到的值为 null。 查询是:

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

也尝试使用节点 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】:

因此,问题在于 appsync 采用的默认 iam 角色策略。 默认情况下,appsync 将使用以下策略创建 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 角色,并将其附加到 appsync,它对我有用。

【讨论】:

以上是关于Aurora Serverless Postgresql 作为应用程序同步的数据源的主要内容,如果未能解决你的问题,请参考以下文章

远程连接到 Aurora Serverless

Terraform,AWS RDS aurora mysql serverless 异常“找不到源集群”

使用 HikariCP 和 AWS Aurora Serverless 的连接池配置

使用 CloudFormation(和 Lambda 轮换模板)的 Aurora Serverless 密码轮换设置

Aurora Serverless Postgresql 作为应用程序同步的数据源

Terraform AWS Aurora Serverless MySQL - 错误:无效的数据库引擎