外部ネットワークから API を使用する

このチュートリアルでは、オンプレミス プライベート ネットワークや他のクラウド プロバイダのネットワークなどの外部ネットワークから Google Cloud Platform(GCP)サービス用の API を使用する方法を説明します。この方法により、プライベート ネットワークに接続されているオンプレミス サーバーは、パブリック IP アドレスを使用せずに GCP サービスにアクセスできるようになります。このチュートリアルでは、Amazon 仮想プライベート クラウド(Amazon VPC)でプライベート ネットワークを使用し、オンプレミスのプライベート ネットワークをエミュレートする例を示します。

アーキテクチャ

次の図は、このチュートリアルで作成する全体的なアーキテクチャをまとめたものです。

  • IPsec VPN を介して、Amazon VPC のプライベート ネットワークを GCP プロジェクトの仮想ネットワークに接続します。Amazon VPC ではなく、オンプレミスのプライベート ネットワークを使用する場合、Cloud Interconnect を使用して GCP プロジェクトへのプライベート ネットワーク接続を確立します。

  • GCP プロジェクトから限定公開の Google アクセスを使用します。GCP プロジェクトの外部で実行しているサーバーは、限定公開の Google アクセスが有効な場合でも、内部 IP アドレスを使用して Cloud Translation などの GCP API に到達できません。このため、GCP プロジェクトで HTTP または HTTPS プロキシを使用して、外部サーバーから Google Cloud Platform API やサービスに、内部 IP アドレスを使用して API リクエストを転送します。

全体的なアーキテクチャ

目標

  • パブリック IP アドレスを使用しなくても Compute Engine VM インスタンスが Google Cloud Platform API にアクセスできるよう、限定公開の Google アクセスを有効にします。

  • Compute Engine インスタンスを使用して HTTP または HTTPS プロキシを設定し、Amazon VPC 内のサーバーがパブリック IP アドレスを使用しなくても Google Cloud Platform API にアクセスできるようにします。

料金

このチュートリアルでは、以下の課金対象の Google Cloud Platform コンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを出すことができます。 GCP を初めてご利用の場合は、無料トライアルをご利用いただけます。

また、Amazon VPC、VPN、Amazon Elastic Compute Cloud(Amazon EC2)インスタンスなどの Amazon Web Services(AWS)の費用がかかる場合があります。

始める前に

このチュートリアルを開始する前に、GCP Console を使用して GCP プロジェクトを作成し、請求を有効にしてください。既存のプロジェクトを使用しないでください。作業が完了したら、追加コストが発生しないようプロジェクトを削除する必要があります。

  1. チュートリアル用の GCP プロジェクトを作成します。

    [リソースの管理] ページに移動

  2. Google Cloud Platform プロジェクトに対して課金が有効になっていることを確認します。 プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  3. Translation を有効にします。

    Translation を有効にする

    新しいプロジェクトでは、Compute Engine API が自動的に有効になります。

  4. GCP Console で、[認証情報] ページを開きます。

    認証情報に進む

  5. [認証情報を作成] で [API キー] を選択し、[閉じる] をクリックします。

  6. コンソールに表示されている API キーの文字列を書き留めます。

Amazon VPC を GCP 仮想ネットワークに接続する

このチュートリアルでは、Amazon VPC を使用して、オンプレミスのデータセンターをエミュレートします。Amazon VPC を確立するには、「ポリシーベースの IPsec VPN: 構成 - AWS」セクションと「ポリシーベースの IPsec VPN: 構成 - GCP UI」セクションの Cloud VPN を Amazon Web Services で使用するの説明に従ってください。

  • ネットワーク アドレス 172.31.0.0/16 CIDR のデフォルト VPC を使用します。
  • ネットワーク アドレス 172.31.0.0/16 CIDR のデフォルト サブネットを使用します。
  • Compute Engine VPN のゲートウェイとして静的 IP アドレス aws-vpn を使用し、AWS との VPN 接続を作成します。

IPsec VPN を使用して、GCP で作成する GCP 仮想ネットワークに Amazon VPC を接続します。

