このトピックでは、Alibaba Cloud SDK for Go の統合に関するよくある質問への回答を提供します。これは、Alibaba Cloud SDK for Go を開発に効率的に使用するために役立ちます。
前提条件
Go 1.10.x 以降がインストールされている。
Alibaba Cloud API がネットワーク経由で到達可能であることを確認します。
概要
Alibaba Cloud SDK が Alibaba Cloud サービスに接続できない場合、どのエラーコードが返されますか?
API リクエストがタイムアウトし、「*net.DNSError」または「net.OpError」エラーが報告された場合はどうすればよいですか?
異なる依存ライブラリ間の依存関係バージョンの競合が原因で、コンパイルが失敗するか、「go.sum エントリがありません」というエラーメッセージが返された場合はどうすればよいですか?
API 操作を呼び出したときに「MissingRequiredParameter」エラーが報告された場合はどうすればよいですか?
指定されたリージョンで操作がサポートされていないため、API 操作の呼び出しに失敗し、「404 Not Found」メッセージが返された場合はどうすればよいですか?
問題と解決策
AccessKey エラーを処理するにはどうすればよいですか?
問題:コードを実行した後に、次のエラーメッセージが返されます。このエラーメッセージは、AccessKey ペアが正しく構成されていないことを示しています。
Alibaba Cloud SDK V2.0: InvalidCredentials: 認証情報を正しく設定してください。環境変数を使用して設定する場合は、ALIBABA_CLOUD_ACCESS_KEY_ID と ALIBABA_CLOUD_ACCESS_KEY_SECRET が正しく設定されていることを確認してください。
Alibaba Cloud SDK V1.0: SDK.ServerError InvalidAccessKeyId.NotFound 指定されたアクセスキーが見つかりません。
解決策:
次のコマンドを実行して、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%有効な AccessKey ペアが返された場合、環境変数は正しく構成されています。AccessKey ペアが返されない場合、または無効な AccessKey ペアが返された場合は、必要に応じて環境変数を構成します。詳細については、「Linux、macOS、および Windows で環境変数を構成する」をご参照ください。
コード内で AccessKey ペアに関連するエラーを確認します。
エラーリクエストの例:
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 シークレットが ALIBABA_CLOUD_ACCESS_KEY_ID および ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数から取得されることを指定します。
重要セキュリティリスクを防ぐため、オンラインコードに AccessKey ペアを書き込まないでください。
Alibaba Cloud SDK が Alibaba Cloud サービスに接続できない場合、どのエラーコードが返されますか?
次のエラーコードのいずれかが返される可能性があります。
InvalidAccessKeyId: AccessKey ID が有効かどうかを確認します。
SignatureDoesNotMatch: AccessKey シークレットが有効かどうかを確認します。
ネットワーク接続を確認し、リクエストがファイアウォールによってブロックされていないことを確認します。
API リクエストがタイムアウトし、「*net.DNSError」または「net.OpError」エラーが報告された場合はどうすればよいですか?
API リクエストのタイムアウトは、複数の要因によって発生する可能性があります。以下では、一般的な原因と対応する解決策について説明します。
ネットワーク接続の問題
原因:クライアントとサーバー間のネットワーク接続が失敗したか、ネットワークが不安定なため、リクエストがサーバーに到達できません。
解決策:
ping または curl コマンドを実行して、オンプレミスホストとクラウドサービスのエンドポイント間の接続性をテストします。たとえば、ping dysmsapi.aliyuncs.com または curl -v https://dysmsapi.aliyuncs.com コマンドを実行して、オンプレミスホストとショートメッセージサービス(SMS)API のエンドポイント間の接続性をテストします。
コマンドがタイムアウトしたか、応答を受信しなかった場合は、オンプレミスファイアウォールまたはルーターのブロッキングポリシーを確認します。
応答が返された場合は、不適切なタイムアウト構成によってリクエストが失敗するのを防ぐため、適切なタイムアウト期間を指定することをお勧めします。詳細については、「タイムアウト期間を構成する」をご参照ください。サンプルコード:
// RuntimeOptions インスタンスを作成し、ランタイムパラメータを指定します。 runtime := &util.RuntimeOptions{} // 接続リクエストのタイムアウト期間を構成します。単位:ミリ秒。 runtime.ConnectTimeout = tea.Int(10000) // 接続リクエストのタイムアウト期間を 10 秒に設定します。
API リクエストの処理時間が長い
原因:API リクエストの処理時間が、指定された読み取りタイムアウト期間を超えています。
解決策:API 応答のタイムアウト期間を延長します。詳細については、「タイムアウト期間を構成する」をご参照ください。たとえば、読み取りタイムアウトパラメータを構成して、読み取りタイムアウト期間を延長できます。サンプルコード:
// RuntimeOptions インスタンスを作成し、ランタイムパラメータを指定します。
runtime := &util.RuntimeOptions{}
// 読み取りリクエストのタイムアウト期間を構成します。単位:ミリ秒。
runtime.ReadTimeout = tea.Int(10000) // 読み取りリクエストのタイムアウト期間を 10 秒に設定します。異なる依存ライブラリ間の依存関係バージョンの競合が原因で、コンパイルが失敗するか、「go.sum エントリがありません」というエラーメッセージが返された場合はどうすればよいですか?
「go.sum エントリがありません」というエラーメッセージは、使用する依存関係が go.sum ファイルに存在しないために返されます。Go プロジェクトの go.mod ファイルは、プロジェクトの依存関係を管理するために使用されます。go.mod ファイルに依存関係バージョンの競合がないことを確認します。端末で次のコマンドを実行して、現在のモジュールの依存関係を更新し、go.mod および go.sum ファイルを更新します。
go mod tidy既存のプロジェクトで SDK for Go を使用するにはどうすればよいですか?
VS Code を開きます。上部のナビゲーションバーで、[ファイル] > [フォルダーを開く] を選択します。プロジェクトフォルダーを作成して選択するか、既存のプロジェクトフォルダーを選択します。この例では、gosdkproject という名前のフォルダーが作成され、選択されます。
上部のナビゲーションバーで、[ターミナル] > [新しいターミナル] を選択します。TERMINAL ウィンドウがコンソールの 下部に表示されます。TERMINAL ウィンドウで
go mod init gosdkprojectsコマンドを実行して、Go プロジェクトを初期化します。Go プロジェクトが初期化されると、現在のプロジェクトディレクトリに go.mod ファイルが生成されます。go.mod ファイルは、Go プロジェクトのモジュールファイルであり、プロジェクトの依存関係とバージョン情報を管理するために使用されます。

