aws(學習筆記第四十八課) appsync-graphql-dynamodb

aws(學習筆記第四十八課) appsync-graphql-dynamodb

  • 使用graphql來方便操作dynamodb
  • 理解graphql中的graphql apischemaresolver

學習內容:

  • graphql
  • graphql api
  • schema
  • resolver

1. 代碼連接和修改

1.1 代碼鏈接

代碼鏈接(appsync-graphql-dynamodb)

1.2 代碼修改

1.2.1 加上必要的depencies

各個resolver創建的時候,都是需要data_source的,所以需要事前將resolverdepencies加上data source

        get_one_resolver.add_depends_on(data_source)get_all_resolver.add_depends_on(data_source)save_resolver.add_depends_on(data_source)delete_resolver.add_depends_on(data_source)
1.2.2 加上必要的outputs
        CfnOutput(self, "AppSyncApiUrl",value=items_graphql_api.attr_graph_ql_url,description="AppSync GraphQL API URL")CfnOutput(self, "AppSyncApiKey",value=items_api_key.attr_api_key,  # 假設已定義 items_api_key = CfnApiKey(...)description="AppSync API Key")

2. 整體架構

在這里插入圖片描述

  • 定義一個graphql api
  • 為了安全訪問,定義一個api key
  • 定義一個api schema
    • 兩個查詢apiallget one
    • 定義兩個更新apideletesave
  • 定義了一個dynamo table,用來存儲數據
  • schema定義了四個resolver
    • all resovler
    • get one resolver
    • save resolver
    • delete resolver

3. 代碼詳細

3.1 定義api以及api key

 table_name = 'items'items_graphql_api = CfnGraphQLApi(self, 'ItemsApi',name='items-api',authentication_type='API_KEY')items_api_key = CfnApiKey(self, 'ItemsApiKey',api_id=items_graphql_api.attr_api_id)

在這里插入圖片描述

3.2 定義apischema

 api_schema = CfnGraphQLSchema(self, 'ItemsSchema',api_id=items_graphql_api.attr_api_id,definition=f"""\type {table_name} {{{table_name}Id: ID!name: String}}type Paginated{table_name} {{items: [{table_name}!]!nextToken: String}}type Query {{all(limit: Int, nextToken: String): Paginated{table_name}!getOne({table_name}Id: ID!): {table_name}}}type Mutation {{save(name: String!): {table_name}delete({table_name}Id: ID!): {table_name}}}type Schema {{query: Querymutation: Mutation}}""")

在這里插入圖片描述

3.3 定義dynamoDB table

 items_table = Table(self, 'ItemsTable',table_name=table_name,partition_key=Attribute(name=f'{table_name}Id',type=AttributeType.STRING),billing_mode=BillingMode.PAY_PER_REQUEST,stream=StreamViewType.NEW_IMAGE,# The default removal policy is RETAIN, which means that cdk# destroy will not attempt to delete the new table, and it will# remain in your account until manually deleted. By setting the# policy to DESTROY, cdk destroy will delete the table (even if it# has data in it)removal_policy=RemovalPolicy.DESTROY # NOT recommended for production code)

在這里插入圖片描述

3.4 定義dynamoDB訪問的role,以及data source

這里data source,可以看出是將graphql apidynamoDBtable進行關聯。

      items_table_role = Role(self, 'ItemsDynamoDBRole',assumed_by=ServicePrincipal('appsync.amazonaws.com'))items_table_role.add_managed_policy(ManagedPolicy.from_aws_managed_policy_name('AmazonDynamoDBFullAccess'))data_source = CfnDataSource(self, 'ItemsDataSource',api_id=items_graphql_api.attr_api_id,name='ItemsDynamoDataSource',type='AMAZON_DYNAMODB',dynamo_db_config=CfnDataSource.DynamoDBConfigProperty(table_name=items_table.table_name,aws_region=self.region),service_role_arn=items_table_role.role_arn)

在這里插入圖片描述

3.5 定義四個api resolver

3.5.1 get one resolver
        get_one_resolver = CfnResolver(self, 'GetOneQueryResolver',api_id=items_graphql_api.attr_api_id,type_name='Query',field_name='getOne',data_source_name=data_source.name,request_mapping_template=f"""\{{"version": "2017-02-28","operation": "GetItem","key": {{"{table_name}Id": $util.dynamodb.toDynamoDBJson($ctx.args.{table_name}Id)}}}}""",response_mapping_template="$util.toJson($ctx.result)")get_one_resolver.add_depends_on(api_schema)get_one_resolver.add_depends_on(data_source)

在這里插入圖片描述

3.5.2 all resolver
get_all_resolver = CfnResolver(self, 'GetAllQueryResolver',api_id=items_graphql_api.attr_api_id,type_name='Query',field_name='all',data_source_name=data_source.name,request_mapping_template=f"""\{{"version": "2017-02-28","operation": "Scan","limit": $util.defaultIfNull($ctx.args.limit, 20),"nextToken": $util.toJson($util.defaultIfNullOrEmpty($ctx.args.nextToken, null))}}""",response_mapping_template="$util.toJson($ctx.result)")get_all_resolver.add_depends_on(api_schema)get_all_resolver.add_depends_on(data_source)

在這里插入圖片描述

3.5.3 save resolver
        save_resolver = CfnResolver(self, 'SaveMutationResolver',api_id=items_graphql_api.attr_api_id,type_name='Mutation',field_name='save',data_source_name=data_source.name,request_mapping_template=f"""\{{"version": "2017-02-28","operation": "PutItem","key": {{"{table_name}Id": {{ "S": "$util.autoId()" }}}},"attributeValues": {{"name": $util.dynamodb.toDynamoDBJson($ctx.args.name)}}}}""",response_mapping_template="$util.toJson($ctx.result)")save_resolver.add_depends_on(api_schema)save_resolver.add_depends_on(data_source)
3.5.4 delete resolver
        delete_resolver = CfnResolver(self, 'DeleteMutationResolver',api_id=items_graphql_api.attr_api_id,type_name='Mutation',field_name='delete',data_source_name=data_source.name,request_mapping_template=f"""\{{"version": "2017-02-28","operation": "DeleteItem","key": {{"{table_name}Id": $util.dynamodb.toDynamoDBJson($ctx.args.{table_name}Id)}}}}""",response_mapping_template="$util.toJson($ctx.result)")delete_resolver.add_depends_on(api_schema)delete_resolver.add_depends_on(data_source)

在這里插入圖片描述

3.5.5 增加outputs

為了能夠得到graphql apiendpoint url,還有訪問api key,這里進行outputs的輸出

      CfnOutput(self, "AppSyncApiUrl",value=items_graphql_api.attr_graph_ql_url,description="AppSync GraphQL API URL")CfnOutput(self, "AppSyncApiKey",value=items_api_key.attr_api_key,  # 假設已定義 items_api_key = CfnApiKey(...)description="AppSync API Key")

4. 執行stack

4.1 執行stack

python -m venv ./venv
source .venv/Scripts/activate
pip install -r requirements.txt
cdk --require-approval never deploy

在這里插入圖片描述

4.2 使用postman進行api調用,更新和查詢dynamoDB table

4.2.1 生成GraphQL Request

在這里插入圖片描述

4.2.2 使用save進行數據做成

在這里插入圖片描述
authorizationtab上進行api key的設定。
在這里插入圖片描述
指定完畢,可以看到生成的數據中,已經生成了itemsID
在這里插入圖片描述

4.2.3 使用all進行數據查詢

在這里插入圖片描述

5. 及時cleanup

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/912942.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/912942.shtml
英文地址,請注明出處:http://en.pswp.cn/news/912942.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于微前端框架micro,子應用設置--el-primary-color失效的問題

設置了manualChunks導致失效,去掉即可,比較小眾的問題 下面是deepseek的分析 關于 manualChunks 導致 Element Plus 主題變量失效的問題 你找到的確實是問題的關鍵所在。這個 manualChunks 配置影響了 Element Plus 樣式和變量的加載順序,從而導致主題變量失效。…

MySQL 學習 之 你還在用 TIMESTAMP 嗎?

目錄 1. 弊端1.1. 取值范圍1.2. 時區依賴1.3. 隱式轉換 2. 區別3. 解決 1. 弊端 1.1. 取值范圍 TIMESTAMP 的取值范圍為 1970-01-01 00:00:01 UTC 到 2038-01-19 03:14:07 UTC,超出范圍的數據會被強制歸零或觸發異常?。 具體表現為在基金債券等業務中&#xff0…

java中字節和字符有何區別,為什么有字節流和字符流?

在Java中,字節(byte)和字符(char)是兩種不同的數據類型,它們的主要區別在于所表示的數據單位、用途以及編碼方式,字節流和字符流的區分就是為了解決編碼問題。 字節(byte)&#xff…

伴隨矩陣 線性代數

伴隨矩陣的定義 伴隨矩陣的作用是什么?我們可以看到其伴隨矩陣乘上自己等于一個數(自身的行列式)乘以E,所以對于一個方陣來說,其逆矩陣就是自己的伴隨矩陣的倍數。 所以說伴隨矩陣的作用就是用來更好的求解逆矩陣的。…

百勝軟件獲邀走進華為,AI實踐經驗分享精彩綻放

在數字化浪潮席卷全球的當下,零售行業正經歷著深刻變革,人工智能技術成為重塑行業格局的關鍵力量。6月26日,“走進華為——智領零售,AI賦能新未來”活動在華為練秋湖研發中心成功舉辦。百勝軟件作為數字零售深耕者,攜“…

六種扎根理論的編碼方法

一、實境編碼 1.概念:實境編碼是一種基于參與者原生語言的質性編碼方法,其核心在于直接采用研究對象在訪談、觀察或文本中使用的原始詞匯、短語或獨特表達作為分析代碼。該方法通過保留數據的"原生態"語言形式(如方言、隱喻、習慣用…

【Spring篇09】:制作自己的spring-boot-starter依賴1

文章目錄 1. Spring Boot Starter 的本質2. Starter 的模塊結構(推薦)3. 制作 xxx-spring-boot-autoconfigure 模塊3.1 添加必要的依賴3.2 編寫具體功能的配置類3.3 編寫自動化配置類 (AutoConfiguration)3.4 注冊自動化配置類 (.imports 或 spring.fact…

Qt6之qml自定義控件開發流程指南

Qt6之qml自定義控件開發流程指南 🛠? 一、基礎控件創建 定義 QML 文件 在工程中新建 QML 文件(如 CustomButton.qml),文件名首字母大寫。 使用基礎組件(如 Rectangle、Text)構建控件邏輯,通過…

Vue簡介,什么是Vue(Vue3)?

什么是Vue? Vue是一款用于構建用戶界面的JavaScript框架。 它基于標準HTML、CSS和JavaScript構建,并提供了一套聲明式的、組件化的編程模型,幫助你高效地開發用戶界面。無論是簡單的還是復雜地界面,Vue都可以勝任。 聲明式渲染…

從零開始構建Airbyte數據管道:PostgreSQL到BigQuery實戰指南

作為數據工程師,ETL(Extract, Transform, Load)流程是日常工作的核心。然而,構建和維護數據管道往往耗時且復雜。幸運的是,開源工具Airbyte提供了一種更便捷的解決方案——它支持350預構建連接器,允許通過無…

JavaScript的初步學習

目錄 JavaScript簡介 主要特點 主要用途 JavaScript的基本特性 JavaScript的引入方式 1. 內聯方式 (Inline JavaScript) 2. 內部方式 (Internal JavaScript / Embedded JavaScript) 3. 外部方式 (External JavaScript) JavaScript的語法介紹 1.書寫語法 2.輸出語句 3.…

洛谷P1379 八數碼難題【A-star】

P1379 八數碼難題 八數碼難題首先要進行有解性判定,避免無解情況下盲目搜索浪費時間。 有解性判定 P10454 奇數碼問題 題意簡述 在一個 n n n \times n nn 的網格中進行,其中 n n n 為奇數, 1 1 1 個空格和 [ 1 , n 2 ? 1 ] [1,n^2…

MySQL Buffer Pool 深度解析:從架構設計到性能優化(附詳細結構圖解)

在 MySQL 數據庫的世界里,有一個決定性能上限的"神秘倉庫"——Buffer Pool。它就像超市的貨架,把最常用的商品(數據)放在最方便拿取的地方,避免每次都要去倉庫(磁盤)取貨。今天我們就…

使用numpy的快速傅里葉變換的一些問題

離散傅里葉變換(DFT)的頻率(或波數)確實主要由采樣點數和物理步長決定。 最高波數和最小波長的乘積是1。單位長度內波的周期數。 (注意角波數是 k 2 π λ k \frac{2 \pi}{\lambda} kλ2π?) 使用numpy…

DVWA靶場通關筆記-CSRF(High級別)

目錄 一、CSRF Token 二、代碼審計(High級別) 1、滲透準備 2、源碼分析 三、滲透實戰 1、滲透準備 2、修改URL重放失敗 3、burpsuite嘗試重放失敗 4、安裝CSRF Token Tracker 5、安裝logger插件 6、配置CSRF Token Tracker 7、bp再次重放報文…

Redis實戰:數據安全與性能保障

數據安全 持久化策略 RDB持久化:通過創建快照將內存中的數據寫入到磁盤上的RDB文件中。可以在配置文件中設置save參數來指定在多少秒內有多少次寫操作時觸發快照保存。例如,save 900 1表示900秒內至少有1次寫操作時保存快照。 AOF持久化:將每…

人臉活體識別3:C/C++實現實時眨眼、張嘴、點頭、搖頭檢測

> 當AI能識破照片與真人的區別,我們才真正跨入生物識別安全時代 --- ### 一、活體檢測:數字世界的守門人 **傳統人臉識別的致命缺陷**: - 高清照片欺騙成功率 > 85% - 視頻回放攻擊成本 < $50 - 3D面具破解率高達72% **我們的解決方案**: ```mermaid graph …

【Linux】AlmaLinux 無法使用root用戶登錄cockpit控制臺問題解決

在虛擬機安裝AlmaLinux 9.6&#xff0c;安裝過程中需要允許使用root用戶和SSH協議登錄服務器。但是&#xff0c;在使用root用戶登錄cockpit管理后臺時&#xff0c;系統提示“權限被拒絕”。 經過查詢資料&#xff0c;可以通過下面的方法來解決此問題。 編輯 /etc/cockpit/disa…

【Java面試】講講HashMap的常用方法,以及底層實現?

1. 底層數據結構 數組鏈表紅黑樹&#xff08;JDK 1.8&#xff09;&#xff1a; 數組&#xff08;Node[] table&#xff09;存儲桶&#xff08;bucket&#xff09;&#xff0c;每個桶是鏈表或紅黑樹的頭節點。鏈表解決哈希沖突&#xff0c;當鏈表長度 ≥ 8 且數組容量 ≥ 64 時…

ToT:思維樹:借助大語言模型進行審慎的問題求解

摘要 語言模型正日益被部署于廣泛任務中的通用問題求解&#xff0c;但在推理階段仍受限于 token 級、從左到右的決策過程。這意味著在需要探索、戰略前瞻&#xff0c;或初始決策起關鍵作用的任務中&#xff0c;語言模型可能表現不佳。為克服這些挑戰&#xff0c;我們提出了一種…