
- TOP
- ã¿ã°äžèЧ
- Python
Python
Pythonã¯æç¢ºã§èªã¿ãããæ§æãæã£ãŠãããããããã°ã©ãã³ã°åå¿è ã«ãããããã®èšèªã§ãããŸãå€ãã®ã³ãã¥ããã£ãããããããããã©ã€ãã©ãªéçºããã¬ãŒã ã¯ãŒã¯éçºã«è²¢ç®ããŠããŸãã
ã€ãã³ã
ãã¬ãžã³
æè¡ããã°
G-gen ã®åå³¶ã§ããåœèšäºã§ã¯ãGemini Enterprise Agent Platform ãš Cloud Monitoring ã® MCP ãµãŒããŒãçµã¿åãããŠããšã©ãŒãã°ã®æ€ç¥ãã AI ã«ããåå åæãSlack éç¥ãŸã§ãèªååããŸãã ã¯ããã« Gemini Enterprise Agent Platform ãšã¯ MCPïŒModel Context ProtocolïŒãšã¯ åœèšäºã«ã€ããŠ èæ¯ãšæ§æ æ¬æ§æã®çã ã·ã¹ãã ã®æ§æ ç°å¢æ§ç¯ ç°å¢å€æ°ã®èšå® API ã®æå¹å ãã°ã«ãŒãã£ã³ã°ã®èšå® ãµãŒãã¹ã¢ã«ãŠã³ããš IAM ããŒã« ã¢ããªã±ãŒã·ã§ã³ã®å®è£
ãã£ã¬ã¯ããªæ§æ requirements.txt main.py ãœãŒã¹ã³ãŒãã®è§£èª¬ Cloud Run functions ãžã®ããã〠ãããã€ã³ãã³ãã®å®è¡ Cloud Run ã®åŒã³åºãæš©éã®ä»äž åäœç¢ºèª ã¯ããã« Gemini Enterprise Agent Platform ãšã¯ 2026幎4æçŸåšã Gemini Enterprise Agent Platform ïŒä»¥äžãAgent PlatformïŒã¯ãGoogle Cloud ãæäŸãã AI ãšãŒãžã§ã³ãã®æ§ç¯ã»éçšã®ããã®çµ±åãã©ãããã©ãŒã ïŒãããã¯ã矀ïŒã§ãã å幎4æã® Google Cloud Next '26 ã§ãåŸæ¥ã® Vertex AI ããåç§°å€æŽãããŸãããAgent Platform ã¯ããšãŒãžã§ã³ãã®éçºãã¹ã±ãŒã«ãã¬ããã³ã¹ãæé©åã®ããã®ãããã¯ã矀ã§ãããšãããŸãã MCPïŒModel Context ProtocolïŒãšã¯ Model Context Protocol ïŒä»¥äžã MCP ïŒã¯ãAI ã¢ãã«ãå€éšããŒã«ãåŒã³åºãããã®æšæºãããã³ã«ã§ãã Google Cloud ã§ã¯ãCloud Monitoring ã Cloud Logging ãªã©ã®äž»èŠãµãŒãã¹åãã«ããã«ãããŒãžããªãªã¢ãŒã MCP ãµãŒããŒã§ãã Google Cloud MCP Servers ãæäŸãããŠããŸããåœèšäºã®æ§æã§ã¯ãAI ã¢ãã«ããã® MCP ãµãŒããŒçµç±ã§ Cloud Monitoring ã®ã¡ããªã¯ã¹ãããŒã«ãšããŠèªåŸçã«åŒã³åºããåå åæã«äœ¿çšããŸãã åè : Google Cloud MCP servers overview åè : MCP Reference: monitoring.googleapis.com Google Cloud MCP Servers ã®æŠèŠãèªèšŒæ¹åŒã®è©³çްã«ã€ããŠã¯ã以äžã®èšäºãåç
§ããŠãã ããã blog.g-gen.co.jp åœèšäºã«ã€ã㊠åœèšäºã§ã¯ãCloud Logging ã§ severity >= ERROR ã®ãã°ãæ€ç¥ããéã«ãGemini ã¢ãã«ã MCP ãµãŒããŒçµç±ã§é¢é£ã¡ããªã¯ã¹ãååŸããCloud Logging ã®é¢é£ãã°ã暪æçã«æ€çŽ¢ããããã§ãåå ã®ä»®èª¬ãšå¯ŸåŠã¢ã¯ã·ã§ã³ã Slack ã«éç¥ãã AI ãšãŒãžã§ã³ããæ§ç¯ããŸãã ãªããåœèšäºã®æ§æã§äœ¿çšãã Cloud Run functions ã®å
šäœåã«ã€ããŠã¯ä»¥äžã®èšäºãåç
§ããŠãã ããã blog.g-gen.co.jp èæ¯ãšæ§æ æ¬æ§æã®çã Cloud Monitoring ã®æšæºã® ã¢ã©ãŒã æ©èœã§ãããããå€ããŒã¹ã§ã®éç¥ã Error Reporting ã«ãããšã©ãŒéèšã¯å¯èœã§ãããããããããã¯ãäœãèµ·ãããããäŒããŠããããã®ã®ãããªãèµ·ããã®ãããã©ã察åŠãã¹ããããŸã§ã¯æããŠãããŸããã ãšã©ãŒçºçæã«ã¡ããªã¯ã¹ãšãã°ã暪æçã«ç¢ºèªããæ ¹æ¬åå ã®ä»®èª¬ãç«ãŠããšããäœæ¥ã¯ãäŸç¶ãšããŠãšã³ãžãã¢ã®æäœæ¥ã«äŸåããŠããŸããåœæ§æã§ã¯ããã®äžæ¬¡åãåãã®äœæ¥ã AI ãšãŒãžã§ã³ãã«å§è²ããããšã§ã察å¿ã®ãªãŒãã¿ã€ã ççž®ãçããŸãã ã·ã¹ãã ã®æ§æ ãŠãŒã¶ãŒåŽã§ severity >= ERROR ã®ãã°ã Cloud Logging ã«æžã蟌ãŸãããšããã°ã·ã³ã¯ãçµç±ã㊠Pub/Sub ã«ã¡ãã»ãŒãžã転éãããŸãã Pub/Sub ã®ã¡ãã»ãŒãžãåä¿¡ãã Cloud Run functions ã¯ãAgent Platform çµç±ã§ Gemini ã¢ãã«ãåŒã³åºããŸãã Gemini ã¢ãã«ã¯ MCP ãµãŒããŒçµç±ã§ Cloud Monitoring ããã¡ããªã¯ã¹ãååŸããããã« Cloud Logging ããé¢é£ãã°ãæ€çŽ¢ããªãããåå ã®ä»®èª¬ãšå¯ŸåŠã¢ã¯ã·ã§ã³ãçæã Slack ãžéç¥ããŸãã æ§æå³ ãªããPub/Sub ãäžå¿ãšããççµåã¢ãŒããã¯ãã£ã®èãæ¹ããCloud Logging ã®ãã°ã«ãŒã¿ãŒïŒã·ã³ã¯ïŒã®ä»çµã¿ã®è©³çްã«ã€ããŠã¯ã以äžã®èšäºãåç
§ããŠãã ããã blog.g-gen.co.jp blog.g-gen.co.jp ç°å¢æ§ç¯ ç°å¢å€æ°ã®èšå® 以éã®ã³ãã³ãã§äœ¿çšããç°å¢å€æ°ãèšå®ããŸãã PROJECT_ID ãš SLACK_WEBHOOK_URL ã¯ãå®éã®ç°å¢ã«åãããŠå€æŽããŠãã ããã export PROJECT_ID = " your-project-id " export REGION = " asia-northeast1 " export TOPIC_NAME = " error-alerts-topic " export SINK_NAME = " error-logs-sink " export SA_NAME = " ai-ops-agent-sa " export SA_EMAIL = " ${SA_NAME} @ ${PROJECT_ID} .iam.gserviceaccount.com " export SLACK_WEBHOOK_URL = " https://hooks.slack.com/services/xxxx/xxxx/xxxx " API ã®æå¹å 察象ãããžã§ã¯ããã»ããããå¿
èŠãª API ãæå¹åããŸãã gcloud config set project $PROJECT_ID gcloud services enable \ logging.googleapis.com \ pubsub.googleapis.com \ cloudfunctions.googleapis.com \ run.googleapis.com \ aiplatform.googleapis.com \ monitoring.googleapis.com \ cloudbuild.googleapis.com \ eventarc.googleapis.com äž»èŠãª API ã®åœ¹å²ã¯ä»¥äžã®éãã§ãã API åœ¹å² logging.googleapis.com ãšã©ãŒãã°ãæ€ç¥ããPub/Sub ãžã«ãŒãã£ã³ã°ãã pubsub.googleapis.com ãšã©ãŒãã°ãåãåããCloud Run functions ã«éç¥ãã cloudfunctions.googleapis.com éç¥ãããªã¬ãŒã«åæåŠçãå®è¡ãã aiplatform.googleapis.com Gemini ã¢ãã«ã§ãšã©ãŒã®åå åæãè¡ã monitoring.googleapis.com MCP ãµãŒããŒçµç±ã§ã¡ããªã¯ã¹ãåç
§ãã ãã°ã«ãŒãã£ã³ã°ã®èšå® Cloud Logging ãã Pub/Sub ãžãšã©ãŒãã°ã転éããããã® ãã°ã·ã³ã¯ ãš Pub/Sub ããã㯠ãäœæããŸãã # Pub/Sub ãããã¯ã®äœæ gcloud pubsub topics create $TOPIC_NAME # ãã°ã·ã³ã¯ã®äœæïŒãã¹ãçšãã°ã®ã¿è»¢éïŒ gcloud logging sinks create $SINK_NAME \ pubsub.googleapis.com/projects/ $PROJECT_ID /topics/ $TOPIC_NAME \ --log-filter =" severity>=ERROR AND logName= \" projects/ ${PROJECT_ID} /logs/my-test-log \" " --log-filter ã§ logName ã my-test-log ã«éå®ããããšã§ãåäœç¢ºèªçšã®ãã°ã ãã Pub/Sub ã«è»¢éããæ§æã«ããŠããŸããæ¬çªéçšã§ã¯ãã®ãã£ã«ã¿ãå®éã®ãµãŒãã¹ãã°ã«åãããŠå€æŽããŠãã ããã ç¶ããŠããã°ã·ã³ã¯ã Pub/Sub ã«æžã蟌ããããããã°ã·ã³ã¯ã®ãµãŒãã¹ã¢ã«ãŠã³ãã« Publisher æš©éãä»äžããŸãã SINK_SA = $( gcloud logging sinks describe $SINK_NAME --format =' value(writerIdentity) ' ) gcloud pubsub topics add-iam-policy-binding $TOPIC_NAME \ --member = $SINK_SA \ --role = roles/pubsub.publisher ãµãŒãã¹ã¢ã«ãŠã³ããš IAM ããŒã« Cloud Run functions ã Agent PlatformãCloud MonitoringãMCP ã䜿çšããããã®ãµãŒãã¹ã¢ã«ãŠã³ããäœæããå¿
èŠãªããŒã«ãä»äžããŸãã # ãµãŒãã¹ã¢ã«ãŠã³ãã®äœæ gcloud iam service-accounts create $SA_NAME \ --display-name =" AI Ops Agent " || true # Agent Platform ãŠãŒã¶ãŒ gcloud projects add-iam-policy-binding $PROJECT_ID \ --member =" serviceAccount: ${SA_EMAIL} " \ --role =" roles/aiplatform.user " # Monitoring é²èЧè
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member =" serviceAccount: ${SA_EMAIL} " \ --role =" roles/monitoring.viewer " # ãã°é²èЧè
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member =" serviceAccount: ${SA_EMAIL} " \ --role =" roles/logging.viewer " # MCP ããŒã«ãŠãŒã¶ãŒ gcloud projects add-iam-policy-binding $PROJECT_ID \ --member =" serviceAccount: ${SA_EMAIL} " \ --role =" roles/mcp.toolUser " åããŒã«ã®ç®çã¯ä»¥äžã®éãã§ãã ããŒã« ç®ç Agent Platform ãŠãŒã¶ãŒïŒ roles/aiplatform.user ïŒ Gemini ã¢ãã«ã®åŒã³åºã Monitoring é²èЧè
ïŒ roles/monitoring.viewer ïŒ MCP çµç±ã§ã®ã¡ããªã¯ã¹ååŸ ãã°é²èЧè
ïŒ roles/logging.viewer ïŒ é¢é£ãã°ã®åç
§ MCP ããŒã«ãŠãŒã¶ãŒïŒ roles/mcp.toolUser ïŒ MCP ããŒã«ã®åŒã³åºã ãªããGoogle Cloud ã® MCP ãµãŒããŒã¯ãMCP ãããã³ã«èªäœãåŒã³åºãæš©éïŒ roles/mcp.toolUser ïŒããšã察象ãµãŒãã¹ã®ããŒã¿ãåç
§ããæš©éïŒ roles/monitoring.viewer ãªã©ïŒãã®äºæ®µéã®èªå¯ã§ä¿è·ãããŠããŸããäž¡æ¹ãä»äžããå¿
èŠãããç¹ã«æ³šæããŠãã ããã ã¢ããªã±ãŒã·ã§ã³ã®å®è£
ãã£ã¬ã¯ããªæ§æ 以äžã®æ§æã§ãã¡ã€ã«ãäœæããŸãã ai-ops-functionïŒä»»æã®ãã©ã«ãåïŒ âââ main.py âââ requirements.txt requirements.txt å¿
èŠãªã©ã€ãã©ãªãå®çŸ©ããŸãã functions-framework==3.* google-cloud-pubsub google-cloud-logging google-genai google-auth requests main.py main.py ã¯ãPub/Sub ããåãåã£ããšã©ãŒãã°ã Gemini ã«è§£æãããSlack ã«éç¥ããã¢ããªã±ãŒã·ã§ã³æ¬äœã§ãã import base64 import json import os from datetime import datetime, timedelta, timezone import requests from google import genai from google.cloud import logging_v2 import google.auth from google.auth.transport.requests import Request SLACK_WEBHOOK_URL = os.environ.get( "SLACK_WEBHOOK_URL" ) PROJECT_ID = os.environ.get( "PROJECT_ID" ) MCP_SERVER_URL = "https://monitoring.googleapis.com/mcp" def get_mcp_headers (): scopes = [ "https://www.googleapis.com/auth/cloud-platform" ] credentials, _ = google.auth.default(scopes=scopes) credentials.refresh(Request()) return { "Authorization" : f "Bearer {credentials.token}" , "Content-Type" : "application/json" } def list_monitoring_mcp_tools () -> str : """MCP ãµãŒããŒãã䜿çšå¯èœãªããŒã«äžèЧãååŸãã""" payload = { "jsonrpc" : "2.0" , "method" : "tools/list" , "id" : 1 } res = requests.post(MCP_SERVER_URL, json=payload, headers=get_mcp_headers()) if not res.ok: return f "MCP tools/list API ãšã©ãŒ (HTTP {res.status_code}): {res.text[:1000]}" result_data = res.json().get( "result" , {}) simplified_tools = [] for tool in result_data.get( "tools" , []): schema = tool.get( "inputSchema" , {}) simplified_props = {} for k, v in schema.get( "properties" , {}).items(): simplified_props[k] = { "type" : v.get( "type" , "unknown" ), "description" : v.get( "description" , "" )[: 100 ] } simplified_tools.append({ "name" : tool.get( "name" ), "description" : tool.get( "description" , "" )[: 200 ], "required_args" : schema.get( "required" , []), "properties" : simplified_props }) return json.dumps({ "tools" : simplified_tools}, indent= 2 , ensure_ascii= False ) def call_monitoring_mcp_tool (tool_name: str , arguments_json_str: str ) -> str : """æå®ãã MCP ããŒã«ãå®è¡ããŠã¡ããªã¯ã¹ãååŸãã""" arguments = json.loads(arguments_json_str) payload = { "jsonrpc" : "2.0" , "method" : "tools/call" , "id" : 2 , "params" : { "name" : tool_name, "arguments" : arguments} } res = requests.post(MCP_SERVER_URL, json=payload, headers=get_mcp_headers()) if not res.ok: return f "MCP tools/call API ãšã©ãŒ (HTTP {res.status_code}): {res.text[:1000]}" response_data = res.json() if "result" in response_data and "content" in response_data[ "result" ]: text_result = " \n " .join( [item.get( "text" , "" ) for item in response_data[ "result" ][ "content" ]] ) return text_result[: 3000 ] + " \n ...ïŒçç¥ïŒ" if len (text_result) > 3000 else text_result return f "MCP ãšã©ãŒ: {response_data.get('error', 'äžæãªã¬ã¹ãã³ã¹')}" def search_cloud_logs (filter_str: str , hours: int = 2 ) -> str : """Cloud Logging ã§éå» N æéã®ãã°ãæ€çŽ¢ãã""" client = logging_v2.Client(project=PROJECT_ID) start_time = datetime.now(timezone.utc) - timedelta(hours=hours) full_filter = f '{filter_str} AND timestamp>="{start_time.isoformat()}"' entries = client.list_entries(filter_=full_filter, max_results= 20 ) results = [] for entry in entries: results.append({ "timestamp" : entry.timestamp.isoformat() if entry.timestamp else "" , "severity" : str (entry.severity), "resource" : entry.resource.type if entry.resource else "" , "payload" : str (entry.payload)[: 500 ] }) if not results: return "該åœãããã°ã¯èŠã€ãããŸããã§ããã" text = json.dumps(results, indent= 2 , ensure_ascii= False ) return text[: 3000 ] + " \n ...ïŒçç¥ïŒ" if len (text) > 3000 else text def analyze_error (event, context): """Pub/Sub ãããšã©ãŒãã°ãåãåããGemini ã§åæã㊠Slack ã«éç¥ãã""" pubsub_message = base64.b64decode(event[ 'data' ]).decode( 'utf-8' ) log_data = json.loads(pubsub_message) error_msg = log_data.get( "textPayload" ) or log_data.get( "jsonPayload" ) client = genai.Client(vertexai= True , project=PROJECT_ID, location= "us-central1" ) log_str = json.dumps(log_data, indent= 2 )[: 5000 ] prompt = f """ 以äžã®ãšã©ãŒãã°ãæ€ç¥ãããŸãããMCP ãµãŒããŒããã³ Cloud Logging ãšé£æºããŠèª¿æ»ããŠãã ããã ããã°å
容ã {log_str} ãå³å®äºé
ã åå åæã«ãããã以äžã®ã¹ããããå¿
ããã¹ãŠå®è¡ããŠãã ãããæšæž¬ïŒãã«ã·ããŒã·ã§ã³ïŒã«ããåçããäžéšã®ããŒã«åŒã³åºãã®çç¥ã¯èš±å¯ãããŸããã 1. `list_monitoring_mcp_tools` ã§ããŒã«äžèЧã確èªããŠãã ããã 2. `call_monitoring_mcp_tool` ã§ãããžã§ã¯ã {PROJECT_ID} ã®çŽè¿ 10 åã®ã¡ããªã¯ã¹ãååŸããŠãã ãããååŸå¯Ÿè±¡ã¯ãã°ã®æèïŒããªã¯ãšã¹ããåŠçããããŸãããçïŒãã倿ããCloud Run ã®ãªã¯ãšã¹ãæ°ïŒäŸ: metric.type="run.googleapis.com/request_count"ïŒãªã©ãè² è·ç¶æ³ãããã確å®ãªæšæºã¡ããªã¯ã¹ãæå®ããŠãã ãããç¡å¹ãªã¯ãšãªã¯é¿ããŠãã ããã 3. `search_cloud_logs` ã§çŽè¿ 10 åã®é¢é£ãããã°ãæ€çŽ¢ããŠãã ããïŒseverity>=WARNING ãªã©ïŒã ãåºåãã©ãŒãããã åæçµæã¯ãå¿
ã以äžã® Markdown æ§é ã«å³å¯ã«åŸã£ãŠåºåããŠãã ãããããŒã«åã¯èšèŒãããèªç¶ãªæ¥æ¬èªã§èšèŒããŠãã ããã ### 調æ»çµæ 1. **ã¡ããªã¯ã¹åæ:** ïŒå®éã«ååŸããã¡ããªã¯ã¹ã®æ°å€ãã¹ãã€ã¯ã®æç¡ãªã©ã客芳çãªäºå®ã®ã¿ãèšèŒïŒ 2. **ãã°åæ:** ïŒå®éã«æ€çŽ¢ããé¢é£ãã°ã®ä»¶æ°ãå
容ãªã©ã客芳çãªäºå®ã®ã¿ãèšèŒïŒ ### åå ã®ä»®èª¬ ïŒäžèšã®å®¢èгçããŒã¿ã«åºã¥ãããªããšã©ãŒãçºçããã®ãã®èå¯ãèšèŒïŒ ### 察åŠã¢ã¯ã·ã§ã³ ïŒå
·äœçãªè§£æ±ºçãèšèŒïŒ """ res = client.models.generate_content( model= 'gemini-2.5-flash' , contents=prompt, config={ "tools" : [list_monitoring_mcp_tools, call_monitoring_mcp_tool, search_cloud_logs]} ) requests.post(SLACK_WEBHOOK_URL, json={ "text" : f "ðš *ãAI èªååæã* \n *ãã°:* \n ``` \n {str(error_msg)[:1000]} \n ``` \n *åæ:* \n {res.text}" }) ãœãŒã¹ã³ãŒãã®è§£èª¬ äžèšã®ãœãŒã¹ã³ãŒãã¯ã倧ããåããŠãGemini ã«æž¡ãããŒã«é¢æ°çŸ€ããšãPub/Sub ãããªã¬ãŒã«ãšãŒãžã§ã³ããèµ·åãããšã³ããªãŒãã€ã³ããã®2ã€ã®ããŒãã§æ§æãããŸãã ãŸãã¯ãããŒã«é¢æ°çŸ€ã«ã€ããŠè§£èª¬ããŸãããã®ããŒãã¯ã list_monitoring_mcp_tools ã call_monitoring_mcp_tool ã search_cloud_logs ã§æ§æãããŸãã list_monitoring_mcp_tools MCP ãµãŒããŒãã䜿çšå¯èœãªããŒã«äžèЧãååŸããŸããCloud Monitoring ãè¿ãã¹ããŒãã¯å€§ããããã®ãŸãŸ Gemini ã«æž¡ããšã³ã³ããã¹ãäžéãè¶
ããæãããããããããããã£æ
å ±ãå¿
èŠæå°éã«çµã蟌ãã§ããŸãã call_monitoring_mcp_tool æå®ããã MCP ããŒã«ãå®è¡ããã¡ããªã¯ã¹ãååŸããŸãã search_cloud_logs Cloud Logging ããé¢é£ãã°ãæ€çŽ¢ããŸããGemini ãã¡ããªã¯ã¹ã ãã§ã¯åå ã倿ã§ããªãå Žåã«ã远å ã®èª¿æ»ææ®µãšããŠåŒã³åºãããŸãã æ¬¡ã«ããšã³ããªãŒãã€ã³ãïŒ analyze_error() ïŒã®ããŒãã«ã€ããŠè§£èª¬ããŸãã Pub/Sub ã€ãã³ãã®åä¿¡ Pub/Sub ããæž¡ãããã¡ãã»ãŒãžããã³ãŒãããå«ãŸãããšã©ãŒãã°ã®å
容ãåãåºããŸãã Gemini ã¢ãã«ã®åŒã³åºã ããã³ãããšäœ¿çšå¯èœããŒã«ã®äžèŠ§ãæž¡ã㊠generate_content ãå®è¡ããŸããããã³ããã«ã¯ãããŒã«ã®åŒã³åºãé åºãšãæçµçã«åºåãã¹ãå
容ïŒåå ã®ä»®èª¬ãšå¯ŸåŠã¢ã¯ã·ã§ã³ïŒãæèšããŠããŸãã Slack ãžã®éç¥ Gemini ããè¿ãããå¿çããSlack Webhook çµç±ã§æå®ãã£ã³ãã«ã« POST ããŸãã Cloud Run functions ãžã®ããã〠ãããã€ã³ãã³ãã®å®è¡ ã¿ãŒããã«ã§ ai-ops-function ãã£ã¬ã¯ããªã«ç§»åããCloud Run functions ã«ãããã€ããŸãã # ãããžã§ã¯ãçªå·ã®ååŸ export PROJECT_NUMBER = $( gcloud projects describe $PROJECT_ID --format =' value(projectNumber) ' ) # ãããã€ã®å®è¡ïŒã¯ãªãŒã³çïŒ gcloud functions deploy ai-ops-analyzer \ --gen2 \ --runtime = python311 \ --region = $REGION \ --source = . \ --entry-point = analyze_error \ --trigger-topic = $TOPIC_NAME \ --service-account = $SA_EMAIL \ --trigger-service-account = ${PROJECT_NUMBER} -compute@developer.gserviceaccount.com \ --set-env-vars = SLACK_WEBHOOK_URL = $SLACK_WEBHOOK_URL , PROJECT_ID = $PROJECT_ID \ --quiet Cloud Run ã®åŒã³åºãæš©éã®ä»äž Cloud Run functions ã¯ãå
éšçã«ã¯ Cloud Run service ãšããŠå±éãããŸããPub/Sub çµç±ã§ã®ããªã¬ãŒæã«æ£ããèªèšŒãéãããããµãŒãã¹ã¢ã«ãŠã³ãã« Cloud Run ã®åŒã³åºãæš©éãä»äžããŸãã # ãããžã§ã¯ãçªå·ã®ååŸ export PROJECT_NUMBER = $( gcloud projects describe $PROJECT_ID --format =' value(projectNumber) ' ) # Compute Engine ããã©ã«ããµãŒãã¹ã¢ã«ãŠã³ãã« Cloud Run èµ·åæš©éãä»äž gcloud run services add-iam-policy-binding ai-ops-analyzer \ --region = $REGION \ --member =" serviceAccount: ${PROJECT_NUMBER} -compute@developer.gserviceaccount.com " \ --role =" roles/run.invoker " åäœç¢ºèª ãããã€ãããšãŒãžã§ã³ãã®åäœç¢ºèªãšããŠã以äžã®æé ã§ç䌌çãªã€ã³ã·ãã³ãç¶æ³ãäœãåºããŠãã¹ãããŸããæå³çã«ã¡ããªã¯ã¹ã®è² è·ã¹ãã€ã¯ãçºçããããã¹ãçšãšã©ãŒãã°ãæžã蟌ãããšã§ãAI ã«ããåå åæãæ£ããå®è¡ããããã確èªããŸãã 1.Cloud Shell ããããããã€ãã颿°ã«å¯ŸããŠãªã¯ãšã¹ããéããã¡ããªã¯ã¹äžã«ã¹ãã€ã¯ãçºçãããŸãã # èªåã®é¢æ°ã® URL ãååŸ URL = $( gcloud run services describe ai-ops-analyzer --region = $REGION --format =' value(status.url) ' ) TOKEN = $( gcloud auth print-identity-token ) # 1 åéã䞊åã§ãªã¯ãšã¹ããéãç¶ããïŒã¹ãã€ã¯ãäœæïŒ echo " è² è·ãçºçãããŠããŸãïŒçŽ 1 åéïŒ... " for i in { 1 .. 100 } ; do curl -s -H " Authorization: Bearer $TOKEN " $URL > /dev/null & done sleep 30 for i in { 1 .. 100 } ; do curl -s -H " Authorization: Bearer $TOKEN " $URL > /dev/null & done wait echo " è² è·çæå®äºã " 2.è² è·ããããŠãã2ã3åã®ã¿ã€ãã³ã°ã§ããã¹ãçšã®ãšã©ãŒãã°ãæžã蟌ã¿ãŸãã gcloud logging write my-test-log \ " CRITICAL: ãµãŒãã¹å¿çé
å»¶ãçºçããŠããŸãããªã¯ãšã¹ããåŠçããããŸããã " \ --severity = ERROR 3.Slack äžã§ãAI ã«ããåæçµæãéç¥ãããããšã確èªããŸãã åå³¶ ç¥å€ªé (èšäºäžèЧ) ã¯ã©ãŠããœãªã¥ãŒã·ã§ã³éš ãœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ã課 2025幎1æG-genã«ãžã§ã€ã³ïŒé£²é£æ¥çããITæ¥çã«è»¢èº«ãããšã³ãžãã¢ã ã³ãŒããŒã奜ãã§ãã
PSSLã®äœã
æšã§ã Claude Codeã»Copilotã»Codex ãšãã£ã AI ã³ãŒãã£ã³ã°ãšãŒãžã§ã³ãã¯ãã³ãã³ããå®è¡ã§ããæš©éãæã£ããŸãŸæå
ã®ãªããžããªã®äžã§åããŸãã䟿å©ã§ããã secret (API tokenãDB æ¥ç¶æååãæ¬çª AWS ããŒ) ãšã®åå±
ããŠããããšã§ã·ãŒã¯ã¬ãããæŒæŽ©ããªããå¿é
ã«ãªã£ãã®ã§å¯Ÿå¿çã調æ»ããŠã¿ãŸããã ãã®èšäºã§ã¯ã ã«ãŒã«ã§çžã£ãŠã AI Agent ã« .env ãèªãŸããŠããŸãæ
å ±æŒæŽ©ãªã¹ã¯ ãã®ç·©åçãšã㊠Infisical ãéžãã çç± Infisical ã®ä»çµã¿ (= ãªã AI ã«ãèŠããªããã®ã) å人 AWS ã¢ã«ãŠã³ãã䜿ã£ãæ€èšŒã§ã®å°å
¥æé ã«ã€ããŠãŸãšããŸããã 1. ã«ãŒã«ã§çžã£ãŠã AI Agent 㯠secret ãèªã¿ããå±éºããã Claude Code / Copilot çã®äž»èŠãª AI ã³ãŒãã£ã³ã°ãšãŒãžã§ã³ãã«ã¯ãéçšã«ãŒã«ãæžããå ŽæãçšæãããŠããŸããClaude Code ãªã CLAUDE.md ã¿ãããªãã€ã§ãã æ€èšŒçšã«ç«ãŠããããžã§ã¯ãã® CLAUDE.md ã«ãããããªã«ãŒã«ãæžããŠã¿ãŸãã: - `.env`, `.env.prod`, `.env.*`, `*.pem`, `client_secret.json` ãªã©ã® secret å®äœãèªãŸãªãã§ãã ãã - secret ãã¡ã€ã«ã«å¯Ÿã㊠`cat`, `grep`, `sed`, `awk`, `head`, `tail`, `less`, `python` ãªã©ã§ å
容ãè¡šç€ºã»æœåºããªãã§ãã ãã - secret å€ãDATABASE_URLãSECRET_KEYãSMTP passwordãRDS passwordãprivate key ã ãã£ãããdocsãissueãPRããã°ãžæžããªãã§ãã ãã ãããããã«ã«ãŒã«ãèšèŒããŠãäœåºŠãè£åãããçµéšããããæå³ããAgnetãã«ãŒã«ãç¡èŠããŠã·ãŒã¯ã¬ããæ
å ±ãèŠã«è¡ãå¯èœæ§ãåŠå®ããããªããªãšéçºãããªããæã£ãŠããŸããã äŸãã°ä»¥äžã®ãããªå Žåã«Agentãã«ãŒã«ãç¡èŠããŠã·ãŒã¯ã¬ãããèªã¿ã«è¡ãå¯èœæ§ããããŸã ãnode dev server ãç«ã¡äžãããªããâ ãããã°ã®ãã DATABASE_URL ã®æ§é ã確èªããå¿
èŠãåºã ãECR push ã倱æããŠãããâ AWS profile / credential ã®ç¶æ
ãèŠãå¿
èŠãåºã ã make ã§ env ãèªãŸããŠããªãã£ãœããâ ã·ã§ã«ãã env | grep XXX ãã ã€ãŸãã CLAUDE.md ã ãã«é Œã£ã secret 管ç㯠ãäºæ
ãèµ·ããªãããšãç¥ãéçšã ã ãšæããŠããŠåçšè£œåã®éçºãããéã«ããªãã®ãªã¹ã¯ã«ãªããããšæã£ãŠããŸãã 2. Infisical ãšã¯ Infisical 㯠OSS ã® secret 管çãã©ãããã©ãŒã ã§ããAWS Secrets Manager ã HashiCorp Vault ãšåããsecret ãéäžç®¡çãããã«ããŽãªã«å±ããŸãããéçºè
äœéšãæçŸ€ã«è¯ããšæããŸãã Web UI ã§èŠãŠç·šéã§ãã (json ã§ãªã key-value ã®ããŒãã«) CLI ã direnv / dotenv-cli ã®äžäœäºæ ãšããŠäœ¿ãã ç°å¢å¥ ( dev / staging / prod ) + ãã¹å¥ ã§åé¢å¯èœ ã¡ã³ããŒåäœã® RBAC ã誰ããã€äœãèŠããã® audit log Cloud (SaaS) ã Self-host (Docker compose) ãéžã¹ã ç¡ææ ãå人éçºã§åå䜿ãã å
¬åŒã« GitHub Star çŽ 2 äž ãã£ãŠãHashiCorp Vault ããã¯å°èŠæš¡ãAWS Secrets Manager ããã¯éçºè
å¯ããšããç«ã¡äœçœ®ã§ãã 3. ä»çµã¿ â ãªã AI Agent ãããèŠããªããã®ã Infisical CLI ã®äžæ žæ©èœã¯ infisical run ã§ã: infisical run --env=dev --path=/aws/sandbox -- aws sts get-caller-identity ãã®ã³ãã³ãã®è£ã§ã¯ãããããæµããèµ·ããŸã: infisical CLI (芪) â ââ 1. ããŒã«ã«ã«ä¿åããã JWT ã§ Infisical API ãžèªèšŒ ââ 2. /aws/sandbox ãã¹ã® secret äžèЧã HTTPS ã§ååŸ (in-memory) ââ 3. fork ããŠåããã»ã¹ãäœã â ââ åããã»ã¹ã® environ ã« AWS_ACCESS_KEY_ID çã export ââ 4. åããã»ã¹ (= `aws sts get-caller-identity`) å®è¡ ââ åããã»ã¹çµäºã§ memory ãè§£æŸãsecret ã¯ã©ãã«ãæ®ããªã Infisicalã䜿ã£ãŠããŠãããããã€ã³ã ãã£ã¹ã¯ã« .env ãã¡ã€ã«ãäžåäœããªã â AI ã cat .env ããŠã “ãããªãã¡ã€ã«ãªã” 芪 shell ã® env ã« export ããªã â AI ã env ã printenv ãæã£ãŠãèŠããªã (= ããã©ã«ãã® shell ã«ã¯èŒã£ãŠããªã) shell history ã«å€ãæ®ããªã â infisical run -- foo ãšããåŒã³åºãå±¥æŽã¯æ®ãããsecret å€ã¯å±¥æŽã«åºãªã åããã»ã¹ãçµãã£ãã secret çè·¡ãŒã â RAM äžããæ¶ãã ã€ãŸããAI ãšãŒãžã§ã³ãããç°å¢å€æ°çµç±ã§ secret ãçããæãã«ãžã¥ã¢ã«ãªçµè·¯ (= cat .env ãš env ) ã äž¡æ¹ãšãæ§é çã«å¡ãã§ããŸã ã 4. å°å
¥æé (å人 AWS ã¢ã«ãŠã³ãã§æ€èšŒ) ããããã¯ãèªåã®å人 AWS ã¢ã«ãŠã³ãäžã«æ€èšŒçšã® IAM user ãäœãããã® credential ã Infisical ã«ç»é²ã㊠AI ãšãŒãžã§ã³ããã AWS ãªãœãŒã¹ãæäœãããããšããæµãã§æãåãããŠã¿ãæé ã§ããããããŠãæ€èšŒçšã«ç«ãŠã Django ãããã¯ãã® .env çžåœã®å€ (DB æ¥ç¶æååãSECRET_KEYãSMTP password ãªã©) ã Infisical ã«å¯ããŠãããŒã«ã«ã® .env ãæ¶ãå»ããšãããŸã§ãããŸããã 4.1 ã¢ã«ãŠã³ãäœæ infisical.com/cloud ã§ãµã€ã³ã¢ãããOrg â Project ãäœæã 4.2 CLI ã®ã€ã³ã¹ããŒã« # macOS brew install infisical/get-cli/infisical # Linux curl -1sLf '<https://dl.cloudsmith.io/public/infisical/infisical-cli/setup.deb.sh>' | sudo -E bash sudo apt update && sudo apt install -y infisical 4.3 ãã°ã€ã³ãšãªããžããªã®çŽä»ã infisical login # ãã©ãŠã¶ãéã㊠OAuth cd path/to/repo infisical init # ãã® repo ã Infisical project ã«çŽä»ã (.infisical.json çæ) .infisical.json 㯠project ID ãšç°å¢åã®å¯Ÿå¿ã ã ãå
¥ã£ãŠã㊠secret å€ã¯ç¡ãã®ã§ãgit ã« commit ããŠãåé¡ãªãã 4.4 secret ãç»é² Web UI ããç»é²ããã®ã楜ã§ããè€æ°ç°å¢ ( dev / staging / prod ) ãšä»»æã®ãã¹ ( /aws/sandbox /django/app ç) ã§åããããŸãã æ€èšŒã§ã¯ãå人 AWS ã¢ã«ãŠã³ãã«äœã£ã IAM user ã® credential ãšãæ€èšŒçš Django ãããã¯ãã® env ããããªæãã§åããŸãã: Infisical path env vars çšé dev / /aws/sandbox AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY (å人æ€èšŒçš IAM user) AI ãšãŒãžã§ã³ããã S3 / EC2 / SSM ãªã©ãå©ãæ€èšŒ dev / /django/app DATABASE_URL / SECRET_KEY / SMTP_PASSWORD ç æ€èšŒçš Django ã¢ããªã®å®è¡æ env ããã§æå
ã® .env ã¯å®å
šã«åé€ãå€ã¯å
šéš Infisical åŽã«ã ãååšããç¶æ
ã«ããŸããã 4.5 å®è¡ # AWS æäœ infisical run --env=dev --path=/aws/sandbox -- aws sts get-caller-identity # â arn:aws:iam::xxxxxxxx:user/sandbox-user # Django èµ·å infisical run --env=dev --path=/django/app -- python manage.py runserver ããã§ OKã .env ãã¡ã€ã«ãã·ã§ã«ãžã® export ãäžåç¡ãã 5. æ€èšŒããŠããã£ãæ©æµ 5.1 AI ãšãŒãžã§ã³ããæ§é çã« secret ã«è§Šããªããªã£ã æ€èšŒã§ã¯ Claude Code ã«ãå人 AWS ã¢ã«ãŠã³ãã® S3 ãã±ãããäžèЧããŠãäžèŠãªãã®ãåé€ããŠãã¿ãããªã¿ã¹ã¯ãæããŠã¿ãŸããã infisical run çµç±ã§ AWS æäœãå§ä»»ããŠããClaude 㯠ãããã secret å€ããç¥ããè¡ããªã ãäŸãã°: infisical run --env=dev --path=/aws/sandbox --silent -- \\ aws s3 ls ããã Claude ã«å®è¡ãããŠããClaude ãèŠãããã®ã¯: ã³ãã³ãã®åŒæ° (= å
¬éæ
å ±) ã³ãã³ãã®åºå (= ç§ãèš±å¯ããæ
å ±) ã ãã AWS ããŒæ¬äœã¯ Claude ã®ããã»ã¹ç©ºéã«ãäŒè©±å±¥æŽã«ãå
¥ããŸããã æ€èšŒçš Django ã¢ããªåŽã§ãåæ§ã§ã .env ãæ¶ããç¶æ
ã§ Claude ã«ãdev server ãç«ã¡äžããŠåäœç¢ºèªããŠããšé Œããšã infisical run çµç±ã§ããèµ·åã§ããªãããšãŒãžã§ã³ãã奜å¥å¿ã§ cat .env ããŠã ãã¡ã€ã«ãååšããªã ã®ã§ç©ºæ¯ãã«çµãããŸããå®éã«ããããŠã¿ãŠãã DATABASE_URL ã SECRET_KEY ã®å€ãäŒè©±å±¥æŽã«åºãŠããããšã¯äžåºŠããããŸããã§ããã 5.2 æ€èšŒçš IAM user ãåãããã å人 AWS ã¢ã«ãŠã³ãã§éãã§ãããšããã㯠AI ã«æž¡ããŠããæš©éããããã¯èªåãæã§ãããããªãæš©éããåããããªããŸããInfisical ã®ãã¹ã§åããšããã綺éº: # AI ã«æž¡ããŠããæš©é (read äžå¿ãéå®ãªãœãŒã¹) infisical run --env=dev --path=/aws/sandbox -- <command> # èªåãã䜿ããªãæš©é (IAM ç·šéãbilling ç³») infisical run --env=dev --path=/aws/admin -- <command> IAM user èªäœã¯å¥ã
ã«äœã£ãŠãInfisical åŽã§ãã¹æš©éãåããã ãããšãŒãžã§ã³ãã«ã¯ /aws/sandbox ã ãã¢ã¯ã»ã¹ã§ããããŒã¯ã³ãæž¡ããã¿ãããªéçšãçŸå®çã«ã§ããŸãã 5.3 æ€èšŒãçµãã£ããå¥å¥ªãäžç¬ å人æ€èšŒããããã§ãæ€èšŒçµãã£ããã© IAM key æ¶ãå¿ããŠæŸçœ®ããèµ·ãããã¡ã§ãããInfisical ã«éçŽããŠããã° Web UI ã§å€ãæ¶ãã ãã .env ãè€æ°ã®ãªããžããªã«æ£ãã°ã£ãŠãç¶æ
ããå§åçã«ç®¡çãæ¥œã§ããã 6. ãŸãšã AI Agent ãšäžç·ã«éçºããæä»£ã .env ãããŒã«ã«ã«è»¢ãããŠããéçšã¯ ãã«ãŒã«ã§çžã£ãŠãããã€ãã¯äºæ
ãã å¯èœæ§ããããŸãã æç« ã«ãŒã« ( CLAUDE.md ) ã¯ããé¡ããã¬ãã« AI Agent ã¯ã¿ã¹ã¯éè¡ã®ããã« env ãèŠãããšããã (æªæãªãã§ã) äžåºŠå±¥æŽã«å
¥ã£ã secret 㯠AI ãã³ããŒåŽã«æ°žç¶åããã Infisical ã® infisical run -- <command> æ¹åŒã«åãæ¿ãããšã .env ãã¡ã€ã«ãããããååšããªã â cat ã§åºãªã shell env ã«ã default ã§ä¹ããªã â env / printenv ã§åºãªã åããã»ã¹ã®ã©ã€ããµã€ã¯ã«å
ã ãã§ secret ãçãã ããã§ã㊠direnv åçã®æè»œãã§éçºãåã å®å
šé²åŸ¡ã§ã¯ãªããã ã«ãžã¥ã¢ã«ãªæŒæŽ©çµè·¯ãæ§é çã«å¡ãã äžã§ãAI ãšãŒãžã§ã³ããšã®å
±åãæç«ããã ããã®æå°ã³ã¹ãã®äžæãšããŠã匷ãããããã§ããŸãã å人 AWS ã¢ã«ãŠã³ãã§ã®æ€èšŒã¬ãã«ã§ãã .env ãæ¶ã㊠Infisical ã«å¯ããããšã§ããšãŒãžã§ã³ãã«äœãåãããŠã secret ãæ··å
¥ããªãããšããå®å¿æã¯æ®µéãã§ãããæ¬çªæå
¥åã®ãµã³ãããã¯ã¹ãšããŠæãåãããŠã¿ã䟡å€ã¯ååãããšæããŸãã åèãªã³ã¯ Infisical å
¬åŒ Infisical CLI ããã¥ã¡ã³ã Anthropic Claude Code å
¬åŒ GitHub: Infisical/infisical ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post AI ãšãŒãžã§ã³ãã«.envãèªãŸããããªãã£ãããInfisicalãå°å
¥ãŠã¿ã first appeared on SIOS Tech Lab .
æ¬èšäºã¯ 2026 幎 5 æ 11 æ¥ ã«å
¬éãããã Amazon Aurora DSQL connections: Drivers, strings, and best practices ãã翻蚳ãããã®ã§ãã Amazon Aurora DSQL ãžã®åããŠã®æ¥ç¶ãèšå®ããããšããŠããŸãã? PostgreSQL ã䜿ã£ãããšãããã°æµãã¯äŒŒãŠããŸãããããã€ãéèŠãªéãããããŸããé·æéæå¹ãªãã¹ã¯ãŒãã®ä»£ããã«ã çåœã® IAM èªèšŒããŒã¯ã³ ã䜿çšããŸããéçãªãšã³ããã€ã³ãã®ä»£ããã«ãè€æ°ã®ã¢ãã€ã©ããªãã£ãŸãŒã³ã«ãŸããã忣ã¯ã©ã¹ã¿ãŒãšã³ããã€ã³ãã䜿çšããŸããæ¥ç¶ã¿ã€ã ã¢ãŠãã®ãã©ãã«ã·ã¥ãŒãã£ã³ã°ãããŒã¯ã³ã®æå¹æé管çããã©ã€ããŒã®ååèšå®ãªã©ãæ¥ç¶ãã¿ãŒã³ãçè§£ããŠãããšäžè¬çãªåé¡ãåé¿ã§ããŸãã æ¬èšäºã§ã¯ãæ¥ç¶æååã®èšå®æ¹æ³ãPythonã»Javaã»Node.js ã§ã®ãã©ã€ããŒèšå®ãèªèšŒã»æ¥ç¶ããŒãªã³ã°ã»ã©ã€ããµã€ã¯ã«ç®¡çã®ãã¹ããã©ã¯ãã£ã¹ã«ã€ããŠèª¬æããŸãã æ¥ç¶ã¢ãŒããã¯ã㣠Amazon Aurora DSQL ã¯ãåŸæ¥ã® PostgreSQL ãããã€ãšã¯æ ¹æ¬çã«ç°ãªã忣æ¥ç¶ã¢ãŒããã¯ãã£ãæ¡çšããŠããŸããã¢ããªã±ãŒã·ã§ã³ã¯åäžã®ããŒã¿ããŒã¹ã€ã³ã¹ã¿ã³ã¹ã«æ¥ç¶ããã®ã§ã¯ãªããè€æ°ã®ã¢ãã€ã©ããªãã£ãŸãŒã³ã«ãã©ãã£ãã¯ã忣ããã«ãŒãã£ã³ã°ã¬ã€ã€ãŒãä»ããŠæ¥ç¶ããŸãããã©ã€ããŒãæ¥ç¶æååãèšå®ããåã«ããšã³ããã€ã³ãã®æ§é ãšã¯ã€ã€ãããã³ã«ã®åäœãçè§£ããŠããå¿
èŠããããŸãã以äžã®ã»ã¯ã·ã§ã³ã§ã¯ãæ¥ç¶åã«ç¥ã£ãŠããã¹ããšã³ããã€ã³ã圢åŒãšã¯ã€ã€ãããã³ã«ã®äºææ§ã«ã€ããŠèª¬æããŸãã ãšã³ããã€ã³ãåœ¢åŒ Amazon Aurora DSQL ã¯ã©ã¹ã¿ãŒã®ãšã³ããã€ã³ãã¯æ¬¡ã®ãã¿ãŒã³ã«åŸããŸãã <cluster-id>.dsql.<region>.on.aws äŸ: weaxxxxxxxxxxxxxxxxqdqqm.dsql.us-east-1.on.aws ãã¥ã¢ã«ã¹ã¿ãã¯åœ¢åŒã§ãIPv4 ãš IPv6 ã®äž¡æ¹ããµããŒãããŠããŸãããšã³ããã€ã³ã㯠Aurora DSQL ã®åæ£ã«ãŒãã£ã³ã°ã¬ã€ã€ãŒã«æ¥ç¶ããè€æ°ã®ã¢ãã€ã©ããªãã£ãŸãŒã³ãžã®æ¥ç¶åæ£ãèªåçã«åŠçããŸãã äž»èŠãªæ¥ç¶ãã©ã¡ãŒã¿: Host: ã¯ã©ã¹ã¿ãŒãšã³ããã€ã³ã (äžèšã®åœ¢åŒ)ã Port: 5432 (PostgreSQL æšæºããŒã)ã Database: postgres (ããã©ã«ãã®ããŒã¿ããŒã¹å)ã SSL Mode: ãã¹ãŠã®æ¥ç¶ã§å¿
é ã ã¯ã€ã€ãããã³ã«ã®äºææ§ Amazon Aurora DSQL ã¯æšæºã® PostgreSQL v3 ã¯ã€ã€ãããã³ã«ã䜿çšããŠãããpsqlãpgjdbcãpsycopgãpsycopg2 ãªã©ã®äžè¬ç㪠PostgreSQL ãã©ã€ããŒãšã®äºææ§ããããŸããæ¢åã®ããŒã«ãã©ã€ãã©ãªã¯ãæå°éã®èšå®å€æŽã§å©çšã§ããŸãã èªèšŒãšã»ãã¥ãªã㣠Aurora DSQL ã§ã¯ãåŸæ¥ã® PostgreSQL ããŒã¿ããŒã¹ãšã¯ç°ãªãèªèšŒæ¹åŒãšãããã¯ãŒã¯ã»ãã¥ãªãã£ãæ¡çšããŠããŸãã以äžã®ã»ã¯ã·ã§ã³ã§ã¯ãIAM ããŒã¹ã®ããŒã¯ã³çæããããã¯ãŒã¯æ¥ç¶ãªãã·ã§ã³ãèªèšŒæ
å ±ç®¡çã®ãã¹ããã©ã¯ãã£ã¹ã«ã€ããŠèª¬æããŸãã IAM ããŒã¹ã®èªèšŒ Amazon Aurora DSQL ã¯çåœã® IAM èªèšŒããŒã¯ã³ã®ã¿ã䜿çšããŸããIAM èªèšŒã«ã¯ä»¥äžã®ã»ãã¥ãªãã£äžã®å©ç¹ããããŸãã ã»ãã¥ãªãã£ã®åŒ·å: ãã¹ã¯ãŒãã®ä¿åãããŒããŒã·ã§ã³ã«äŒŽããªã¹ã¯ã軜æžããŸãã ã¢ã¯ã»ã¹å¶åŸ¡ã®äžå
å: AWS Identity and Access Management (AWS IAM) ã«ããçµ±äžçãªæš©é管çãå¯èœã§ãã ç£æ»èšŒè·¡: æ¥ç¶è©Šè¡ã AWS CloudTrail ã«èšé²ãããŸãã èªåæéåã: ããŒã¯ã³ã¯ããã©ã«ãã§ 15 ååŸã«æéåãã«ãªããŸã (æå€§ 1 é±éãŸã§èšå®å¯èœ)ãããã©ã«ããè¶
ããæå¹æéã®å»¶é·ã¯æšå¥šããŸãããæŒæŽ©ããé·åœããŒã¯ã³ã¯é倧ãªã»ãã¥ãªãã£ãªã¹ã¯ã§ããå»¶é·ãå¿
èŠãªå Žåã¯ãããŒã¯ã³ã®ã¹ã³ãŒããæå°éã®æš©éã«çµããCloudTrail ã§é·åœããŒã¯ã³ãç£èŠããŠãã ããã ã¢ã¯ã»ã¹å¶åŸ¡ãã¿ãŒã³ãšã»ãã¥ãªãã£ã®ãã¹ããã©ã¯ãã£ã¹ã®è©³çްã«ã€ããŠã¯ã Amazon Aurora DSQL ã®ã»ãã¥ãªãã£å¯ŸçïŒã¢ã¯ã»ã¹å¶åŸ¡ã®ãã¹ããã©ã¯ãã£ã¹ ãåç
§ããŠãã ããã AWS Command Line Interface (AWS CLI) ã§ã®ããŒã¯ã³çæ: 以äžã®ã³ãã³ãã§ãAWS CLI ã䜿çšã㊠Aurora DSQL ã¯ã©ã¹ã¿ãŒã®èªèšŒããŒã¯ã³ãçæããŸãã aws dsql generate-db-connect-admin-auth-token \ --region us-east-1 \ --hostname <your-cluster-id>.dsql.us-east-1.on.aws å¿
èŠãª IAM æš©é: { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "dsql:DbConnect", "dsql:DbConnectAdmin" ], "Resource": "arn:aws:dsql:region:account-id:cluster/cluster-id", "Condition": { "IpAddress": { "aws:SourceIp": ["10.0.0.0/8"] } } } ] } dsql:DbConnect: éåžžã®ããŒã¿ããŒã¹ãŠãŒã¶ãŒãšããŠã®æ¥ç¶æš©éãä»äžããŸãã dsql:DbConnectAdmin: 管çè
æš©éãä»äžããŸãã æå°æš©éã®åå ãŠãŒã¹ã±ãŒã¹ããšã«å¿
èŠæå°éã®æš©éã®ã¿ãä»äžããŸãã æšæºã®ã¢ããªã±ãŒã·ã§ã³ã¢ã¯ã»ã¹ã«ã¯ dsql:DbConnect ã䜿çšããŸãã dsql:DbConnectAdmin ã¯ç®¡çã¿ã¹ã¯å°çšã«éå®ããŸãã æ¢ç¥ã®ãããã¯ãŒã¯ç¯å²ã®ã¿ã«ã¢ã¯ã»ã¹ãå¶éãããããIP ããŒã¹ã® æ¡ä»¶ ã远å ããŸãã ãããã¯ãŒã¯ã»ãã¥ãªã㣠Amazon Aurora DSQL ã¯ãããªãã¯ã¢ã¯ã»ã¹ãšãã©ã€ããŒãã¢ã¯ã»ã¹ã®äž¡æ¹ããµããŒãããŠããŸãã ãããªãã¯ãšã³ããã€ã³ãã¢ã¯ã»ã¹ ã¯ä»¥äžã«ããã»ãã¥ãªãã£ã確ä¿ããŸãã IAM ããŒã¹ã®èªèšŒ â ãã¹ã¯ãŒãããŒã¹ã®è匱æ§ã軜æžããŸãã IP ããŒã¹ã®ã¢ã¯ã»ã¹å¶åŸ¡ â IAM ããªã·ãŒæ¡ä»¶ã«ããæ¥ç¶ãå¶éããŸãã SSL/TLS æå·åã®å¿
é å â æå·åããããã©ã³ã¹ããŒããå¿
é ã§ãã ãã©ã€ããŒããšã³ããã€ã³ãã¢ã¯ã»ã¹ (AWS PrivateLink) ã¯ãã©ãã£ãã¯ã AWS å
ã«ä¿æããŸãã VPC ã€ã³ã¿ãŒãã§ã€ã¹ãšã³ããã€ã³ã â ã€ã³ã¿ãŒãããã«å
¬éãããªããã©ã€ããŒãæ¥ç¶ã VPC ãšã³ããã€ã³ãããªã·ãŒ â ãããã¯ãŒã¯ã¬ãã«ã®è¿œå ã®ã¢ã¯ã»ã¹å¶åŸ¡ã ã»ãã¥ãªãã£ã°ã«ãŒã â ç¹å®ã®ãµãããããšããŒããžã®ãã©ãã£ãã¯ãå¶éã VPC ãšã³ããã€ã³ãããªã·ãŒãã¢ã¿ããããŠããšã³ããã€ã³ãçµç±ã§æ¥ç¶ã§ããããªã³ã·ãã«ãå¶éããŸããèšå®ããªãå ŽåãVPC å
ã®ãã¹ãŠã®ããªã³ã·ãã«ããšã³ããã€ã³ãã䜿çšããŠã¯ã©ã¹ã¿ãŒã«æ¥ç¶ã§ããŸãã { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::account-id:role/your-app-role" }, "Action": [ "dsql:DbConnect" ], "Resource": "arn:aws:dsql:region:account-id:cluster/cluster-id" } ] } ãããã¯ãŒã¯ãšã°ã¬ã¹å¶åŸ¡ ã€ã³ããŠã³ãã¢ã¯ã»ã¹ã®å¶åŸ¡ã ãã§ã¯äžååã§ãããšã°ã¬ã¹å¶éããªããã°ã䟵害ãããã¢ããªã±ãŒã·ã§ã³ãå€éšã«ããŒã¿ãéåºããå¯èœæ§ããããŸããã¢ããªã±ãŒã·ã§ã³ãã¹ãããã®ã¢ãŠãããŠã³ããã©ãã£ãã¯ãå¶éããŠãã ããã ã»ãã¥ãªãã£ã°ã«ãŒãã®ã¢ãŠãããŠã³ãã«ãŒã« â å¿
èŠãªå®å
(Aurora DSQL ã®ããŒã 5432ãAWS ãµãŒãã¹ãšã³ããã€ã³ããªã©) ãžã®ãã©ãã£ãã¯ã®ã¿ãèš±å¯ããŸãã VPC Network ACLs â ã»ã«ã³ããªã¬ã€ã€ãŒãšããŠãµããããã¬ãã«ã®ãšã°ã¬ã¹å¶éã远å ããŸãã VPC Flow Logs â äºæããªãã¢ãŠãããŠã³ããã©ãã£ãã¯ãã¿ãŒã³ãç£èŠããŸãã AWS Network Firewall â ã»ãã¥ãªãã£ã°ã«ãŒããè¶
ããããã现ãããšã°ã¬ã¹ãã£ã«ã¿ãªã³ã°ã«äœ¿çšããŸãã èªèšŒæ
å ±ã®ç®¡ç Aurora DSQL ã«æ¥ç¶ããéã®èªèšŒæ
å ±ç®¡çã®ãã¹ããã©ã¯ãã£ã¹ã以äžã«ç€ºããŸãã èªèšŒæ
å ±ãããŒãã³ãŒãããªã â ã¢ããªã±ãŒã·ã§ã³ã³ãŒãã«åã蟌ãŸãªãã§ãã ããã ç°å¢å€æ°ã䜿çšãã â ãã¹ãåããªãŒãžã§ã³ãªã©ã®èšå®å€ã«ã¯ç°å¢å€æ°ã䜿çšããŸãã ããŒã¯ã³ãåçã«çæãã â æ¥ç¶æã« AWS SDK åŒã³åºãã§ããŒã¯ã³ãçæããŸãã AWS Secrets Manager ã䜿çšãã â æ¥ç¶èšå®ã®ä¿åã«å©çšããŸãã IAM èªèšŒæ
å ±ã宿çã«ããŒããŒã·ã§ã³ãã â AWS ã®ã»ãã¥ãªãã£ãã¹ããã©ã¯ãã£ã¹ ã«åŸããŸãã èªèšŒè©Šè¡ãç£èŠãã â CloudTrail ã«ããç°åžžæ€ç¥ ãæŽ»çšããŸãã èªèšŒããŒã¯ã³ããã°ã«èšé²ã»æ°žç¶åããªã â ããŒã¯ã³ã¯ããŒã¿ããŒã¹ãã¹ã¯ãŒããšããŠæž¡ããããããæ¥ç¶æååãã°ãã¢ããªã±ãŒã·ã§ã³ãã°ããšã©ãŒã¡ãã»ãŒãžã«æŒæŽ©ããå¯èœæ§ããããŸãããã®ã³ã°ãã¬ãŒã ã¯ãŒã¯ã§ãã¹ã¯ãŒããã£ãŒã«ãã確å®ã«ãã¹ã¯ããURL ã蚺æåºåã«ããŒã¯ã³ãå«ããªãã§ãã ããã æ¥ç¶ã®ç£èŠ CloudTrail ã¯ãã¹ãŠã® Aurora DSQL èªèšŒã€ãã³ããèšé²ããŸããç°åžžãªæ¥ç¶ã¢ã¯ãã£ããã£ãæ€ç¥ããã¢ã©ãŒããèšå®ããŠãã ããã èªèšŒå€±æ â DbConnect ãŸã㯠DbConnectAdmin ã®ç¹°ãè¿ã倱æã«å¯Ÿã㊠Amazon CloudWatch ã¢ã©ãŒã ãäœæããèªèšŒæ
å ±ã®æªçšãèšå®ãã¹ãæ€ç¥ããŸãã äºæããªãéä¿¡å
IP ããªãŒãžã§ã³ â CloudTrail ã€ãã³ãã sourceIPAddress ãš awsRegion ã§ãã£ã«ã¿ãªã³ã°ããæ³å®å€ã®ãããã¯ãŒã¯ç¯å²ããã®æ¥ç¶ããã©ã°ä»ãããŸãã ç°åžžãªæ¥ç¶ãã¿ãŒã³ â CloudWatch ç°åžžæ€ç¥ã䜿çšããŠãæ¥ç¶éã®æ¥å¢ãéåžžã®éçšæéå€ã®æ¥ç¶ãç£èŠããŸãã é·åœããŒã¯ã³ã®äœ¿çš â èŠæ±ãããæå¹æéãããã©ã«ãã® 15 åãè¶
ãã GenerateDbConnectAdminAuthToken åŒã³åºãã远跡ããŸãã èªå察å¿ãšããŠãCloudTrail ã€ãã³ãã® Amazon EventBridge ã«ãŒã«ã䜿çšããŠã Amazon Simple Notification Service (Amazon SNS) éç¥ã AWS Lambda ã«ãã修埩ã¯ãŒã¯ãããŒãããªã¬ãŒã§ããŸãã SSL/TLS ã®èšå® Amazon Aurora DSQL ã¯æ¥ç¶ã«æå·åãã©ã³ã¹ããŒããå¿
é ãšããŠããŸãã sslmode=require â æå·åã®æå°èŠä»¶ã sslmode=verify-full â å®å
šãªèšŒææžæ€èšŒãšãã¹ãåæ€èšŒã«ããã»ãã¥ãªãã£åŒ·åã æ¬çªç°å¢ã®æšå¥šäºé
: verify-full ã¢ãŒãã䜿çšããŠãã ãããèšŒææžãã§ãŒã³ãšãã¹ãåã®äž¡æ¹ãæ€èšŒããäžéè
æ»æãžã®å¯ŸçãšãªããŸãã Amazon Aurora DSQL ã³ãã¯ã¿ãŒ AWS 㯠Amazon Aurora DSQL ã³ãã¯ã¿ãŒãæäŸããŠããŸããã³ãã¯ã¿ãŒã¯ééçãªèªèšŒã¬ã€ã€ãŒãšããŠæ©èœããIAM ããŒã¯ã³ã®çæãšãªãã¬ãã·ã¥ãèªåçã«åŠçããŸããèªèšŒã³ãŒãã§ã¯ãªããæ¥ç¶ã³ãŒãã ããèšè¿°ããã°æžã¿ãŸãã å©çšå¯èœãªã³ãã¯ã¿ãŒ JDBC Connector â æšæºã® Java ããŒã¿ããŒã¹æ¥ç¶ã¬ã€ã€ãŒã« IAM èªèšŒãçµ±åããæ¢åã® Java ããŒã¿ã¢ã¯ã»ã¹ãã¬ãŒã ã¯ãŒã¯ãšã·ãŒã ã¬ã¹ã«é£æºããŸãã Python Connector â psycopgãpsycopg2ãasyncpg (éåæã¯ãŒã¯ããŒã) ããµããŒãããŸããèªèšŒãã©ã°ã€ã³ãšããŠåäœããæ¢åã®æ¥ç¶ã¯ãŒã¯ãããŒã倿Žããã«ããŒã¯ã³çæãåŠçããŸãã Node.js Connectors â node-postgres (pg) ãš Postgres.js ã®äž¡æ¹ã«å¯Ÿå¿ããŠããŸãã Go Connector â pgx ãã©ããããIAM èªèšŒã®èªååŠçãSSL èšå®ãæ¥ç¶ç®¡çãè¡ããŸãã Ruby Connector â Ruby ã¢ããªã±ãŒã·ã§ã³åãã® IAM ããŒã¹èªèšŒãæäŸããŸãã .NET Connector â Npgsql ãã©ããããIAM èªèšŒã®èªååŠçãSSL èšå®ãæ¥ç¶ç®¡çãè¡ããŸãã Rust Connector â SQLx ãã©ããããIAM èªèšŒã®èªååŠçãSSL èšå®ãæ¥ç¶ç®¡çãè¡ããŸãã å®è£
ã®è©³çްã«ã€ããŠã¯ã Amazon Aurora DSQL Connectors GitHub ãåç
§ããŠãã ããã ã³ãã¯ã¿ãŒäœ¿çšã®å©ç¹ ããŒã¯ã³ç®¡çã®èªåå â ã¯ã©ã¹ã¿ãŒãã¹ãåããã®ãªãŒãžã§ã³èªåæ€åºãå«ããIAM ããŒã¯ã³çæãšãªãã¬ãã·ã¥ã®ã©ã€ããµã€ã¯ã«å
šäœã管çããŸãã ã·ãŒã ã¬ã¹ãªçµ±å â æ¥ç¶ããŒãªã³ã°ã©ã€ãã©ãª (HikariCPãpsycopg ConnectionPoolãpsycopg2 ThreadedConnectionPoolãasyncpg ãã€ãã£ãããŒã«) ãšééçã«é£æºããŸãã ãã¬ãŒã ã¯ãŒã¯ãµããŒã â Spring BootãDjango ãªã©ãæšæºçãªããŒã¿ããŒã¹ãã©ã€ããŒã€ã³ã¿ãŒãã§ã€ã¹ã«äŸåãããã¬ãŒã ã¯ãŒã¯ãšäºææ§ããããŸãã ãã€ã©ãŒãã¬ãŒãã®åæž â æåã®ããŒã¯ã³çæã³ãŒãã®èšè¿°ãã¡ã³ããã³ã¹ãäžèŠã§ãã ã¯ã€ãã¯ã¹ã¿ãŒãäŸ (JDBC ã³ãã¯ã¿ãŒ) 以äžã®äŸã¯ãJava ã§ JDBC ã³ãã¯ã¿ãŒã䜿çšã㊠Aurora DSQL ã¯ã©ã¹ã¿ãŒã«æ¥ç¶ããæ¹æ³ã瀺ããŠããŸããã³ãŒããå®è¡ããåã«ããããžã§ã¯ãã®äŸåé¢ä¿ã« Aurora DSQL JDBC ãã©ã€ããŒã远å ããIAM èªèšŒæ
å ±ãèšå®æžã¿ã§ããããšã確èªããŠãã ãã (ç°å¢å€æ°ãã€ã³ã¹ã¿ã³ã¹ãããã¡ã€ã«ããŸã㯠AWS èªèšŒæ
å ±ãã¡ã€ã«ã®ãããã)ãJDBC URL ã« jdbc:aws-dsql:// ãã¬ãã£ãã¯ã¹ãèšå®ãã DriverManager.getConnection ãåŒã³åºããŸããã³ãã¯ã¿ãŒã IAM ããŒã¯ã³çæãèªåçã«åŠçãããããæåã®ããŒã¯ã³ã³ãŒãã¯äžèŠã§ããã³ãã¯ã¿ãŒã¯ãããŒã¯ã³ãé·æéãã£ãã·ã¥ããã®ã§ã¯ãªããæ°ããæ¥ç¶ãŸãã¯æ¥ç¶ããŒã«ã®åæåããšã«æ°ããããŒã¯ã³ãçæããŸãã // Change the JDBC URL prefix to jdbc:aws-dsql:// String url = "jdbc:aws-dsql://" + clusterEndpoint + ":5432/postgres"; Connection conn = DriverManager.getConnection(url, "admin", ""); // No password needed â the connector handles token generation automatically æåæ¥ç¶ãã¿ãŒã³ ã³ãã¯ã¿ãŒã䜿çšããªãå Žå (åŠç¿ç®çããããã°ãã«ã¹ã¿ã èªèšŒãããŒãªã©) ã¯ãAWS SDK ã§ IAM ããŒã¯ã³ãæåã§çæããããŒã¿ããŒã¹ãã¹ã¯ãŒããšããŠæž¡ããŸãã æ¥ç¶ã«ã¯æäœé sslmode=require ãå¿
èŠã§ããããŒã¯ã³ã¯ãåŒã³åºãå
ã® IAM ã¢ã€ãã³ãã£ãã£ããæŽŸçããç¹å®ã®ã¯ã©ã¹ã¿ãŒãã¹ãåã«ã¹ã³ãŒãããããæå¹æéä»ãã®èªèšŒæ
å ±ã§ãã SDK ããŒã¯ã³çæã¡ãœãã Python (boto3) generate_db_connect_admin_auth_token Java DsqlClient.generateDbConnectAdminAuthToken Node.js GenerateDbConnectAdminAuthTokenCommand Go dsql.GenerateDbConnectAdminAuthToken Ruby Aws::DSQL::Client#generate_db_connect_admin_auth_token .NET AmazonDSQLClient.GenerateDBConnectAdminAuthToken Rust dsql::Client::generate_db_connect_admin_auth_token çæããããŒã¯ã³ããæ¥ç¶ç¢ºç«æã«ããŒã¿ããŒã¹ãã¹ã¯ãŒããšããŠæž¡ããŸãã å®å
šãªã³ãŒãäŸã«ã€ããŠã¯ã Amazon Aurora DSQL ãŠãŒã¶ãŒã¬ã€ã ãš Amazon Aurora DSQL Code Samples ãåç
§ããŠãã ããã æ¥ç¶ããŒãªã³ã° é©åã«èšå®ãããæ¥ç¶ããŒãªã³ã°ã¯ãã¬ã€ãã³ã·ãŒãäœæžããAurora DSQL ã®æ¥ç¶ã¬ãŒãå¶éãžã®å°éãåé¿ããŸããæ¬ã»ã¯ã·ã§ã³ã§ã¯ãããŒã«ã®èšå®ããµã€ãžã³ã°ãèæ
®ãã¹ãäž»èŠãªå¶çŽã«ã€ããŠèª¬æããŸãã ã¯ã©ã€ã¢ã³ãåŽããŒãªã³ã°ãå¿
é Aurora DSQL ã«ã¯ãµãŒãã¹ã¬ã€ã€ãŒã§ã®çµã¿èŸŒã¿æ¥ç¶ããŒãªã³ã°ããããŸãããæ°ããæ¥ç¶ããšã« TLS ãã³ãã·ã§ã€ã¯ãšãµãŒãã¹ã«ããèªèšŒãå¿
èŠã§ããæ¥ç¶ãããŒã«ããã°ããã®ã³ã¹ãããªã¯ãšã¹ãããšã§ã¯ãªãäžåºŠã ãæ¯æãã°ãããªããŸãã PgBouncer ã pgpool-II ãªã©ã®ãµãŒããŒåŽã³ãã¯ã·ã§ã³ããŒã©ãŒã¯äœ¿çšããªãã§ãã ããã ãããã®ããŒã«ã¯åŸæ¥ã® PostgreSQL ã¢ãŒããã¯ãã£åãã«èšèšãããŠãããAmazon Aurora DSQL ã®åæ£æ¥ç¶åŠçã§å¯çšæ§ã®åé¡ãåŒãèµ·ããå¯èœæ§ããããŸãã ããŒã«èšå® æãéèŠãªãã©ã¡ãŒã¿ã¯ æå€§æ¥ç¶å¯¿åœ ã§ããAmazon Aurora DSQL ã¯æ¥ç¶æéã« 60 åã®ããŒããªããããé©çšããŸããããŒã«ã®æå€§ã©ã€ãã¿ã€ã ã 45ã55 åã«èšå®ããAurora DSQL ãæ¥ç¶ãåæããåã«ããã¢ã¯ãã£ãã«ãªãµã€ã¯ã«ããŠãã ããã Java ã§ HikariCP ã䜿çšããå Žåã¯ã maximumPoolSize ã maxLifetime (60 åæªæº) ãèšå®ããæåã®ããŒã¯ã³ç®¡çãé¿ããããã« JDBC Connector ã䜿çšããŸããHikariCP ã®å®å
šãªèšå®ã«ã€ããŠã¯ãå
¬åŒã¬ã€ãã Using Amazon Aurora DSQL with JDBC, Hibernate, and HikariCP ããåç
§ããŠãã ããã Python ã®å Žåã¯ãæåã§çæãã IAM ããŒã¯ã³ã䜿çšã㊠psycopg2 ã§æ¥ç¶ããã ( Amazon Aurora DSQL ãŠãŒã¶ãŒã¬ã€ã â Psycopg2 ã®äœ¿çš ãåç
§)ã Amazon Aurora DSQL Python Connector (GitHub) ã䜿çšããŠããŒã¯ã³ã®ãã€ã©ãŒãã¬ãŒããå®å
šã«æé€ã§ããŸãã æ¥ç¶å¶éãšã¯ã©ãŒã¿ æ¥ç¶ããŒã«ã®ãµã€ãžã³ã°ã決å®ããåã«ãAmazon Aurora DSQL ã®æ¥ç¶å¶éãçè§£ããŠããå¿
èŠããããŸããAmazon Aurora DSQL ã¯æ¥ç¶äœæã¬ãŒãã®å¶åŸ¡ã« ããŒã¯ã³ãã±ããã¢ã«ãŽãªãºã ã䜿çšããŠããŸããæ°ããæ¥ç¶ããšã«ããŒã¯ã³ã 1 ã€æ¶è²»ãããã±ããã¯äžå®ã¬ãŒãã§è£å
ãããŸãããã±ãã容éãäžéãšããŠããŒã¹ããå¯èœã§ãã ã¯ã©ã¹ã¿ãŒãããã®ããã©ã«ãå¶éã¯ä»¥äžã®ãšããã§ãã ã¯ã©ãŒã¿ ããã©ã«ãå€ åè æå€§ç¢ºç«æ¥ç¶æ° 10,000 ã¯ã©ã¹ã¿ãŒããšã®å¶éãService Quotas ã§èª¿æŽå¯èœ æ°èŠæ¥ç¶ã¬ãŒã (å®åžžç¶æ
) 100 æ¥ç¶/ç§ ããŒã¯ã³ãã±ããã®è£å
ã¬ãŒã ããŒã¹ã容é 1,000 æ¥ç¶ è£å
åã® t=0 æç¹ã§å©çšå¯èœãªããŒã¯ã³æ° æå€§æ¥ç¶æé 60 å ããŒããªãããã1 æéåŸã«æ¥ç¶åæ æå€§ãã©ã³ã¶ã¯ã·ã§ã³æé 5 å ãã©ã³ã¶ã¯ã·ã§ã³ããš (BEGIN ãã COMMIT ãŸã§) ããŒã¯ã³ãã±ããã®å®éã®åäœ: ã¢ããªã±ãŒã·ã§ã³èµ·åæã« 1,000 æ¥ç¶ãéããå Žåããã¹ãŠæåããŸã (ããŒã¹ãããŒã¯ã³ 1,000 å)ããã ãããã±ããã¯ç©ºã«ãªããŸãã1,001 çªç®ã®æ¥ç¶ã¯ããã±ããã 100 ããŒã¯ã³/ç§ã§è£å
ãããã®ãåŸ
ã€å¿
èŠããããŸããã¯ã©ã€ã¢ã³ãåŽããŒãªã³ã°ãéèŠãªçç±ã¯ããã«ãããŸããæ¥ç¶ãåå©çšããã°ãäœæããžã§ããã®æ¶è²»ãé¿ããããŸãã æ¥ç¶ã©ã€ããµã€ã¯ã« Aurora DSQL ã®æ¥ç¶ã«ã¯æå€§ã©ã€ãã¿ã€ã ãåºå®ãããŠãããæå¹æéä»ãããŒã¯ã³ã䜿çšãããããã¢ããªã±ãŒã·ã§ã³ã¯æ¥ç¶ã®ãªãµã€ã¯ã«ãšããŒã¯ã³ãªãã¬ãã·ã¥ãé©åã«åŠçããå¿
èŠããããŸãã 1 æéã®æ¥ç¶å¶é Amazon Aurora DSQL ã®ãã¹ãŠã®æ¥ç¶ã®æå€§ã©ã€ãã¿ã€ã 㯠60 åã§ãã1 æéåŸãæ¥ç¶ãã¢ã€ãã«ç¶æ
ã§ãã¢ã¯ãã£ãç¶æ
ã§ãããµãŒãã¹ãæ¥ç¶ãåæããŸããããã¯èšèšäžã®ä»æ§ã§ããAurora DSQL ã®åæ£ã¢ãŒããã¯ãã£ã§ã¯å
éšã³ã³ããŒãã³ããããã¯ã°ã©ãŠã³ãã§é害埩æ§ã亀æãããããã1 æéã®å¶éã«ããã¢ããªã±ãŒã·ã§ã³ã宿çã«æ°ããæ¥ç¶ã確ç«ããæ£åžžãªã€ã³ãã©ã«èªç¶ã«æ¥ç¶ãããããã«ãªã£ãŠããŸããAurora DSQL ã¯åæã«ãžãã¿ãŒãé©çšãããããæ¥ç¶ãåæã«åæãããããšã¯ãªãããã©ã³ã¶ã¯ã·ã§ã³äžã®æ¥ç¶ã¯åæãããŸããã ããŒã¯ã³ã®æå¹æé管ç ããŒã¯ã³ã¯ããã©ã«ãã§ 15 ååŸã«æéåãã«ãªããŸã (æå€§ 1 é±éãŸã§èšå®å¯èœ)ãéèŠãªãã€ã³ã: æå¹ãªããŒã¯ã³ã§æ¥ç¶ã確ç«ãããåŸã¯ãããŒã¯ã³ãæéåãã«ãªã£ãŠãæ¥ç¶ã¯æå¹ãªãŸãŸã§ããæ°ããããŒã¯ã³ãå¿
èŠãªã®ã¯æ°ããæ¥ç¶ã確ç«ãããšãã ãã§ããã60 åã®æ¥ç¶å¶éããã€ã³ãã£ã³ã°å¶çŽãšãªããŸããããŒã¯ã³ã®æå¹æéã¯å¶çŽã«ãªããŸããã ããŒã¯ã³ã¯ãªãŒãžã§ã³ã¹ã³ãŒãã§ããããŸãã region=us-east-1 ã§çæãããããŒã¯ã³ã¯ us-east-1 ãšã³ããã€ã³ããžã®æ¥ç¶ã«ã®ã¿æå¹ã§ãåããã«ããªãŒãžã§ã³ã¯ã©ã¹ã¿ãŒã® us-east-2 ãšã³ããã€ã³ãã«ã¯äœ¿çšã§ããŸããããã«ããªãŒãžã§ã³ãããã€ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ãæ¥ç¶ããåãªãŒãžã§ã³ãšã³ããã€ã³ãã«å¯ŸããŠåå¥ã®ããŒã¯ã³ãçæããŠãã ããã æšå¥šã¢ãããŒã: Amazon Aurora DSQL ã³ãã¯ã¿ãŒ ã䜿çšããŠãã ãããæ°ããæ¥ç¶ããšã«èªåçã«ããŒã¯ã³ãçæãããããããŒã¯ã³ç®¡çã³ãŒããäžèŠã§ãã æ¥ç¶ãªãã©ã€ããžãã¯ åæ£ã·ã¹ãã ã§ã¯äžæçãªæ¥ç¶é害ã¯äŸå€ã§ã¯ãªãéåžžã®åäœã§ããå
éšã³ã³ããŒãã³ãã«é害ãçºçããå ŽåãAurora DSQL ãèªåçã«åŠçããŸãããã¢ããªã±ãŒã·ã§ã³åŽã§ã¯ãã®æ¥ç¶ã«å¯Ÿãããšã©ãŒãçºçããŸãã SerializationFailure (OCC ã³ã³ããªã¯ã) ãš OperationalError (äžæçãªé害) ã®äž¡æ¹ã«å¯ŸããŠããšã¯ã¹ããã³ã·ã£ã«ããã¯ãªããšãžãã¿ãŒã䌎ããªãã©ã€ããžãã¯ãå®è£
ããŠãã ãããæšå¥šãã¿ãŒã³ã«ã€ããŠã¯ãAmazon Aurora DSQL ã®åæå®è¡å¶åŸ¡ããã¥ã¡ã³ããš AWS Buildersâ Library â ã¿ã€ã ã¢ãŠãããªãã©ã€ããžãã¿ãŒä»ãããã¯ãªã ãåç
§ããŠãã ããã ãã«ããªãŒãžã§ã³æ¥ç¶ãã¿ãŒã³ å°ççãªãŒãžã§ã³ããŸããã é«å¯çšæ§ãå¿
èŠãªã¢ããªã±ãŒã·ã§ã³åãã«ãAmazon Aurora DSQL ãã«ããªãŒãžã§ã³ã¯ã©ã¹ã¿ãŒã¯ãªãŒãžã§ã³ãšã³ããã€ã³ãã§èªã¿æžãäž¡æ¹ããµããŒãããã¢ã¯ãã£ã-ã¢ã¯ãã£ãã¢ãŒããã¯ãã£ãæäŸããŸãã ã¢ã¯ãã£ã-ã¢ã¯ãã£ã ãã«ããªãŒãžã§ã³ã¢ãŒããã¯ã㣠Amazon Aurora DSQL ãã«ããªãŒãžã§ã³ã¯ã©ã¹ã¿ãŒã¯ãã¢ã¯ãã£ã-ã¢ã¯ãã£ãã¢ã¯ã»ã¹ã®ããã®ãªãŒãžã§ã³ãšã³ããã€ã³ããæäŸããŸããã¢ããªã±ãŒã·ã§ã³ã¯ã©ã¡ãã®ãšã³ããã€ã³ãã«ãæ¥ç¶ããŠèªã¿æžããå¯èœã§ãå°ççãªåæ£ãšãªãŒãžã§ã³ãã§ã€ã«ãªãŒããŒãå®çŸããŸãã ãšã³ããã€ã³ãéžææŠç¥ ã¬ã€ãã³ã·ãŒã®ããã«æå¯ãã®ãªãŒãžã§ã³ãšã³ããã€ã³ãã«æ¥ç¶ãããã©ã€ããªãªãŒãžã§ã³ã«åé¡ãããå Žåã¯ã»ã«ã³ããªãšã³ããã€ã³ããžã®ãã«ã¹ããŒã¹ã®ãã§ã€ã«ãªãŒããŒãå®è£
ããŸãã ãã§ã€ã«ãªãŒããŒããžãã¯ã¯äºåã«ãã¹ãããŠãããŠãã ããã äžè¬çãªæ¥ç¶åé¡ã®ãã©ãã«ã·ã¥ãŒãã£ã³ã° æ¬ã»ã¯ã·ã§ã³ã§ã¯ãAurora DSQL ã«æ¥ç¶ããéã«çºçãããããšã©ãŒãæ¥ç¶é害ãšããã®åå ããã³æšå¥šãããå¯ŸåŠæ¹æ³ã«ã€ããŠèª¬æããŸããèªèšŒå€±æãã¿ã€ã ã¢ãŠããšã©ãŒããã©ã€ããŒã®äºææ§ã®åé¡ã®ãããã®å Žåãã以äžã®ã¬ã€ãã³ã¹ã§åé¡ãè¿
éã«èšºæã»è§£æ±ºã§ããŸãã åé¡ 1: âConnection Attempt Failedâ çç¶: Amazon Aurora DSQL ãšã³ããã€ã³ããžã®æ¥ç¶ã確ç«ã§ããªã äžè¬çãªåå : IAM æš©éã®äžåãèªèšŒããŒã¯ã³ã®æéåãããããã¯ãŒã¯æ¥ç¶ã®åé¡ããšã³ããã€ã³ã圢åŒã®èª€ã è§£æ±ºæ¹æ³: æ¥ç¶å€±æã解決ããã«ã¯ã以äžã®æé ãé ã«å®è¡ããŠãã ããããŸããIAM ãŠãŒã¶ãŒãŸãã¯ããŒã«ã®ããªã·ãŒã«é©å㪠dsql:DbConnect ãŸã㯠dsql:DbConnectAdmin æš©éãã¢ã¿ãããããŠããããšã確èªããŸããæ¬¡ã«ãèªèšŒããŒã¯ã³ãæéåãã§ãªãããšã確èªããŸããããŒã¯ã³ã¯çåœã§ãããæ°ããæ¥ç¶è©Šè¡ã®ãã³ã«åçæãå¿
èŠã§ããã¯ã©ã¹ã¿ãŒãšã³ããã€ã³ãã®åœ¢åŒãæ£ããããšãããŒã 5432 ãžã®ã¢ãŠãããŠã³ããã©ãã£ãã¯ããããã¯ãããããã¯ãŒã¯ã¬ãã«ã®å¶é (ã»ãã¥ãªãã£ã°ã«ãŒããVPC ã«ãŒãã£ã³ã°ã«ãŒã«ããã¡ã€ã¢ãŠã©ãŒã«ããªã·ãŒãªã©) ããªãããšã確èªããŠãã ããã以äžã®äŸã¯ãæ°ããããŒã¯ã³ãçæããŠæç€ºçãªãšã©ãŒãã³ããªã³ã°ã§æ¥ç¶ã詊ã¿ãããšã§ãæ ¹æ¬åå ãç¹å®ããããããæ¹æ³ã瀺ããŠããŸãã # Verify IAM permissions aws iam get-user # Test token generation aws dsql generate-db-connect-admin-auth-token \ --region us-east-1 \ --hostname <cluster-id>.dsql.us-east-1.on.aws # Test network connectivity nc -zv <cluster-id>.dsql.us-east-1.on.aws 5432 åé¡ 2: âAccess Deniedâ ãšã©ãŒ çç¶: æ¥ç¶ã¯ç¢ºç«ããããèªèšŒã«å€±æãã è§£æ±ºæ¹æ³: IAM ããªã·ãŒã« dsql:DbConnect ãŸã㯠dsql:DbConnectAdmin ãå«ãŸããŠããããšã確èªããŸãã IAM ããªã·ãŒã®ã¢ã¯ã»ã¹å¶éæ¡ä»¶ (aws:SourceIpãaws:RequestedRegionãaws:PrincipalTag ãªã©) ã確èªããŸããåºæ¬æš©éãä»äžãããŠããŠããæ¡ä»¶ã«ãã£ãŠæ¥ç¶ããµã€ã¬ã³ãã«æåŠãããå ŽåããããŸãã ããŒã¯ã³ãæ£ãããªãŒãžã§ã³ã§çæãããŠããããšã確èªããŸãã AWS èªèšŒæ
å ±ãæéåãã§ãªãããšã確èªããŸãã åé¡ 3: PrivateLink æ¥ç¶ã®åé¡ VPC ã®å€éšãã PrivateLink çµç±ã§æ¥ç¶ããå Žåãã¯ã©ã€ã¢ã³ãã¯ã¯ã©ã¹ã¿ãŒãšã³ããã€ã³ãã VPC ãšã³ããã€ã³ã IP ã«è§£æ±ºããå¿
èŠããããŸãã2 ã€ã®ã¢ãããŒãããããŸãã ãªãã·ã§ã³ 1: PGHOSTADDR ã§ IP ã¢ãã¬ã¹ããªãŒããŒã©ã€ã export PGHOSTADDR=<vpce-ip-address> export HOSTNAME=<cluster-id>.dsql.<region>.on.aws psql -h $HOSTNAME -U admin -d postgres SNI ã«æ£ãããã¹ãåã䜿çšããªãã VPC ãšã³ããã€ã³ã IP ã«æ¥ç¶ããŸãã ãªãã·ã§ã³ 2: amzn-cluster-id æ¥ç¶ãªãã·ã§ã³ãäœ¿çš (DNS äžèŠ) export CLUSTERID=<cluster-id> export PGOPTIONS="-c amzn-cluster-id=$CLUSTERID" psql -h <vpce-endpoint> -U admin -d postgres ã¯ã©ã¹ã¿ãŒèå¥åãæ¥ç¶ãªãã·ã§ã³ãšããŠçŽæ¥æž¡ããDNS 解決ãäžèŠã«ããŸããVPC ãšã³ããã€ã³ãã®ãã©ã€ããŒã DNS ãèšå®ãããŠããªãå Žåã«äŸ¿å©ã§ãã 詳现ã«ã€ããŠã¯ã PrivateLink æ¥ç¶ãšã³ããã€ã³ãã䜿çšãã Amazon Aurora DSQL ãžã®æ¥ç¶ ãåç
§ããŠãã ããã åé¡ 4: æ¥ç¶ããŒã«ã®ãã«ã¹ãã§ãã¯ã¹ããŒã çç¶: è² è·ã¹ãã€ã¯æã®å€§éã®æ¥ç¶åæãšå確ç«ãã«ã¹ã±ãŒãçãªãã«ã¹ãã§ãã¯å€±æãæ¥ç¶ã¬ãŒãå¶éãšã©ãŒ åå : çããã«ã¹ãã§ãã¯éé (HikariCP ã®ããã©ã«ã 5 ç§ã¿ã€ã ã¢ãŠããªã©) ã«ãããæ°åã®ããŒã«æ¥ç¶ã«å¯ŸããŠåæã«ãã«ã¹ãã§ãã¯ãããªã¬ãŒãããå ŽåããããŸãã倿°ã®ãã§ãã¯ãåæã«å€±æãããšãããŒã«ããã¹ãŠã®æ¥ç¶ã®å確ç«ã詊ã¿ã100 æ¥ç¶/ç§ã®ã¬ãŒãå¶éã䜿ãæãããŠé害ãã«ã¹ã±ãŒãããŸãã è§£æ±ºæ¹æ³: ãã¹ãŠã®æ¥ç¶ã«åºå®ééã䜿çšããã®ã§ã¯ãªããæ¥ç¶éã§ãã«ã¹ãã§ãã¯ééãããããŸãã äžèŠãªæ¥ç¶ãªãµã€ã¯ã«ãé¿ãããããã¢ã€ãã«ã¿ã€ã ã¢ãŠããå¢ãããŸãã HikariCP ã®å Žåã connectionTimeout ãš validationTimeout ãããã©ã«ãããé·ãèšå®ããŸãã maxLifetime ã«ååãªãžãã¿ãŒãèšå®ããŸã (HikariCP ã¯èªåç㫠±2.5% ãé©çš)ãåæããæ¥ç¶æéåããåé¿ã§ããŸãã ãŸãšã æ¬èšäºã§ã¯ãJDBC ã PostgreSQL äºæã¯ã©ã€ã¢ã³ããAWS CLI ãªã©ãããŸããŸãªãã©ã€ããŒãããŒã«ã䜿çšã㊠Amazon Aurora DSQL ã«æ¥ç¶ããæ¹æ³ã玹ä»ããŸãããæ¥ç¶ã¢ãŒããã¯ãã£ãIAM ããŒã¹ã®èªèšŒããŒã¯ã³ã®çæãšäœ¿ç𿹿³ãèªèšŒæ
å ±ç®¡çãšæ¥ç¶ããŒãªã³ã°ã®ãã¹ããã©ã¯ãã£ã¹ã«ã€ããŠè§£èª¬ããŸãããã¯ã€ãã¯ã¹ã¿ãŒãäŸãšãäžè¬çãªæ¥ç¶åé¡ã®èšºæã»è§£æ±ºã«åœ¹ç«ã€ãã©ãã«ã·ã¥ãŒãã£ã³ã°ã¬ã€ããæäŸããŸããã å®éã«è©ŠããŠã¿ããã§ãã? ãã¬ã€ã°ã©ãŠã³ã ã§ã»ããã¢ãããªãã« Aurora DSQL ãäœéšã§ããŸã ãæ¥ç¶ã®æäœãã¯ãšãªã®å®è¡ãæ¬èšäºã§ç޹ä»ããæ©èœã®ç¢ºèªãå®éã«è¡ããŸãã èè
ã«ã€ã㊠Alex Pawvathil Alex ã¯ãAWS ã®ã·ãã¢ãã¯ãã«ã«ã¢ã«ãŠã³ããããŒãžã£ãŒã§ãããŒã¿ããŒã¹ã¢ãŒããã¯ãã£ãšãšã³ã¿ãŒãã©ã€ãºèŠæš¡ã®å®è£
ãå°éãšããŠããŸããã¯ã©ãŠãã¢ãŒããã¯ãã£ãããŒã¿ããŒã¹æŠç¥ããšã³ã¿ãŒãã©ã€ãºã¢ããã€ã¶ãªãŒã§ 14 幎以äžã®å®åçµéšããããAmazon RDS for SQL Server ã®å®è£
ãšãšã³ã¿ãŒãã©ã€ãºèŠæš¡ã®ãããã€ã¡ã³ãã®å°éå®¶ã§ãã Sandhya Khanderia Sandhya ã¯ãAWS ã®ã·ãã¢ãã¯ãã«ã«ã¢ã«ãŠã³ããããŒãžã£ãŒå
ŒããŒã¿ã¢ããªãã£ã¯ã¹ã¹ãã·ã£ãªã¹ãã§ããAWS ã®ã客æ§ãšå¯æ¥ã«é£æºããç¶ç¶çãªãµããŒããšæè¡ã¬ã€ãã³ã¹ãæäŸããŠããŸãããã¹ããã©ã¯ãã£ã¹ã掻çšãããœãªã¥ãŒã·ã§ã³ã®èšç»ã»æ§ç¯ãæ¯æŽããªãããAWS ç°å¢ã®éçšç¶æ
ãããã¢ã¯ãã£ãã«å¥å
šã«ä¿ã€ããšã«åãçµãã§ããŸãã Rob Petersen Rob ã¯ãAWS ã®ã·ãã¢ãã¯ãã«ã«ã¢ã«ãŠã³ããããŒãžã£ãŒã§ãIT æ¥çã§ã® 20 幎ã®çµéšã掻ãããã客æ§ã®ã¯ã©ãŠãå°å
¥ãžã£ãŒããŒãæ¯æŽããŠããŸããå€§èŠæš¡ãªã¯ã©ãŠããã€ã°ã¬ãŒã·ã§ã³ã®ãªãŒããšãã€ããªããã€ã³ãã©ã¹ãã©ã¯ãã£ã®éçšç®¡çã®äž¡æ¹ã®çµéšããããã¯ã©ãŠãå°å
¥æã«çµç¹ãçŽé¢ãã課é¡ãšæ©äŒã«ã€ããŠç¬èªã®èŠç¹ãæã£ãŠããŸãã ãã®èšäºã¯ Kiro ã翻蚳ãæ
åœããSolutions Architect ã® Arisa Izuno ãã¬ãã¥ãŒããŸããã


























