Skip to main content

企業内の GitHub ホストランナーのプライベート ネットワークの構成

GitHub ホステッド ランナーを使用するように Azure プライベート ネットワーク を構成する方法について説明します。

この機能を使用できるユーザーについて

Enterprise owners can configure private networking for GitHub-hosted runners at the enterprise level.

GitHub

ホストランナーの Azure プライベート ネットワークについて

Azure VNET で GitHub ホステッド ランナーを使用するには、まず、Azure リソースを構成します。 次に、GitHub にプライベート ネットワーク構成を作成します。

次の手順では、両方のステップを実行できます。

Azure VNET での GitHub ホステッド ランナーの使用に関する一般的な問題のトラブルシューティングの詳細については、「エンタープライズ内の GitHub ホストランナーの Azure プライベート ネットワーク構成のトラブルシューティング」を参照してください。

自分の Azure リソースの構成する

スクリプトを使用して、Azure リソースの構成を自動化します。

前提条件

  • サブスクリプション投稿者ロールとネットワーク投稿者ロールを持つ Azure アカウントを使用します。 これらのロールを使用すると、GitHub.Network リソースプロバイダーを登録し、サブネットを委任できます。 詳細については、Microsoft Learn の「Azure 組み込みロール」を参照してください。

  • サブネットを適切なユーザーに正しく関連付けるには、仮想ネットワークが作成されるのと同じサブスクリプションに Azure NetworkSettings リソースを作成する必要があります。

  • リソースの可用性/データ所在地を確保するには、同じ Azure リージョンにリソースを作成する必要があります。

  • .bicep ファイルを保存します。 そのファイルに actions-nsg-deployment.bicep という名前を付けます。

    提供する .bicep ファイルには、Azure VNET で GitHub がホストするランナーを使用するための最小限のルールセットが含まれています。 特定のユース ケースにルールを追加する必要がある場合があります。

    データ所在地付き GitHub Enterprise Cloud を使う場合は、AllowOutBoundGitHub セクションに、GHE.com のエグレス IP 範囲も含める必要があります。 「GHE.com のネットワークの詳細」を参照してください。

    注: 以下のファイルを使う代わりに、GitHub Actions がランナーと通信できるようにするために、セルフホステッド ランナーと GitHub Enterprise Cloud の間の通信に必要な同じファイアウォール ドメインを許可することもできます。 詳しくは、「自己ホスト ランナーの概要」を参照してください。 適切なサブネット IP アドレスの範囲を決定するには、予想される最大ジョブコンカレンシーに 30% のバッファーを追加することをお勧めします。 たとえば、ネットワーク構成のランナーが最大ジョブコンカレンシー 300 に設定されている場合は、少なくとも 390 のランナーを収容できるサブネット IP アドレスの範囲を使用することをお勧めします。 このバッファーがあると、ジョブのコンカレンシーを満たすために VM のニーズが予期せず増加してもネットワークが対応できます。

    Bicep
    @description('NSG for outbound rules')
    param location string
    param nsgName string = 'actions_NSG'
    
    resource actions_NSG 'Microsoft.Network/networkSecurityGroups@2017-06-01' = {
      name: nsgName
      location: location
      properties: {
        securityRules: [
          {
            name: 'AllowVnetOutBoundOverwrite'
            properties: {
              protocol: 'TCP'
              sourcePortRange: '*'
              destinationPortRange: '443'
              sourceAddressPrefix: '*'
              destinationAddressPrefix: 'VirtualNetwork'
              access: 'Allow'
              priority: 200
              direction: 'Outbound'
              destinationAddressPrefixes: []
            }
          }
          {
            name: 'AllowOutBoundActions'
            properties: {
              protocol: '*'
              sourcePortRange: '*'
              destinationPortRange: '*'
              sourceAddressPrefix: '*'
              access: 'Allow'
              priority: 210
              direction: 'Outbound'
              destinationAddressPrefixes: [
                '4.175.114.51/32'
                '20.102.35.120/32'
                '4.175.114.43/32'
                '20.72.125.48/32'
                '20.19.5.100/32'
                '20.7.92.46/32'
                '20.232.252.48/32'
                '52.186.44.51/32'
                '20.22.98.201/32'
                '20.246.184.240/32'
                '20.96.133.71/32'
                '20.253.2.203/32'
                '20.102.39.220/32'
                '20.81.127.181/32'
                '52.148.30.208/32'
                '20.14.42.190/32'
                '20.85.159.192/32'
                '52.224.205.173/32'
                '20.118.176.156/32'
                '20.236.207.188/32'
                '20.242.161.191/32'
                '20.166.216.139/32'
                '20.253.126.26/32'
                '52.152.245.137/32'
                '40.118.236.116/32'
                '20.185.75.138/32'
                '20.96.226.211/32'
                '52.167.78.33/32'
                '20.105.13.142/32'
                '20.253.95.3/32'
                '20.221.96.90/32'
                '51.138.235.85/32'
                '52.186.47.208/32'
                '20.7.220.66/32'
                '20.75.4.210/32'
                '20.120.75.171/32'
                '20.98.183.48/32'
                '20.84.200.15/32'
                '20.14.235.135/32'
                '20.10.226.54/32'
                '20.22.166.15/32'
                '20.65.21.88/32'
                '20.102.36.236/32'
                '20.124.56.57/32'
                '20.94.100.174/32'
                '20.102.166.33/32'
                '20.31.193.160/32'
                '20.232.77.7/32'
                '20.102.38.122/32'
                '20.102.39.57/32'
                '20.85.108.33/32'
                '40.88.240.168/32'
                '20.69.187.19/32'
                '20.246.192.124/32'
                '20.4.161.108/32'
                '20.22.22.84/32'
                '20.1.250.47/32'
                '20.237.33.78/32'
                '20.242.179.206/32'
                '40.88.239.133/32'
                '20.121.247.125/32'
                '20.106.107.180/32'
                '20.22.118.40/32'
                '20.15.240.48/32'
                '20.84.218.150/32'
              ]
            }
          }
          {
            name: 'AllowOutBoundGitHub'
            properties: {
              protocol: '*'
              sourcePortRange: '*'
              destinationPortRange: '*'
              sourceAddressPrefix: '*'
              access: 'Allow'
              priority: 220
              direction: 'Outbound'
              destinationAddressPrefixes: [
                '140.82.112.0/20'
                '143.55.64.0/20'
                '185.199.108.0/22'
                '192.30.252.0/22'
                '20.175.192.146/32'
                '20.175.192.147/32'
                '20.175.192.149/32'
                '20.175.192.150/32'
                '20.199.39.227/32'
                '20.199.39.228/32'
                '20.199.39.231/32'
                '20.199.39.232/32'
                '20.200.245.241/32'
                '20.200.245.245/32'
                '20.200.245.246/32'
                '20.200.245.247/32'
                '20.200.245.248/32'
                '20.201.28.144/32'
                '20.201.28.148/32'
                '20.201.28.149/32'
                '20.201.28.151/32'
                '20.201.28.152/32'
                '20.205.243.160/32'
                '20.205.243.164/32'
                '20.205.243.165/32'
                '20.205.243.166/32'
                '20.205.243.168/32'
                '20.207.73.82/32'
                '20.207.73.83/32'
                '20.207.73.85/32'
                '20.207.73.86/32'
                '20.207.73.88/32'
                '20.233.83.145/32'
                '20.233.83.146/32'
                '20.233.83.147/32'
                '20.233.83.149/32'
                '20.233.83.150/32'
                '20.248.137.48/32'
                '20.248.137.49/32'
                '20.248.137.50/32'
                '20.248.137.52/32'
                '20.248.137.55/32'
                '20.26.156.215/32'
                '20.26.156.216/32'
                '20.27.177.113/32'
                '20.27.177.114/32'
                '20.27.177.116/32'
                '20.27.177.117/32'
                '20.27.177.118/32'
                '20.29.134.17/32'
                '20.29.134.18/32'
                '20.29.134.19/32'
                '20.29.134.23/32'
                '20.29.134.24/32'
                '20.87.245.0/32'
                '20.87.245.1/32'
                '20.87.245.4/32'
                '20.87.245.6/32'
                '20.87.245.7/32'
                '4.208.26.196/32'
                '4.208.26.197/32'
                '4.208.26.198/32'
                '4.208.26.199/32'
                '4.208.26.200/32'
              ]
            }
          }
          {
            name: 'AllowStorageOutbound'
            properties: {
              protocol: '*'
              sourcePortRange: '*'
              destinationPortRange: '*'
              sourceAddressPrefix: '*'
              destinationAddressPrefix: 'Storage'
              access: 'Allow'
              priority: 230
              direction: 'Outbound'
              destinationAddressPrefixes: []
            }
          }
        ]
      }
    }
    

