開始使用記分範例應用程式 - AWS X-Ray

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

開始使用記分範例應用程式

本教學課程使用 Scorekeep 範例應用程式的xray-gettingstarted分支,該應用程式用 AWS CloudFormation 於建立和設定在 Amazon ECS 上執行範例應用程式和 X-Ray 精靈的資源。此應用程式會使用 Spring 架構來實作 JSON 網頁 API,並將資料保留 AWS SDK for Java 至 Amazon DynamoDB。應用程式中的 Servlet 篩選器會檢測應用程式提供的所有傳入請求,以及 AWS SDK 用戶端上的要求處理常式會向 DynamoDB 進行下游呼叫。

您可以使用 AWS Management Console 或遵循本自學課程 AWS CLI。

必要條件

本教學課程用 AWS CloudFormation 於建立和設定執行範例應用程式和 X-Ray 精靈的資源。在教學課程中安裝和執行需要下列先決條件:

  1. 如果您使用具有有限許可的 IAM 使用者,請在 IAM 主控台中新增以下使用者政策:

    • AWSCloudFormationFullAccess— 訪問和使用 CloudFormation

    • AmazonS3FullAccess-將模板文件上傳到 CloudFormation使用 AWS Management Console

    • IAMFullAccess— 創建 Amazon ECS 和 Amazon EC2 實例角色

    • AmazonEC2FullAccess— 創建 Amazon EC2 資源

    • AmazonDynamoDBFullAccess— 建立動 DynamoDB 料表

    • AmazonECS_FullAccess— 創建 Amazon ECS 資源

    • AmazonSNSFullAccess— 創建 Amazon SNS 主題

    • AWSXrayReadOnlyAccess— 允許在 X-Ray 控制台中查看跟踪圖和痕跡

  2. 若要使用執行教學課程 AWS CLI,請安裝 CLI 2.7.9 版或更新版本,並使用上一個步驟中的使用者設定 CLI。使用使用者進行設定時,請確定已 AWS CLI 設定區域。如果未設定區域,您將需要附加--region AWS-REGION至每個 CLI 命令。

  3. 請確定已安裝 Git,以便複製範例應用程式存放庫。

  4. 使用下列程式碼範例來複製 Scorekeep 儲存庫的xray-gettingstarted分支:

    git clone https://github.com/aws-samples/eb-java-scorekeep.git xray-scorekeep -b xray-gettingstarted

使用下列方式安裝記分應用程式 CloudFormation

AWS Management Console
使用安裝範例應用程式 AWS Management Console
  1. 開啟 CloudFormation 主控台

  2. 選擇 [建立堆疊],然後從下拉式功能表中選擇 [使用新資源]。

  3. Specify template (指定範本) 區段中,選擇 Upload a template file (上傳範本檔案)

  4. 擇選擇文件,導航到克隆 git repo 時創建的文件xray-scorekeep/cloudformation夾,然後選擇該cf-resources.yaml文件。

  5. 選擇 Next (下一步) 繼續。

  6. scorekeep入到堆棧名稱文本框,然後選擇下一頁在頁面底部繼續。請注意,本教程的其餘部分假定堆棧被命名為scorekeep

  7. 捲動至 [設定堆疊選項] 頁面底部,然後選擇 [下一步] 繼續。

  8. 捲動至 [檢] 頁面底部,選擇 CloudFormation 可能建立具有自訂名稱的 IAM 資源的確認核取方塊,然後選擇 [建立堆疊]。

  9. CloudFormation 堆棧現在正在創建。堆棧狀態將CREATE_IN_PROGRESS持續約五分鐘,然後再更改為CREATE_COMPLETE。狀態會定期重新整理,或者您可以重新整理頁面。

AWS CLI
使用安裝範例應用程式 AWS CLI
  1. 導覽至您先前在教學課程中複製的xray-scorekeep儲存庫cloudformation資料夾:

    cd xray-scorekeep/cloudformation/
  2. 輸入下列 AWS CLI 指令以建立 CloudFormation 堆疊:

    aws cloudformation create-stack --stack-name scorekeep --capabilities "CAPABILITY_NAMED_IAM" --template-body file://cf-resources.yaml
  3. 等到 CloudFormation 堆棧狀態為CREATE_COMPLETE,這將需要大約五分鐘。使用以下 AWS CLI 命令來檢查狀態:

    aws cloudformation describe-stacks --stack-name scorekeep --query "Stacks[0].StackStatus"