gcloud

  1. Cloud Shell を開きます。

    Cloud Shell をアクティブにする

  2. GCP 仮想ネットワークを作成します。

    gcloud compute networks create "aws-vpn" --subnet-mode "auto"
    gcloud compute addresses create "aws-vpn" --region "asia-east1"
    
  3. Cloud VPN を Amazon Web Services で使用する手順に従います。

  4. GCP Console で VPN 構成を表示するには、[VPN] ページを開きます。

    VPN を開く

    GCP Console での VPN の構成は、次の画像のようになります。緑色のチェックマークは、aws-vpn のリモートピア IP アドレスが正しく設定されていることを示しています。

    GCP Console での VPN 構成

Console

  1. GCP Console で、[VPC ネットワーク] ページに移動します。

    VPC ネットワークを開く

  2. [VPC ネットワークを作成] をクリックします。

  3. 次のオプションを設定します。他のオプションはデフォルトのままにしておきます。

    • 名前: aws-vpn
    • サブネット: Automatic
  4. [作成] をクリックします。

  5. [外部 IP アドレス] ページに移動します。

    [外部 IP アドレス] ページを開く

  6. [静的アドレスを予約] をクリックします。

  7. 次のオプションを設定します。他のオプションはデフォルトのままにしておきます。

    • 名前: aws-vpn
    • リージョン: asia-east1
  8. [予約] をクリックします。

  9. Cloud VPN を Amazon Web Services で使用する手順に従います。

  10. GCP Console で VPN 構成を表示するには、[VPN] ページを開きます。

    VPN を開く

    GCP Console での VPN の構成は、次の画像のようになります。緑色のチェックマークは、aws-vpn のリモートピア IP アドレスが正しく設定されていることを示しています。

    GCP Console での VPN 構成

Amazon VPC ルーティング テーブルの構成

Amazon EC2 インスタンスを有効にして、プロジェクト内の GCP 仮想ネットワークにアクセスできるようにするには、次の手順に従います。

  1. AWS Management Console で、[Route Table] タブをクリックします。

  2. [Route Propagation] を選択し、[Edit] をクリックします。

  3. VPC ネットワークのプライベート IP 範囲で [Propagate] を選択し、[Save] をクリックします。

限定公開の Google アクセスを有効にする

Amazon VPC に接続されているサブネットで、限定公開の Google アクセスを有効にします。

gcloud

  1. Cloud Shell で次のコマンドを実行します。

    gcloud compute networks subnets update aws-vpn \
        --enable-private-ip-google-access --region asia-east1

Console

  1. GCP Console で、[VPC ネットワーク] ページに移動します。

    VPC ネットワークを開く

  2. asia-east1 リージョンで aws vpn サブネットを選択します。

  3. [編集] をクリックします。

  4. [限定公開の Google アクセス] ボックスで [オン] を選択し、[保存] をクリックします。

ファイアウォール ルールの構成

次に、Amazon VPC からのプロキシ接続と、すべての外部ネットワークからの SSH 接続を許可するファイアウォール ルールを追加します。SSH 接続は、HTTP または HTTPS プロキシ インスタンスを構成するためにのみ使用されます。起動スクリプトを使用して、インスタンスに手動でログインせずにプロキシを構成できます。この場合、SSH 接続用のファイアウォール ルールを作成する必要はありません。

gcloud

  1. Cloud Shell で、プロキシのファイアウォール ルールを追加します。

    gcloud compute firewall-rules create "aws-vpn-allow-proxy" \
      --description "Allow Google private access from AWS VPC" \
      --network "aws-vpn" --allow tcp:8118 \
      --source-ranges "172.31.0.0/16" --target-tags "api-proxy"
    

    ファイアウォール ルールが作成されると、次の出力が表示されます。

    Creating firewall...done.
    NAME                 NETWORK  SRC_RANGES     RULES     SRC_TAGS  TARGET_TAGS
    aws-vpn-allow-proxy  aws-vpn  172.31.0.0/16  tcp:8118            api-proxy
    
  2. 起動スクリプトを使用していない場合は、SSH 接続用のファイアウォール ルールを追加します。

    gcloud compute firewall-rules create "aws-vpn-allow-ssh" \
      --description "Allow SSH from anywhere" \
      --network "aws-vpn" --allow tcp:22  --source-ranges "0.0.0.0/0"
    

    ファイアウォール ルールが作成されると、次の出力が表示されます。

    Creating firewall...done.
    NAME               NETWORK  SRC_RANGES  RULES   SRC_TAGS  TARGET_TAGS
    aws-vpn-allow-ssh  aws-vpn  0.0.0.0/0   tcp:22
    