1. 企業の databaseId を取得する

次の GraphQL クエリを使用して、Enterprise databaseId を取得できます。 次の手順では、DATABASE_ID 環境変数の値として enterprise databaseId を使用します。 GraphQL の操作の詳細については、「GraphQLでの呼び出しの作成」をご覧ください。

クエリ変数説明
slugEnterprise アカウントのスラッグ。エンタープライズの URL (https://github.com/enterprises/SLUG または https://SLUG.ghe.com) を調べることで識別できます。
query(
  $slug: String!
){
  enterprise (slug: $slug)
  {
    slug
    databaseId
  }
}
'
Variables
{
  "slug": "ENTERPRISE_SLUG"
}

GitHub.com

の例

次の cURL のコマンドを使用して databaseId を見つけられます。

Shell
curl -H "Authorization: Bearer BEARER_TOKEN" -X POST \
  -d '{ "query": "query($slug: String!) { enterprise (slug: $slug) { slug databaseId } }" ,
        "variables": {
          "slug": "ENTERPRISE_SLUG"
        }
      }' \
https://api.github.com/graphql

GHE.com

の例

次の GitHub CLI コマンドを使って databaseId を取得できます。 SUBDOMAIN は、エンタープライズの GHE.com のサブドメインに置き換えてください。

Shell
gh auth login -s 'read:enterprise' -h SUBDOMAIN.ghe.com