產生追蹤資料

範例應用程式包含前端 Web 應用程式。使用 Web 應用程式產生 API 的流量,並將追蹤資料傳送至 X-Ray。首先,使用 AWS Management Console 或來擷取 Web 應用程式 URL AWS CLI:

AWS Management Console
使用尋找應用程式 URL AWS Management Console
  1. 開啟 CloudFormation 主控台

  2. 從清單中選擇scorekeep堆疊。

  3. 選擇scorekeep堆疊頁面上的 [輸出] 索引標籤,然後選擇 LoadBalancerUrl URL 連結以開啟 Web 應用程式。

AWS CLI
使用尋找應用程式 URL AWS CLI
  1. 使用以下命令來顯示 Web 應用程序的 URL:

    aws cloudformation describe-stacks --stack-name scorekeep --query "Stacks[0].Outputs[0].OutputValue"
  2. 複製此 URL 並在瀏覽器中開啟,以顯示記分網頁應用程式。

使用 Web 應用程式產生追蹤資料
  1. 選擇 Create (建立) 來產生使用者及工作階段。

  2. 輸入 game name (遊戲名稱)、將 Rules (規則) 設為 Tic Tac Toe (井字遊戲),然後選擇 Create (建立)

  3. 選擇 Play (遊玩) 來啟動遊戲。

  4. 選擇一個磚來進行移動並變更遊戲狀態。

這些步驟中的每個步驟都會產生 API 的 HTTP 請求,並對 DynamoDB 產生下游呼叫,以讀取和寫入使用者、工作階段、遊戲、移動和狀態資料。

在「」中檢視軌跡圖 AWS Management Console

您可以在 X-Ray 和 CloudWatch 主控台中查看範例應用程式產生的軌跡圖和軌跡。

X-Ray console
使用 X-Ray 控制台
  1. 開啟 X-Ray 主控台的追蹤地圖頁面。

  2. 主控台會顯示 X-Ray 從應用程式傳送的追蹤資料所產生的服務圖表。請務必視需要調整追蹤對應的時間週期,以確保它會顯示自您第一次啟動 Web 應用程式以來的所有追蹤。

    X-Ray 軌跡圖時間週期

追蹤對應會顯示網路應用程式用戶端、在 Amazon ECS 中執行的 API,以及應用程式使用的每個 DynamoDB 表格。每個向應用程式發出的請求都會在命中 API 時受到追蹤、產生向下游服務發出的請求並完成,其數量上限為可設定的每秒請求數量上限。

您可以在服務圖表中選擇任何節點來檢視產生流量至該節點的請求追蹤。目前,Amazon SNS 節點為黃色。向下切入來了解原因。

X-Ray 控制台跟踪圖頁面
尋找錯誤原因
  1. 選擇名為 SNS 的節點。此時會顯示節點詳細資料面板。

  2. 選擇 View traces (檢視追蹤) 以存取 Trace overview (追蹤概觀) 畫面。

  3. Trace list (追蹤清單) 中選擇追蹤。此追蹤不具有方法或 URL,因為它是在啟動期間,而非回應傳入請求時記錄。

    從 Trace list (追蹤清單) 選擇追蹤
  4. 在頁面底部的 Amazon SNS 區段中選擇錯誤狀態圖示,以開啟 SNS 子區段的「例外」頁面。

    選擇錯誤狀態圖示以開啟 Amazon SNS 子區段的例外頁面
  5. X-Ray SDK 會自動擷取已檢測的 AWS SDK 用戶端所擲回的例外狀況,並記錄堆疊追蹤。

    顯示擷取到的異常及記錄堆疊追蹤的 Exceptions (異常) 標籤
CloudWatch console
使用主 CloudWatch 控台
  1. 開啟主控台的 X-Ray 追蹤對應頁 CloudWatch 面。

  2. 主控台會顯示 X-Ray 從應用程式傳送的追蹤資料所產生的服務圖表。請務必視需要調整追蹤對應的時間週期,以確保它會顯示自您第一次啟動 Web 應用程式以來的所有追蹤。

    CloudWatch 追蹤對映期間

