Alibaba Cloud SDK for Go の統合と使用に関するよくある質問への回答を紹介します。
前提条件
-
Go 1.10.x 以降がインストールされています。
-
ネットワーク経由で Alibaba Cloud API にアクセスできることを確認してください。
概要
-
Alibaba Cloud SDK が Alibaba Cloud サービスに接続できない場合、どのようなエラーコードが返されますか?
-
API リクエストがタイムアウトし、「*net.DNSError」または「net.OpError」エラーが発生する場合、どうすればよいですか?
-
異なる依存ライブラリ間のバージョン競合によりコンパイルが失敗するか、「missing go.sum entry」エラーメッセージが返される場合、どうすればよいですか?
-
API オペレーションを呼び出すときに「MissingRequiredParameter」エラーが返される場合、どうすればよいですか?
-
指定したリージョンでオペレーションがサポートされていないため API オペレーションの呼び出しに失敗し、「404 Not Found」メッセージが返される場合、どうすればよいですか?
問題と解決策
アクセスキーのエラーを処理するにはどうすればよいですか?
アクセスキー ペアが正しく設定されていない場合、次のエラーメッセージが返されます。
-
Alibaba Cloud SDK V2.0: InvalidCredentials: Please set up the credentials correctly. If you are setting them through environment variables, please ensure that ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set correctly.
-
Alibaba Cloud SDK V1.0: SDK.ServerError InvalidAccessKeyId.NotFound Specified access key is not found.
解決策:
-
次のコマンドを実行して、
ALIBABA_CLOUD_ACCESS_KEY_IDおよびALIBABA_CLOUD_ACCESS_KEY_SECRET環境変数が設定されているかどうかを確認してください。Linux/macOS
echo $ALIBABA_CLOUD_ACCESS_KEY_ID echo $ALIBABA_CLOUD_ACCESS_KEY_SECRETWindows
echo %ALIBABA_CLOUD_ACCESS_KEY_ID% echo %ALIBABA_CLOUD_ACCESS_KEY_SECRET%有効なアクセスキー ペアが返される場合、環境変数は正しく設定されています。アクセスキー ペアが返されないか、無効なアクセスキー ペアが返される場合は、必要に応じて環境変数を設定してください。詳細については、「Linux、macOS、および Windows での環境変数の設定」をご参照ください。
-
コード内のアクセスキー ペアに関連するエラーを確認してください。
エラーリクエストのサンプル:
config := &openapi.Config{ AccessKeyId: tea.String(os.Getenv("yourAccessKeyID")), AccessKeySecret: tea.String(os.Getenv("yourAccessKeySecret")), }成功リクエストのサンプル:
config := &openapi.Config{ AccessKeyId: tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")), AccessKeySecret: tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")), }説明os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")およびos.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")は、対応する環境変数から AccessKey ID と AccessKey secret を取得します。重要セキュリティリスクを防ぐため、アクセスキー ペアをコードにハードコードしないでください。
Alibaba Cloud SDK が Alibaba Cloud サービスに接続できない場合、どのようなエラーコードが返されますか?
次のいずれかのエラーコードが返される可能性があります。
-
InvalidAccessKeyId:AccessKey ID が有効かどうかを確認してください。
-
SignatureDoesNotMatch:AccessKey secret が有効かどうかを確認してください。
ネットワーク接続を確認し、リクエストがファイアウォールによってブロックされていないことを確認してください。
API リクエストがタイムアウトし、「*net.DNSError」または「net.OpError」エラーが発生する場合、どうすればよいですか?
API リクエストのタイムアウトには複数の原因が考えられます。以下は一般的な原因と解決策です。
ネットワーク接続の問題
原因:クライアントとサーバー間のネットワーク接続が不安定であるか、失敗しているため、リクエストがサーバーに到達できません。
解決策:
ping または curl コマンドを実行して、オンプレミスホストとクラウドサービスのエンドポイント間の接続をテストしてください。たとえば、ping dysmsapi.aliyuncs.com または curl -v https://dysmsapi.aliyuncs.com コマンドを実行して、オンプレミスホストと Short Message Service (SMS) API のエンドポイント間の接続をテストしてください。
-
コマンドがタイムアウトするか、応答を受信しない場合は、オンプレミスのファイアウォールまたはルーターのブロックポリシーを確認してください。
-
応答が返される場合は、不適切なタイムアウト設定によるリクエストの失敗を防ぐため、適切なタイムアウト期間を指定することを推奨します。詳細については、「タイムアウト期間の設定」をご参照ください。サンプルコード:
// RuntimeOptions インスタンスを作成し、ランタイムパラメータを指定します。 runtime := &util.RuntimeOptions{} // 接続リクエストのタイムアウト期間を設定します。単位:ミリ秒。 runtime.ConnectTimeout = tea.Int(10000) // 接続リクエストのタイムアウト期間を 10 秒に設定します。
API リクエストの処理時間が長い
原因:API リクエストの処理時間が、指定された読み取りタイムアウト期間を超えています。
解決策:読み取りタイムアウト期間を延長します。詳細については、「タイムアウト期間の設定」をご参照ください。サンプルコード:
// RuntimeOptions インスタンスを作成し、ランタイムパラメータを指定します。
runtime := &util.RuntimeOptions{}
// 読み取りリクエストのタイムアウト期間を設定します。単位:ミリ秒。
runtime.ReadTimeout = tea.Int(10000) // 読み取りリクエストのタイムアウト期間を 10 秒に設定します。
異なる依存ライブラリ間のバージョン競合によりコンパイルが失敗するか、「missing go.sum entry」エラーメッセージが返される場合、どうすればよいですか?
このエラーは、go.sum ファイルに必要な依存関係が欠落しているために発生します。go.mod ファイルはプロジェクトの依存関係を管理します。go.mod に依存関係のバージョン競合が存在しないことを確認し、次のコマンドを実行して依存関係を更新し、go.mod と go.sum ファイルを同期してください。
go mod tidy
既存のプロジェクトで SDK for Go を使用するにはどうすればよいですか?
-
VS Code を開きます。上部メニューで、[File] > [Open Folder] を選択します。プロジェクトフォルダを作成して選択するか、既存のプロジェクトフォルダを選択します。この例では、
gosdkprojectという名前のフォルダが作成され、選択されます。 -
上部メニューで、[Terminal] > [New Terminal] を選択します。コンソールの下部に TERMINAL ウィンドウが表示されます。TERMINAL ウィンドウで
go mod init gosdkprojectコマンドを実行して、Go プロジェクトを初期化します。Go プロジェクトが初期化されると、現在のプロジェクトディレクトリにgo.modファイルが生成されます。go.modファイルは Go プロジェクトのモジュールファイルであり、プロジェクトの依存関係とバージョン情報を管理するために使用されます。
-
SDK センターにアクセスし、SDK を使用するクラウド製品を選択します。[SDK version] を [V2.0] に設定し、言語を [Go] に設定します。インストールコマンドをコピーしてターミナルに貼り付け、Enter キーを押して実行します。
API オペレーションを呼び出すときに「MissingRequiredParameter」エラーが返される場合、どうすればよいですか?
次の例では、Short Message Service (SMS) の SendSms API を使用します。
-
OpenAPI 開発者ポータルの [API Debugging] ページにアクセスし、クラウド製品と API オペレーションを選択します。
-
作成したリクエストオブジェクトに、
PhoneNumbersやSignNameなどの必須パラメータが指定されているかどうかを確認してください。この例では、リクエストオブジェクトはSendSmsRequestです。 -
API リファレンスに基づいて、すべての必須パラメータが指定されていることを確認してください。
-
必須パラメータの値が有効であることを確認してください。たとえば、携帯電話番号が有効な形式で指定されているかどうかを確認してください。
-
SDK は、API リクエストを送信する前にパラメータを自動的に検証します。必須パラメータが欠落している場合、
MissingRequiredParameterなどのエラーが返されます。たとえば、PhoneNumbersパラメータが指定されていない場合、「MissingPhoneNumbers: code: 400」エラーが返されます。エラーメッセージに基づいて、欠落しているパラメータを指定してください。
sendSmsRequest := &dysmsapi20170525.SendSmsRequest{
// SMS テンプレートのコード。
TemplateCode: tea.String("<YOUR_VALUE>"),
// SMS テンプレートの変数。例:{\"code\":\"1234\"}
TemplateParam: tea.String("{\"code\":\"1234\"}"),
// テキストメッセージを送信する携帯電話番号。
PhoneNumbers: tea.String("<YOUR_VALUE>"),
// SMS 署名の名前。
SignName: tea.String("<YOUR_VALUE>"),
}
指定したリージョンでオペレーションがサポートされていないため API オペレーションの呼び出しに失敗し、「404 Not Found」メッセージが返される場合、どうすればよいですか?
選択したリージョンが、呼び出しているサービスをサポートしていることを確認してください。たとえば、Short Message Service (SMS) の場合、OpenAPI 開発者ポータルの製品ページでエンドポイントを確認できます。
製品ページの [Service Area List] セクションで、[region ID] 列と [endpoint] 列を確認して、ターゲットリージョンのエンドポイントを確認してください。たとえば、Short Message Service (SMS) (API バージョン 2017-05-25) の場合、ほとんどのリージョンのエンドポイントは dysmsapi.aliyuncs.com です。
go get コマンドを実行したときに「go: go.mod file not found in current directory or any parent directory.」メッセージが返される場合、どうすればよいですか?
このメッセージは、現在のディレクトリまたは親ディレクトリに go.mod ファイルが存在しないことを示しています。go.mod ファイルは、プロジェクトの依存関係とバージョンを管理します。次のコマンドを実行して、go.mod ファイルを初期化します。
# 現在のディレクトリに新しい go.mod ファイルを初期化し、モジュール名を定義します。ほとんどの場合、モジュール名はリポジトリへの URL パスです。この例では、ドメイン名は example.com、プロジェクト名は goproject です。
go mod init example.com/goproject
基本的な Go 例外のチェックリスト
|
エラーメッセージ |
原因 |
解決策 |
|
|
|
ポインターを使用する前に、ポインターが |
|
無効なメモリアドレスまたは |
無効なメモリアドレスがアクセスされているか、 |
メモリアドレスにアクセスする前に、メモリアドレスが有効であり、メモリアドレスにメモリが割り当てられていることを確認してください。条件文またはエラー処理メカニズムを使用して、メモリアドレスが有効かどうかを確認できます。 |
|
タイムアウトとキャンセル |
ネットワークリクエストまたはオペレーションがタイムアウトするか、キャンセルされます。 |
ネットワークリクエストを送信する前、または時間のかかるオペレーションを実行する前に、適切なタイムアウト期間を設定し、ビジネス要件に基づいてネットワークリクエストまたはオペレーションをキャンセルしてください。 |
テクニカルサポート
上記のよくある質問で問題が解決しない場合は、Alibaba Cloud テクニカルサポートにお問い合わせください。
-
チケットを送信:Alibaba Cloud ウェブサイトでチケットを送信。
-
ご質問やフィードバックがある場合は、DingTalk グループ (ID: 60965016010) で Alibaba Cloud テクニカルサポートにお問い合わせください。