gh api graphql --hostname SUBDOMAIN.ghe.com -f query='query($slug: String!) { enterprise (slug: $slug) { slug databaseId } }' -f slug='SUBDOMAIN'

2. スクリプトを使用して Azure リソースを構成する

次のスクリプトを使用して、Azure プライベート ネットワーク のサブネットを設定します。 このスクリプトでは、同じリソース グループ内にすべてのリソースが作成されます。

スクリプトを使用するには、プレースホルダー環境変数の値に実際の値を入力し、bash シェルまたはLinux 用 Windows サブシステムからスクリプトを実行します。

Note

  • actions-nsg-deployment.bicep ファイルを保存した同じディレクトリの次のスクリプトのを実行します。
  • YOUR_AZURE_LOCATION 環境変数を設定するときは、リージョンの名前を使用します。 この値は、リージョンの表示名とは異なります。 名前と表示名のリストを表示するには、az account list-locations -o table を使用します。
  • ネットワーク設定リソースを作成すると、指定したサブネットにサービス関連付けリンクが適用されます。 このリンクにより、GitHub Actions サービスで使用中にサブネットが誤って削除されるのを防ぐことができます。
  • このスクリプトをカスタマイズして、既存のサブネットのネットワークリソースを使用する場合、サブネットが GitHub Actions サービスに委任される前に、サブネットに接続されている既存のネットワーク インターフェイス (NIC) が削除されていることを確認する必要があります。 それ以外の場合は、サービスはサービスの関連付けリンクをサブネットに適用できません。
Bash
#!/bin/bash

# This script creates the following resources in the specified subscription:
# - Resource group
# - Network Security Group rules
# - Virtual network (vnet) and subnet
# - Network Settings with specified subnet and GitHub Enterprisedatabase ID
#
# It also registers the `GitHub.Network` resource provider with the subscription,
# delegates the created subnet to the Actions service via the `GitHub.Network/NetworkSettings`
# resource type, and applies the NSG rules to the created subnet.

# stop on failure
set -e

#set environment
export AZURE_LOCATION=YOUR_AZURE_LOCATION
export SUBSCRIPTION_ID=YOUR_SUBSCRIPTION_ID
export RESOURCE_GROUP_NAME=YOUR_RESOURCE_GROUP_NAME
export VNET_NAME=YOUR_VNET_NAME
export SUBNET_NAME=YOUR_SUBNET_NAME
export NSG_NAME=YOUR_NSG_NAME
export NETWORK_SETTINGS_RESOURCE_NAME=YOUR_NETWORK_SETTINGS_RESOURCE_NAME
export DATABASE_ID=YOUR_DATABASE_ID

# These are the default values. You can adjust your address and subnet prefixes.
export ADDRESS_PREFIX=10.0.0.0/16
export SUBNET_PREFIX=10.0.0.0/24

echo
echo login to Azure
. az login --output none

echo
echo set account context $SUBSCRIPTION_ID
. az account set --subscription $SUBSCRIPTION_ID