追蹤對應會顯示網路應用程式用戶端、在 Amazon EC2 中執行的 API,以及應用程式使用的每個 DynamoDB 表格。每個向應用程式發出的請求都會在命中 API 時受到追蹤、產生向下游服務發出的請求並完成,其數量上限為可設定的每秒請求數量上限。

您可以在服務圖表中選擇任何節點來檢視產生流量至該節點的請求追蹤。目前,Amazon SNS 節點是橙色的。向下切入來了解原因。

X-Ray 控制台跟踪圖頁面
尋找錯誤原因
  1. 選擇名為 SNS 的節點。SNS 節點詳細資訊面板顯示在地圖下方。

  2. 選擇檢視追蹤來存取「追蹤」頁面。

  3. 添加頁面底部,從跟踪列表中選擇跟。此追蹤不具有方法或 URL,因為它是在啟動期間,而非回應傳入請求時記錄。

    從 Trace list (追蹤清單) 選擇追蹤
  4. 選擇區段時間表底部的 Amazon SNS 子區段,然後選擇 SNS 子區段的「例外」索引標籤以檢視例外詳細資訊。

    檢視 Amazon SNS 子區段的例外標籤

原因指出在 WebConfig 類別中對 createSubscription 發出的呼叫內所提供的電子郵件地址無效。在下一節中,我們將修正此問題。

設定 Amazon SNS 通知

記分保持使用者完成遊戲時,會使用 Amazon SNS 傳送通知。當應用程式啟動時,它會嘗試為 CloudFormation 堆疊參數中定義的電子郵件地址建立訂閱。該呼叫目前失敗。設定通知電子郵件以啟用通知,並解決追蹤對映中反白顯示的失敗項目。

AWS Management Console
若要使用設定 Amazon SNS 通知 AWS Management Console
  1. 開啟 CloudFormation 主控台

  2. 選擇清單中scorekeep堆疊名稱旁邊的圓形按鈕,然後選擇 [更新]。

  3. 確定已選取 [使用目前的範本],然後按 [更新堆疊] 頁面上的 [下一步]。

  4. 在清單中找到「電子郵件」參數,並以有效的電子郵件地址取代預設值。

    更新電郵設定
  5. 向下捲動到頁面底部並選擇 Next (下一步)。

  6. 捲動至 [檢] 頁面底部,選擇 CloudFormation 可能建立具有自訂名稱的 IAM 資源的確認核取方塊,然後選擇 [更新堆疊]。

  7. CloudFormation 堆棧現在正在更新。堆棧狀態將UPDATE_IN_PROGRESS持續約五分鐘,然後再更改為UPDATE_COMPLETE。狀態會定期重新整理,或者您可以重新整理頁面。

AWS CLI
若要使用設定 Amazon SNS 通知 AWS CLI
  1. 導覽至您先前建立的xray-scorekeep/cloudformation/資料夾,然後在文字編輯器中開啟cf-resources.yaml檔案。

  2. 在「電子郵件」參數中尋找Default值,並將其從 UPDATE_ME 變更為有效的電子郵件地址。

    Parameters: Email: Type: String Default: UPDATE_ME # <- change to a valid abc@def.xyz email address
  3. cloudformation資料夾中,使用下列 AWS CLI 命令更新 CloudFormation 堆疊:

    aws cloudformation update-stack --stack-name scorekeep --capabilities "CAPABILITY_NAMED_IAM" --template-body file://cf-resources.yaml
  4. 等到 CloudFormation 堆棧狀態為止UPDATE_COMPLETE,這將需要幾分鐘的時間。使用以下 AWS CLI 命令來檢查狀態:

    aws cloudformation describe-stacks --stack-name scorekeep --query "Stacks[0].StackStatus"

更新完成時,Scorekeep 會重新啟動並建立 SNS 主題訂閱。檢查您的電子郵件以確認訂閱,在您完成遊戲時查看更新。開啟追蹤對應,確認對 SNS 的呼叫不再失敗。

探索範例應用程式

