設定閘道端點的自訂網域名稱
根據預設,閘道端點會以 格式提供 AWS受管網域名稱<gateway-id>.gateway.bedrock-agentcore.<region>.amazonaws.com。對於生產環境或建立更易於使用的體驗,您可能需要為閘道端點使用自訂網域名稱。本節會引導您使用 Amazon CloudFront 做為反向代理來設定自訂網域名稱。
先決條件
開始前,請確保您具備以下條件:
-
運作中的閘道端點
-
DNS 委派 (如果您的 Route 53 網域需要可公開存取)
-
AWS 安裝並設定 CDK (如果遵循 CDK 方法)
-
建立和管理 CloudFront 分佈、Route 53 託管區域和 ACM 憑證的適當 IAM 許可
解決方案概觀
此解決方案包含下列元件:
-
Route 53 託管區域 :管理自訂網域的 DNS 記錄
-
ACM 憑證 :為您的自訂網域提供 SSL/TLS 加密
-
CloudFront 分佈:充當反向代理,將請求從您的自訂網域轉送到閘道端點
-
Route 53 A Record:將您的自訂網域映射至 CloudFront 分佈
下列步驟將引導您使用 AWS CDK 設定這些元件。
實作步驟
步驟 1:建立 Route 53 託管區域
首先,為您的自訂網域建立 Route 53 託管區域:
import { RemovalPolicy } from 'aws-cdk-lib'; import { PublicHostedZone } from 'aws-cdk-lib/aws-route53'; const domainName = 'my.example.com'; const hostedZone = new PublicHostedZone(this, 'HostedZone', { zoneName: domainName, }); this.hostedZone.applyRemovalPolicy(RemovalPolicy.RETAIN);
注意
我們會套用 的移除政策RETAIN,以防止在堆疊更新或刪除期間意外刪除託管區域。
步驟 2:建立 DNS 驗證的憑證
接著,使用 Certificate Manager (ACM) 搭配 DNS 驗證,為您的自訂網域建立 SSL/TLS AWS 憑證:
import { RemovalPolicy } from 'aws-cdk-lib'; import { Certificate, CertificateValidation } from 'aws-cdk-lib/aws-certificatemanager'; const certificate = new Certificate(this, 'SSLCertificate', { domainName: domainName, // route53 hosted zone domain name from step 1 validation: CertificateValidation.fromDns(hostedZone), // route53 hosted zone from step 1 }); this.certificate.applyRemovalPolicy(RemovalPolicy.RETAIN);
DNS 驗證會自動在您的 Route 53 託管區域中建立必要的驗證記錄。
步驟 3:建立 CloudFront 分佈
建立 CloudFront 分佈,做為閘道端點的反向代理:
import { AllowedMethods, CachePolicy, Distribution, OriginProtocolPolicy, ViewerProtocolPolicy } from 'aws-cdk-lib/aws-cloudfront'; import { HttpOrigin } from 'aws-cdk-lib/aws-cloudfront-origins'; const bedrockAgentCoreGatewayHostName = '<mymcpserver>.gateway.bedrock-agentcore.<region>.amazonaws.com' const bedrockAgentCoreGatewayPath = '/mcp' // can also be left undefined, depending on your requirement const distribution = new Distribution(this, 'Distribution', { defaultBehavior: { origin: new HttpOrigin(bedrockAgentCoreGatewayHostName, { protocolPolicy: OriginProtocolPolicy.HTTPS_ONLY, originPath: bedrockAgentCoreGatewayPath, }), viewerProtocolPolicy: ViewerProtocolPolicy.HTTPS_ONLY, cachePolicy: CachePolicy.CACHING_DISABLED, // important since caching is enabled by default and hence is not suitable for a reverse proxy allowedMethods: AllowedMethods.ALLOW_ALL, }, domainNames: [domainName], // route53 hosted zone domain name from step 1 certificate: certificate, // ssl certificate for the route53 domain from step 2 });
重要
設定 cachePolicy: CachePolicy.CACHING_DISABLED 以確保 CloudFront 不會快取閘道端點的回應,這對於動態 API 互動很重要。
<mymcpserver> 將 取代為您的閘道 ID,並將 <region>取代為您的 AWS 區域 us-east-1 (例如 )。
步驟 4:建立 Route 53 A 記錄
建立 Route 53 將自訂網域指向 CloudFront 分佈的記錄:
import { ARecord, RecordTarget } from 'aws-cdk-lib/aws-route53'; import { CloudFrontTarget } from 'aws-cdk-lib/aws-route53-targets'; const aRecord = new ARecord(this, 'AliasRecord', { zone: hostedZone, // route53 hosted zone from step 1 recordName: domainName, // route53 hosted zone domain name from step 1 target: RecordTarget.fromAlias(new CloudFrontTarget(distribution)), // cloudfront distribution from step 3 });
這會建立別名記錄,將您的自訂網域映射至 CloudFront 分佈。
步驟 5:部署您的基礎設施
部署您的 CDK 堆疊以建立資源:
cdk deploy
部署程序可能需要一些時間,尤其是憑證驗證和 CloudFront 分佈建立。
測試您的自訂網域
部署基礎設施之後,請確認您的自訂網域已正確設定:
驗證 DNS 解析
使用 dig命令來驗證您的自訂網域是否解析為 CloudFront 分佈:
dig my.example.com
輸出應會顯示您的網域解析為 CloudFront 的 IP 地址。
驗證 SSL 憑證
使用 curl來驗證 SSL 憑證是否已正確設定:
curl -v https://my.example.com
輸出應會顯示成功的 SSL 交握,沒有憑證錯誤。
設定 MCP 用戶端
設定並驗證自訂網域後,您可以設定 MCP 用戶端來使用它:
游標組態
對於游標,請更新您的組態檔案:
{ "mcpServers": { "my-mcp-server": { "url": "https://my.example.com" } } }
其他 MCP 用戶端
對於原生不支援可串流 HTTP 的 MCP 用戶端:
{ "mcpServers": { "my-mcp-server": { "command": "/path/to/uvx", "args": [ "mcp-proxy", "--transport", "streamablehttp", "https://my.example.com" ] } } }
其他考量
- 成本影響
-
使用 CloudFront 做為反向代理會產生資料傳輸和請求處理的額外成本。檢閱 CloudFront 定價模型,以了解特定使用案例的成本影響。
- 安全考量
-
請考慮實作其他安全措施,例如:
-
保護您的端點免受常見 Web 入侵的 WAF 規則
-
限制存取特定地理區域的地理限制
-
自訂標頭或請求簽署,以新增額外的身分驗證層
-
- 監控和記錄
-
啟用 CloudFront 存取日誌並設定 CloudWatch 警示,以監控自訂網域設定的運作狀態和效能。
- 憑證續約
-
只要 DNS 記錄保持到位,透過 DNS 驗證發行的 ACM 憑證會自動續約。請確定您不會刪除驗證記錄。
- 具有自訂網域的 OAuth 保護資源端點
-
根據預設,
/.well-known/oauth-protected-resource端點會傳回資源 URL,其中包含閘道網域,而不是您的自訂網域。這可能會導致 OAuth 用戶端在使用自訂網域時驗證失敗。若要解決此問題,您可以實作 Lambda@Edge 函數來攔截 OAuth 探索回應,並使用正確的自訂網域 URL 產生新的回應。以下是方法:
-
使用 Lambda@Edge 搭配 ORIGIN_RESPONSE 事件類型 :建立在原始伺服器回應上觸發的函數,以攔截 OAuth 保護的資源端點回應。
-
產生新的回應 :Lambda@Edge 無法讀取原始伺服器回應內文,因此不使用修改現有的回應,而是使用自訂網域產生全新的 JSON 回應。
-
與 CloudFront 行為建立關聯 :將 Lambda@Edge 函數設定為專門針對
/.well-known/oauth-protected-resource路徑模式觸發。實作此解決方案後,OAuth 保護的資源端點將傳回正確的自訂網域:
curl https://my-custom-domain.com/.well-known/oauth-protected-resource { "authorization_servers": ["https://my-org.okta.com/oauth2/default"], "resource": "https://my-custom-domain.com/mcp" }注意
雖然 Lambda@Edge 為此問題提供了解決方案,但在未內建支援的情況下實作 AgentCore Gateway 的自訂網域,需要額外的複雜性,這些複雜性可能並非所有客戶都適合。將此方法視為解決方法,直到有自訂網域的 OAuth 探索原生支援可用為止。
-
疑難排解
- DNS 解析問題
-
如果您的自訂網域無法正確解析:
-
確認 A 記錄已在您的 Route 53 託管區域中正確設定
-
檢查網域的名稱伺服器是否已在網域註冊商正確設定
-
DNS 傳播的允許時間 (在某些情況下最多 48 小時)
-
- SSL 憑證問題
-
如果您遇到 SSL 憑證錯誤:
-
在 ACM 主控台中驗證憑證是否已發出並處於作用中狀態
-
檢查憑證是否正確與您的 CloudFront 分佈相關聯
-
確定憑證涵蓋您使用的確切網域名稱
-
- 閘道連線問題
-
如果您的自訂網域未連線至閘道:
-
驗證 CloudFront 分佈中的原始網域和路徑是否正確
-
檢查您的閘道端點是否可以直接存取
-
檢閱 CloudFront 分佈日誌是否有任何錯誤
-
結論
為您的閘道端點設定自訂網域名稱可增強應用程式的專業外觀,並提供管理 API 端點的彈性。透過遵循本指南中概述的步驟,您可以使用 CloudFront 作為反向代理來建立安全可靠的自訂網域組態。
如需閘道功能的詳細資訊,請參閱 Amazon Bedrock AgentCore Gateway:將工具和其他資源安全地連接到閘道。