echo
echo Register resource provider GitHub.Network
. az provider register --namespace GitHub.Network

echo
echo Create resource group $RESOURCE_GROUP_NAME at $AZURE_LOCATION
. az group create --name $RESOURCE_GROUP_NAME --location $AZURE_LOCATION

echo
echo Create NSG rules deployed with 'actions-nsg-deployment.bicep' file
. az deployment group create --resource-group $RESOURCE_GROUP_NAME --template-file ./actions-nsg-deployment.bicep --parameters location=$AZURE_LOCATION nsgName=$NSG_NAME

echo
echo Create vnet $VNET_NAME and subnet $SUBNET_NAME
. az network vnet create --resource-group $RESOURCE_GROUP_NAME --name $VNET_NAME --address-prefix $ADDRESS_PREFIX --subnet-name $SUBNET_NAME --subnet-prefixes $SUBNET_PREFIX

echo
echo Delegate subnet to GitHub.Network/networkSettings and apply NSG rules
. az network vnet subnet update --resource-group $RESOURCE_GROUP_NAME --name $SUBNET_NAME --vnet-name $VNET_NAME --delegations GitHub.Network/networkSettings --network-security-group $NSG_NAME

echo
echo Create network settings resource $NETWORK_SETTINGS_RESOURCE_NAME
. az resource create --resource-group $RESOURCE_GROUP_NAME  --name $NETWORK_SETTINGS_RESOURCE_NAME --resource-type GitHub.Network/networkSettings --properties "{ \"location\": \"$AZURE_LOCATION\", \"properties\" : {  \"subnetId\": \"/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.Network/virtualNetworks/$VNET_NAME/subnets/$SUBNET_NAME\", \"businessId\": \"$DATABASE_ID\" }}" --is-full-object --output table --query "{GitHubId:tags.GitHubId, name:name}" --api-version 2024-04-02

echo
echo To clean up and delete resources run the following command:
echo az group delete --resource-group $RESOURCE_GROUP_NAME

このスクリプトは、作成されたリソースの完全なペイロードを返します。 作成されたリソースのペイロードで返される GitHubId ハッシュ値は、GitHub でネットワーク構成を構成するときに、次の手順で使用するネットワーク設定リソース ID です。

GitHub

での企業のネットワーク構成の作成

Azure リソースを構成した後、Enterprise レベルまたは Organization レベルでネットワーク構成を作成することで、プライベート ネットワークに Azure Virtual Network (VNET) を使用できます。 その後、そのネットワーク構成をランナー グループに関連付けることができます。 ランナー グループについて詳しくは、「より大きなランナーへのアクセスの制御」をご覧ください。

ネットワーク構成がランナー グループに関連付けられると、そのグループ内のすべてのランナーが、基になる構成に接続されている Azure VNET にアクセスできるようになります。

前提条件

GitHub にネットワーク構成を追加する_前に_、Azure リソースが構成されていることを確認します。 詳細については、「企業内の GitHub ホストランナーのプライベート ネットワークの構成」を参照してください。

1. Enterprise 用の新しいネットワーク構成を追加する

  1. GitHub の右上隅にあるプロフィール写真をクリックします。
  2. ご自分の環境に応じて、[Your enterprise] または [Your enterprises] をクリックし、表示するエンタープライズをクリックします。
  3. ページの左側にある Enterprise アカウントのサイドバーで、 [設定] をクリックします。
  4. 左側のサイドバーで、 [Hosted compute networking](ホストされたコンピューティング ネットワーク) をクリックします。
  5. [New network configuration](新しいネットワーク構成) ドロップダウンをクリックします。 次に、[Azure private network](Azure プライベート ネットワーク) をクリックします。
  6. ネットワーク構成に名前をつけます。
  7. [Add Azure Virtual Network](Azure Virtual Networkの追加) をクリックします。
  8. ポップアップ ウィンドウで、プライベート ネットワーク用に Azure リソースを構成したときに取得したネットワーク設定リソース ID を入力します。
  9. [Add Azure Virtual Network](Azure Virtual Networkの追加) をクリックします。

2. Enterprise 用のランナー グループを作成する

Note