範例應用程式是 Java 中的 HTTP 網頁 API,其設定為使用適用於 Java 的 X-Ray SDK。當您使用 CloudFormation 範本部署應用程式時,它會建立 DynamoDB 表、Amazon ECS 叢集,以及在 ECS 上執行記分所需的其他服務。ECS 的任務定義檔案是透過 CloudFormation建立的。此檔案定義 ECS 叢集中每項工作所使用的容器映像。這些圖像是從官方 X-Ray 公共 ECR 獲得的。得分保持 API 容器映像具有使用搖籃編譯的 API。Scorekeep 前端容器的容器映像使用 nginx 代理服務器為前端提供服務。此伺服器會將要求路由傳送至以 /api 開頭的路徑至 API。

為了檢測傳入 HTTP 請求,應用程式會新增軟體開發套件提供的 TracingFilter

範例 src /主/爪/記分/. Java-服務程序過濾器 WebConfig
import javax.servlet.Filter; import com.amazonaws.xray.javax.servlet.AWSXRayServletFilter; ... @Configuration public class WebConfig { @Bean public Filter TracingFilter() { return new AWSXRayServletFilter("Scorekeep"); } ...

此篩選條件會傳送應用程式處理的所有傳入請求相關追蹤資料,包括請求 URL、方法、回應狀態、開始時間及結束時間。

此應用程式也會使用. AWS SDK for Java為了測量這些調用,應用程序只需將 AWS SDK 相關的子模塊作為依賴關係,Java 的 X-Ray SDK 會自動檢測所有 AWS SDK 客戶端。

該應用程序Docker使用與Gradle Docker ImageScorekeep API Dockerfile文件實例構建源代碼,以運行 Gradle 在其中生成的可執行 JAR。ENTRYPOINT

範例 使用碼頭通過搖籃碼頭圖像構建
docker run --rm -v /PATH/TO/SCOREKEEP_REPO/home/gradle/project -w /home/gradle/project gradle:4.3 gradle build
範例 碼頭檔入口點
ENTRYPOINT [ "sh", "-c", "java -Dserver.port=5000 -jar scorekeep-api-1.0.0.jar" ]

build.gradle 檔案會在編譯期間,透過將其宣告為依存項目,來從 Maven 下載軟體開發套件子模組。

範例 build.gradle -- 相依性
... dependencies { compile("org.springframework.boot:spring-boot-starter-web") testCompile('org.springframework.boot:spring-boot-starter-test') compile('com.amazonaws:aws-java-sdk-dynamodb') compile("com.amazonaws:aws-xray-recorder-sdk-core") compile("com.amazonaws:aws-xray-recorder-sdk-aws-sdk") compile("com.amazonaws:aws-xray-recorder-sdk-aws-sdk-instrumentor") ... } dependencyManagement { imports { mavenBom("com.amazonaws:aws-java-sdk-bom:1.11.67") mavenBom("com.amazonaws:aws-xray-recorder-sdk-bom:2.11.0") } }

核心、 AWS SDK 和 AWS SDK 儀器子模組都是自動檢測使用 SDK 進行的任何下游呼叫所需的全部功能。 AWS

若要將原始區段資料轉送至 X-Ray API,X-Ray 精靈需要監聽 UDP 連接埠 2000 上的流量。為此,應用程序將 X-Ray 守護程序在一個容器中運行,該容器與 ECS 上的 Scorekeep 應用程序一起部署為附屬容器。如需詳細資訊,請查看 X-Ray 精靈主題。

範例 ECS 任務定義中的 X-Ray 精靈容器定義
... Resources: ScorekeepTaskDefinition: Type: AWS::ECS::TaskDefinition Properties: ContainerDefinitions: ... - Cpu: '256' Essential: true Image: amazon/aws-xray-daemon MemoryReservation: '128' Name: xray-daemon PortMappings: - ContainerPort: '2000' HostPort: '2000' Protocol: udp ...

Java 的 X-Ray SDK 提供了一個名為的類AWSXRay,它提供了全局記錄器TracingHandler,您可以使用它來檢測代碼。您可以設定全域記錄器來自訂為傳入 HTTP 呼叫建立區段的 AWSXRayServletFilter。範例包括 WebConfig 類別中的靜態區塊,該區塊會使用外掛程式和抽樣規則設定全域記錄器。

範例 src /主/爪/記分/ .java-記錄器 WebConfig
import com.amazonaws.xray.AWSXRay; import com.amazonaws.xray.AWSXRayRecorderBuilder; import com.amazonaws.xray.javax.servlet.AWSXRayServletFilter; import com.amazonaws.xray.plugins.ECSPlugin; import com.amazonaws.xray.plugins.EC2Plugin; import com.amazonaws.xray.strategy.sampling.LocalizedSamplingStrategy; ... @Configuration public class WebConfig { ... static { AWSXRayRecorderBuilder builder = AWSXRayRecorderBuilder.standard().withPlugin(new ECSPlugin()).withPlugin(new EC2Plugin()); URL ruleFile = WebConfig.class.getResource("/sampling-rules.json"); builder.withSamplingStrategy(new LocalizedSamplingStrategy(ruleFile)); AWSXRay.setGlobalRecorder(builder.build()); ... } }

此範例使用建立器從名為 sampling-rules.json 的檔案載入抽樣規則。抽樣規則會判斷軟體開發套件記錄傳入請求區段的速率。

範例 src/main/java/resources/sampling-rules.json
{ "version": 1, "rules": [ { "description": "Resource creation.", "service_name": "*", "http_method": "POST", "url_path": "/api/*", "fixed_target": 1, "rate": 1.0 }, { "description": "Session polling.", "service_name": "*", "http_method": "GET", "url_path": "/api/session/*", "fixed_target": 0, "rate": 0.05 }, { "description": "Game polling.", "service_name": "*", "http_method": "GET", "url_path": "/api/game/*/*", "fixed_target": 0, "rate": 0.05 }, { "description": "State polling.", "service_name": "*", "http_method": "GET", "url_path": "/api/state/*/*/*", "fixed_target": 0, "rate": 0.05 } ], "default": { "fixed_target": 1, "rate": 0.1 } }

抽樣規則檔案會定義四個自訂抽樣規則及預設規則。針對每個傳入請求,軟體開發套件會依照定義規則的順序評估自訂規則。軟體開發套件會套用第一個與請求方法、路徑及服務名稱相符的規則。針對 Scorekeep,第一個規則會透過以 1.0 的速率每秒套用一個請求的單一固定目標,或是在滿足固定目標之後套用 100% 的請求,來追補所有 POST 請求 (資源建立呼叫)。

其他三個自訂規則會在沒有指向工作階段、遊戲和狀態讀取 (GET 請求) 固定目標的情況下套用 5% 的速率 這會將前端為了確保內容處於最新狀態,每幾秒鐘自動發出定期呼叫的追蹤數量降至最低。針對所有其他請求,檔案會定義每秒單一請求的預設速率及 10% 的速率。

範例應用程式也會示範如何使用進階功能 (例如手動軟體開發套件用戶端檢測、建立額外子區段及傳出 HTTP 呼叫)。如需詳細資訊,請參閱 AWS X-Ray 範例應用

選用:最低權限政策

Scorekeep ECS 容器會使用完整存取原則 (例如和) 存取資源。AmazonSNSFullAccess AmazonDynamoDBFullAccess使用完整存取原則不是生產應用程式的最佳作法。下列範例會更新 DynamoDB 身分與存取權管理政策,以改善應用程式的安全性。若要進一步了解 IAM 政策中的安全最佳實務,請參閱 AWS X-Ray 的身分識別與存取管理

範例 CF-資源管理模板 ECS 定義 TaskRole
ECSTaskRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: "Allow" Principal: Service: - "ecs-tasks.amazonaws.com" Action: - "sts:AssumeRole" ManagedPolicyArns: - "arn:aws:iam::aws:policy/AmazonDynamoDBFullAccess" - "arn:aws:iam::aws:policy/AmazonSNSFullAccess" - "arn:aws:iam::aws:policy/AWSXrayFullAccess" RoleName: "scorekeepRole"

若要更新您的原則,請先識別 DynamoDB 資源的 ARN。然後,您可以在自訂 IAM 政策中使用 ARN。最後,您將該政策套用至您的執行個體設定檔。

若要識別動態資源的 ARN,請執行下列動作:
  1. 開啟 DynamoDB 主控台

  2. 從左側導覽列選擇 [表格]。

  3. 選擇任一項scorekeep-*來顯示表格詳細資訊頁面。

  4. 在 [觀] 索引標籤下,選擇 [其他資訊] 以展開區段並檢視 Amazon 資源名稱 (ARN)。複製這個值。

  5. 將 ARN 插入下列 IAM 政策,並以您的特定區域AWS_REGION和帳戶 ID 取代和AWS_ACCOUNT_ID值。這個新策略只允許指定的處理行動,而不允許任何動作的AmazonDynamoDBFullAccess策略。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "ScorekeepDynamoDB", "Effect": "Allow", "Action": [ "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:GetItem", "dynamodb:Scan", "dynamodb:Query" ], "Resource": "arn:aws:dynamodb:<AWS_REGION>:<AWS_ACCOUNT_ID>:table/scorekeep-*" } ] }

    應用程式建立的資料表遵循一致的命名慣例。您可以使用此scorekeep-*格式來表示所有「計分保留」表格。