SDK Center にアクセスし、SDK を使用したいクラウドサービスを選択します。[V2.0] を SDK バージョンとして、[Go] をプログラミング言語として選択します。 インストールコマンドを TERMINAL ウィンドウにコピーし、Enter キーを押します。
API 操作を呼び出したときに「MissingRequiredParameter」エラーが報告された場合はどうすればよいですか?
この例では、ショートメッセージサービス(SMS)サービスの SendSms 操作が呼び出されます。
OpenAPI ポータル にアクセスします。呼び出したい API 操作を検索します。
構築されたリクエストオブジェクトに、PhoneNumbers や SignName などの必須パラメータが指定されているかどうかを確認します。この例では、リクエストオブジェクトは
SendSmsRequestです。API リファレンスに基づいて、すべての必須パラメータが指定されていることを確認します。
必須パラメータの値が有効であることを確認します。たとえば、携帯電話番号が有効な形式で指定されているかどうかを確認します。
SDK は、API リクエストを送信する前に、パラメータを自動的に検証します。1 つ以上の必須パラメータが指定されていない場合、
MissingRequiredParameterなどのエラーが報告されます。たとえば、phone_numbers パラメータが指定されていない場合、「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」メッセージが返された場合はどうすればよいですか?
選択したリージョンで、アクセスしたいサービスがサポートされていることを確認します。OpenAPI ポータル のプロダクトホームページで、サービスのエンドポイントを見つけます。次の図は、SMS サービスのエンドポイントを見つける方法を示しています。

質問8: コマンドを実行したときに「go: go.mod file not found in current directory or any parent directory.」メッセージが返された場合はどうすればよいですか?go get
このメッセージは、go get コマンドを実行したときに、現在のディレクトリまたはその親ディレクトリに go.mod ファイルが見つからないために返されます。go.mod ファイルは、プロジェクトの依存関係とバージョンを管理するために使用されます。次のコマンドを実行して、go.mod ファイルを初期化できます。
# 現在のディレクトリに新しい go.mod ファイルを初期化し、モジュール名を定義します。ほとんどの場合、モジュール名はリポジトリへの URL パスです。この例では、ドメイン名は example.com で、プロジェクト名は goproject です。
go mod init example.com/goproject基本的な Go 例外のチェックリスト
エラーメッセージ | 原因 | 解決策 |
ヌルポインタの逆参照 | ヌルポインタが逆参照されるか、ヌルポインタでメソッドが呼び出されます。 | ポインタを使用する前に、ポインタが nil でないことを確認します。条件付きステートメントまたはエラー処理メカニズムを使用して、ポインタが nil かどうかを確認できます。 |
無効なメモリアドレスまたはヌルポインタの逆参照 | 無効なメモリアドレスがアクセスされるか、ヌルポインタが逆参照されます。 | メモリアドレスにアクセスする前に、メモリアドレスが有効であり、メモリアドレスにメモリが割り当てられていることを確認します。条件付きステートメントまたはエラー処理メカニズムを使用して、メモリアドレスが有効かどうかを確認できます。 |
タイムアウトとキャンセル | ネットワークリクエストまたは操作がタイムアウトしたか、キャンセルされました。 | ネットワークリクエストを送信するか、時間のかかる操作を実行する前に、適切なタイムアウト期間を構成し、ビジネス要件に基づいてネットワークリクエストまたは操作をキャンセルします。context パッケージを使用して、タイムアウト期間とキャンセル操作を管理できます。 |
テクニカルサポート
上記のよくある質問と解決策は、Alibaba Cloud SDK をより効果的に使用するために役立ちます。その他の問題が発生した場合は、次の方法で Alibaba Cloud テクニカルサポートに連絡できます。
ご質問やフィードバックがある場合は、DingTalk グループ(ID: 60965016010)で Alibaba Cloud テクニカルサポートにお問い合わせください。