organization 内のリポジトリからランナー グループにアクセスできるようにするには、それらのリポジトリが organization レベルでそのランナー グループにアクセスできる必要があります。 詳しくは、「より大きなランナーへのアクセスの制御」を参照してください。

  1. Enterprise 用の新しいランナー グループを作成します。 ランナー グループを作成する方法について詳しくは、「より大きなランナーへのアクセスの制御」をご覧ください。
  2. Organization アクセスのポリシーを選ぶには、 [Organization のアクセス] ドロップダウン メニューを選び、[ポリシー] をクリックします。 組織の特定のリストまたはエンタープライズ内のすべての組織にアクセス可能なランナー グループを設定できます。
  3. ランナー グループを構成するときに、Network configurations のドロップダウン メニューを使用して、Azure VNET 用に作成したネットワーク構成を選択します。
  4. グループを作成し、ポリシーを適用するには、[Create group](グループの作成) をクリックします。

3. GitHub

でホストされているランナーを Enterprise ランナー グループに追加する

Note

GitHub でホストされているランナーをランナー グループに追加するときは、前の手順で作成したランナー グループを選択します。

  1. GitHub でホストされているランナーをランナー グループに追加します。 詳しくは、「より大きなランナーを管理する」を参照してください。

4. 必要に応じて、ネットワーク構成を管理する

  1. GitHub の右上隅にあるプロフィール写真をクリックします。
  2. ご自分の環境に応じて、[Your enterprise] または [Your enterprises] をクリックし、表示するエンタープライズをクリックします。
  3. ページの左側にある Enterprise アカウントのサイドバーで、 [設定] をクリックします。
  4. 左側のサイドバーで、 [Hosted compute networking](ホストされたコンピューティング ネットワーク) をクリックします。
  5. ネットワーク構成を編集するには、ネットワーク構成の右側にある をクリックします。 その後、[Edit configuration](構成の編集) をクリックします。
  6. ネットワーク構成を無効にするには、ネットワーク構成の右側にある をクリックします。 次に、[Disable](無効) をクリックします。
  7. ネットワーク構成を削除するには、ネットワーク構成の右側にある をクリックします。 その後、[削除] をクリックします。

Organization のネットワーク構成の作成を有効にする

Enterprise 内の Organization 所有者が独自の Organization レベルのネットワーク構成を作成できるようにすることができます。

  1. GitHub の右上隅にあるプロフィール写真をクリックします。
  2. ご自分の環境に応じて、[Your enterprise] または [Your enterprises] をクリックし、表示するエンタープライズをクリックします。
  3. ページの左側にある Enterprise アカウントのサイドバーで、 [ポリシー] をクリックします。
  4. [ホストされたコンピューティング ネットワーク] をクリックします。
  5. [ホストされたコンピューティング ネットワーク] で、[有効] をクリックします。
  6. [保存] をクリックします。

サブネットの削除

ネットワーク設定リソースを作成すると、指定したサブネットにサービス関連付けリンクが適用されます。 このリンクにより、GitHub Actions サービスで使用中にサブネットが誤って削除されるのを防ぐことができます。

サブネットを削除するには、まずサービスのアソシエーション リンクを削除する必要があります。 ネットワーク設定リソースが削除されると、サービスのアソシエーション リンクは自動で安全に削除されます。

ネットワーク設定リソースを削除するには、それを使用するネットワーク構成を最初に削除する必要があります。

  1. GitHub の右上隅にあるプロフィール写真をクリックします。

  2. ご自分の環境に応じて、[Your enterprise] または [Your enterprises] をクリックし、表示するエンタープライズをクリックします。

  3. ページの左側にある Enterprise アカウントのサイドバーで、 [設定] をクリックします。

  4. 左側のサイドバーで、 [Hosted compute networking](ホストされたコンピューティング ネットワーク) をクリックします。

  5. 削除するサブネットを使用しているネットワーク構成を開きます。

  6. ネットワーク構成を使用してランナー グループの一覧を確認します。

  7. 右上隅にある "" ボタンをクリックします。 そして、[構成の削除] をクリックします。

  8. ネットワーク設定リソースを削除し、サービスのアソシエーション リンクを削除するには、Azure CLI で次のコマンドを使用して自分で入力します。 詳細については、ドキュメント『Azure コマンド ライン インターフェイス (CLI)』を参照してください。

    Bash
    az account set --subscription $SUBSCRIPTION_ID
    az resource delete -g $RESOURCE_GROUP_NAME --name $NETWORK_SETTINGS_RESOURCE_NAME --resource-type 'GitHub.Network/networkSettings' --api-version '2023-11-01-preview'
    
  9. Azure でサブネットを削除します。 詳細については、Microsoft Learn の「サブネットの削除」を参照してください。