Console

  1. GCP Console で、[ファイアウォール ルール] ページに移動します。

    ファイアウォール ルールを開く

  2. [ファイアウォール ルールの作成] をクリックします。

  3. 次のオプションを設定します。他のオプションはデフォルトのままにしておきます。

    • 名前: aws-vpn-allow-proxy
    • 説明: Allow Google Private Access from Amazon VPC
    • ネットワーク: aws-vpn
    • ターゲットタグ: api-proxy
    • ソース IP の範囲: 172.31.0.0/16
    • プロトコルとポート: tcp:8118
  4. [作成] をクリックします。

  5. [ファイアウォール ルールの作成] をクリックします。

  6. 次のオプションを設定します。他のオプションはデフォルトのままにしておきます。

    • 名前: aws-vpn-allow-ssh
    • 説明: Allow SSH from anywhere
    • ネットワーク: aws-vpn
    • ターゲットタグ: api-proxy
    • ソース IP の範囲: 0.0.0.0/0
    • プロトコルとポート: tcp:22
  7. [作成] をクリックします。

HTTP または HTTPS プロキシ インスタンスの作成

次に、Compute Engine インスタンスを作成し、HTTP または HTTPS プロキシとしてそれを構成し、ログインする必要があります。

gcloud

  1. Compute Engine インスタンスを起動します。

    gcloud compute instances create "api-proxy" \
      --zone "asia-east1-a" --machine-type "n1-standard-1" \
      --subnet "aws-vpn" --private-network-ip "10.140.0.2" \
      --tags "api-proxy"
    

    プロキシ アドレスとして使用するインスタンスのプライベート IP アドレスを指定します。

  2. インスタンスにログインします。

    gcloud compute ssh "api-proxy" --zone "asia-east1-a"
  3. SSH セッションで、privoxy サービスをインストールします。

    sudo apt-get -y install privoxy
  4. privoxy サービスを構成します。

    sudo sed -i "s/listen-address  127.0.0.1:8118/listen-address  10.140.0.2:8118/" /etc/privoxy/config
    sudo systemctl restart privoxy
    
  5. ポート 8118 を通じた IP アドレス 10.140.0.2 への接続が許可されるようにサービスが構成されていることを確認します。

    sudo netstat -nlt

    出力は次のようになります。

    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State
    tcp        0      0 10.140.0.2:8118         0.0.0.0:*               LISTEN
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
    tcp6       0      0 :::22                   :::*                    LISTEN
    

Console

  1. GCP Console の [VM インスタンス] ページに移動します。

    VM インスタンスを開く

  2. [作成] をクリックします。

  3. [インスタンスの作成] ページで次のオプションを設定し、他のオプションはデフォルトのままにしておきます。

    • 名前: api-proxy
    • ゾーン: asia-east1-a
  4. [管理、セキュリティ、ディスク、ネットワーク、単一テナンシー] を開き、[ネットワーキング] を選択します。

  5. 次のオプションを設定します。他のオプションはデフォルトのままにしておきます。

    • ネットワーク タグ: api-proxy
    • [ネットワーク インターフェース] > [ネットワーク]: aws-vpn
    • [ネットワーク インターフェース] > [サブネットワーク]: aws-vpn(10.140.0.0/20)
    • [ネットワーク インターフェース] > [プライマリ内部 IP]: Custom
    • [ネットワーク インターフェース] > [カスタムのエフェメラル IP アドレス]: 10.140.0.2
  6. [完了] をクリックします。

  7. [作成] をクリックします。

  8. api-proxy インスタンスを選択し、[SSH] をクリックして SSH ターミナルを開きます。

  9. SSH セッションで、privoxy サービスをインストールします。

    sudo apt-get -y install privoxy
  10. privoxy サービスを構成します。

    sudo sed -i "s/listen-address  127.0.0.1:8118/listen-address  10.140.0.2:8118/" /etc/privoxy/config
    sudo systemctl restart privoxy
    
  11. ポート 8118 を通じた IP アドレス 10.140.0.2 への接続が許可されるようにサービスが構成されていることを確認します。

    sudo netstat -nlt

    出力は次のようになります。

    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State
    tcp        0      0 10.140.0.2:8118         0.0.0.0:*               LISTEN
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
    tcp6       0      0 :::22                   :::*                    LISTEN
    
  12. インスタンスを終了します。

    exit
    