變更您的 IAM 政策
  1. 從 IAM 主控台開啟記分任務角色 (記分項目)。

  2. 選擇AmazonDynamoDBFullAccess策略旁邊的核取方塊,然後選擇 [移除] 以移除此原則。

  3. 選擇 [新增權限],然後選取 [附加原則],最後選取 [建立原則

  4. 選擇 JSON 選項卡並粘貼到上面創建的策略中。

  5. 選擇下一步:頁面底部的標籤

  6. 選擇「下一步」:頁面底部的「檢閱」。

  7. 對於名稱,指定策略的名稱。

  8. 選擇頁面底部的 [建立原則]。

  9. 將新建立的原則附加至scorekeepRole角色。附加的原則可能需要幾分鐘的時間才會生效。

如果您已將新原則附加至scorekeepRole角色,則必須先將其中斷連結,然後再刪除 CloudFormation 堆疊,因為此連結的原則會封鎖堆疊遭到刪除。可透過刪除原則來自動卸離原則。

移除您的自訂 IAM 政策
  1. 開啟 IAM 主控台

  2. 從左側導覽列選擇「策略」。

  3. 搜尋您先前在本節中建立的自訂原則名稱,然後選擇原則名稱旁邊的圓鈕將其反白顯示。

  4. 選擇動作下拉式清單,然後選擇刪除

  5. 輸入自訂原則的名稱,然後選擇 [刪] 以確認刪除。這會自動將原則與scorekeepRole角色中斷連結。

清除

請依照下列步驟刪除「記分」應用程式資源:

注意

如果您使用本教學課程的前一節建立並附加自訂原則,則必須先從中移除原則,scorekeepRole然後再刪除 CloudFormation 堆疊。

AWS Management Console
使用刪除範例應用程式 AWS Management Console
  1. 開啟 CloudFormation 主控台

  2. 選擇清單中scorekeep堆疊名稱旁邊的圓形按鈕,然後選擇 [刪除]。

  3. CloudFormation 堆棧現在被刪除。堆疊狀態會持續幾DELETE_IN_PROGRESS分鐘,直到刪除所有資源為止。狀態會定期重新整理,或者您可以重新整理頁面。

AWS CLI
使用刪除範例應用程式 AWS CLI
  1. 輸入下列 AWS CLI 指令以刪除 CloudFormation 堆疊:

    aws cloudformation delete-stack --stack-name scorekeep
  2. 等到 CloudFormation 堆棧不再存在,這將需要大約五分鐘。使用以下 AWS CLI 命令來檢查狀態:

    aws cloudformation describe-stacks --stack-name scorekeep --query "Stacks[0].StackStatus"

後續步驟

在下一章中了解有關 X-Ray 的更多信息,AWS X-Ray 概念.

要檢測您自己的應用程序,請進一步了解 Java 的 X-Ray SDK 或其他 X-Ray SDK 之一:

若要在本機或上執行 X-Ray 精靈 AWS,請參閱AWS X-Ray 守護進

若要參閱上的範例應用程式 GitHub,請參閱eb-java-scorekeep