この時点で、インスタンスへの SSH 接続は必要なくなります。セキュリティ標準により、SSH 接続を許可するファイアウォール ルールを削除する必要がある場合は、次のオペレーションを行います。

gcloud

  1. ファイアウォール ルールを削除します。

    gcloud compute firewall-rules delete "aws-vpn-allow-ssh"

Console

  1. GCP Console で、[ファイアウォール ルール] ページに移動します。

    ファイアウォール ルールを開く

  2. aws-vpn-allow-ssh を選択します。

  3. [削除] をクリックします。

プロキシ インスタンスからの外部 IP アドレスの削除

プロキシ インスタンスが誤ってパブリック IP アドレスを使用して GCP API にアクセスしないようにする必要があります。このセクションでは、プロキシ インスタンスから外部 IP アドレスを削除する方法を示します。

gcloud

  1. 構成名を決定します。

    gcloud compute instances describe api-proxy | grep -A5 accessConfigs

    次の出力例では、外部 IP アドレスの構成名が external-nat です。

    - accessConfigs:
    - kind: compute#accessConfig
        name: external-nat
        natIP: 104.199.157.31
        type: ONE_TO_ONE_NAT
    kind: compute#networkInterface
    
  2. 前の手順で設定した構成名を指定して、外部 IP アドレスを削除します。

    gcloud compute instances delete-access-config api-proxy --access-config-name "external-nat"

Console

  1. GCP Console の [VM インスタンス] ページに移動します。

    VM インスタンスを開く

  2. api-proxy をクリックします。

  3. [編集] をクリックします。

  4. [nic0: aws-vpn] をクリックします。

  5. 次のオプションを設定します。他のオプションはデフォルトのままにしておきます。

    • 外部 IP: None
  6. [完了] をクリックします。

  7. [保存] をクリックします。

Amazon VPC から Google API を使用する

このセクションでは、Cloud Translation を使用して、Amazon VPC で実行されている Amazon EC2 インスタンスから Google Cloud Platform API を使用できることを確認します。

  1. 作成した Amazon VPC で Amazon EC2 インスタンスを起動します。

  2. SSH ターミナルを使用して Amazon EC2 インスタンスに接続します。

  3. API リクエスト メッセージ ファイルを作成します。

    echo '{"q": ["this is a test translation via proxy"], "target": "it"}' >/tmp/translation.json
  4. プロキシ アドレスを指定するリクエストを送信します。[YOUR_API_KEY] は、前の手順で作成した API キーの文字列に置き換えてください。

    API_KEY=[YOUR_API_KEY]
    curl -H 'Content-Type: application/json' --dump-header - \
      --proxy http://10.140.0.2:8118 -d @/tmp/translation.json \
      -X POST https://translation.googleapis.com/language/translate/v2?key=${API_KEY}
    

    Translation サービスは次のように応答します。

    HTTP/1.1 200 Connection established
    Proxy-Agent: Privoxy/3.0.21
    
    HTTP/1.1 200 OK
    Content-Type: application/json; charset=UTF-8
    Vary: X-Origin
    Vary: Referer
    Date: Thu, 06 Jul 2017 23:44:57 GMT
    Server: ESF
    Cache-Control: private
    X-XSS-Protection: 1; mode=block
    X-Frame-Options: SAMEORIGIN
    X-Content-Type-Options: nosniff
    Accept-Ranges: none
    Vary: Origin,Accept-Encoding
    Transfer-Encoding: chunked
    
    {
      "data": {
        "translations": [
          {
            "translatedText": "Questa è una traduzione del test tramite il proxy",
            "detectedSourceLanguage": "en"
          }
        ]
      }
    }
    

クリーンアップ

このチュートリアルを完了したら、プロジェクトを削除して、追加コストが発生するのを回避してください。

  1. GCP Console で [リソースの管理] ページに移動します。

    [リソースの管理] ページに移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

次のステップ