Azure Batch 풀에서 컴퓨팅 노드에 대한 원격 액세스 구성

구성된 경우 네트워크 연결이 있는 노드 사용자가 Batch 풀의 컴퓨팅 노드에 외부에서 연결하도록 허용할 수 있습니다. 예를 들어 사용자는 포트 3389의 RDP(원격 데스크톱)를 통해 Windows 풀의 컴퓨팅 노드에 연결할 수 있습니다. 마찬가지로, 기본적으로 사용자는 포트 22의 SSH(Secure Shell)를 통해 Linux 풀의 컴퓨팅 노드에 연결할 수 있습니다.

참고

API 버전(및 API 버전 2024-07-01 에 관계없이 2025년 11월 30일 이후에 생성된 모든 풀)을 기준으로 Batch는 더 이상 SSH 및 RDP에 대한 일반 원격 액세스 포트를 자동으로 매핑하지 않습니다. API 버전 2024-07-01 이상(및 2025년 11월 30일 이후)으로 만든 풀이 있는 Batch 컴퓨팅 노드에 대한 원격 액세스를 허용하려면 이러한 액세스를 사용하도록 풀 엔드포인트 구성을 수동으로 구성해야 합니다.

사용자 환경에서는 외부 액세스 설정 또는 Batch 풀에서 원하는 다른 포트를 사용하거나 제한하거나 사용하지 않도록 설정해야 할 수 있습니다. Batch API를 사용하여 NetworkConfiguration 속성을 설정하여 이러한 설정을 수정할 수 있습니다.

Batch 풀 엔드포인트 구성

이 엔드포인트 구성은 하나 이상의 프런트 엔드 포트 NAT(Network Address Translation) 풀로 이루어집니다. NAT 풀을 컴퓨팅 노드의 Batch 풀과 혼동하지 마세요. 풀의 컴퓨팅 노드에서 기본 연결 설정을 재정의하도록 각 NAT 풀을 설정합니다.

각 NAT 풀 구성에는 하나 이상의 NSG(네트워크 보안 그룹) 규칙이 포함되어 있습니다. 각 NSG 규칙은 엔드포인트에 대한 특정 네트워크 트래픽을 허용하거나 거부합니다. 모든 트래픽, 서비스 태그(예: "인터넷")로 식별된 트래픽 또는 특정 IP 주소나 서브넷에서 들어오는 트래픽을 허용하거나 거부하도록 선택할 수 있습니다.

고려 사항

  • 풀 엔드포인트 구성은 풀 네트워크 구성의 일부입니다. 네트워크 구성은 풀은 Azure 가상 네트워크에 조인하는 설정을 선택적으로 포함할 수 있습니다. 가상 네트워크에서 풀을 설정할 경우 가상 네트워크의 주소 설정을 사용하는 NSG 규칙을 만들 수 있습니다.
  • NAT 풀을 구성할 경우 여러 NSG 규칙을 구성할 수 있습니다. 규칙은 우선 순위에 따라 검사됩니다. 규칙이 적용되면 일치하는 규칙은 더 이상 테스트되지 않습니다.

예: 특정 IP 주소에서 RDP 트래픽 허용

다음 C# 코드 조각은 IP 주소 198.168.100.7에서만 RDP 액세스를 허용하도록 Windows 풀의 컴퓨팅 노드에서 RDP 엔드포인트를 구성하는 방법을 보여 줍니다. 두 번째 NSG 규칙은 IP 주소와 일치하지 않는 트래픽을 거부합니다.

ArmClient armClient = new ArmClient(new DefaultAzureCredential());

        ResourceIdentifier batchAccountResourceId =
            BatchAccountResource.CreateResourceIdentifier("subscriptionId", "resourceGroupName", "accountName");
        BatchAccountResource batchAccount = armClient.GetBatchAccountResource(batchAccountResourceId);

        BatchAccountPoolCollection poolCollection = batchAccount.GetBatchAccountPools();

        BatchAccountPoolData poolData = new BatchAccountPoolData()
        {
            VmSize = "Standard_D2_v2",
            DeploymentConfiguration = new BatchDeploymentConfiguration()
            {
                VmConfiguration = new BatchVmConfiguration(
                    imageReference: new BatchImageReference()
                    {
                        Publisher = "canonical",
                        Offer = "0001-com-ubuntu-server-jammy",
                        Sku = "22_04-lts",
                        Version = "latest"
                    },
                    nodeAgentSkuId: "batch.node.ubuntu 22.04")
            },
            ScaleSettings = new BatchAccountPoolScaleSettings()
            {
                FixedScale = new BatchAccountFixedScaleSettings() { TargetDedicatedNodes = 2 }
            },
            NetworkConfiguration = new BatchNetworkConfiguration()
            {
                EndpointInboundNatPools =
                {
                    new BatchInboundNatPool(
                        name: "RDP",
                        protocol: BatchInboundEndpointProtocol.Tcp,
                        backendPort: 3389,
                        frontendPortRangeStart: 7500,
                        frontendPortRangeEnd: 8000)
                    {
                        NetworkSecurityGroupRules =
                        {
                            new BatchNetworkSecurityGroupRule(
                                priority: 179,
                                access: BatchNetworkSecurityGroupRuleAccess.Allow,
                                sourceAddressPrefix: "198.168.100.7"),
                            new BatchNetworkSecurityGroupRule(
                                priority: 180,
                                access: BatchNetworkSecurityGroupRuleAccess.Deny,
                                sourceAddressPrefix: "*")
                        }
                    }
                }
            }
        };

        ArmOperation<BatchAccountPoolResource> pool = await poolCollection.CreateOrUpdateAsync(
            WaitUntil.Completed, "myPool", poolData);

예: 특정 서브넷에서 SSH 트래픽 허용

다음 Python 코드 조각에서는 192.168.1.0/24라는 서브넷에서 오는 액세스만 허용하도록 Linux 풀의 컴퓨팅 노드에 있는 SSH 엔드포인트를 구성하는 방법을 보여줍니다. 두 번째 NSG 규칙은 서브넷과 일치하지 않는 트래픽을 거부합니다.

from azure.batch import models

class AzureBatch(object):
    def set_ports_pool(self, **kwargs):
        pool.network_configuration = models.NetworkConfiguration(
            endpoint_configuration=models.BatchPoolEndpointConfiguration(
                inbound_nat_pools=[models.BatchInboundNatPool(
                    name='SSH',
                    protocol=models.InboundEndpointProtocol.TCP,
                    backend_port=22,
                    frontend_port_range_start=4000,
                    frontend_port_range_end=4100,
                    network_security_group_rules=[
                        models.NetworkSecurityGroupRule(
                            priority=170,
                            access=models.NetworkSecurityGroupRuleAccess.ALLOW,
                            source_address_prefix='192.168.1.0/24'
                        ),
                        models.NetworkSecurityGroupRule(
                            priority=175,
                            access=models.NetworkSecurityGroupRuleAccess.DENY,
                            source_address_prefix='*'
                        )
                    ]
                )
                ]
            )
        )
    ),
    network_configuration=batchmodels.NetworkConfiguration(
        endpoint_configuration=batchmodels.PoolEndpointConfiguration(
            inbound_nat_pools=[batchmodels.InboundNatPool(
                name='SSH',
                protocol=batchmodels.InboundEndpointProtocol.TCP,
                backend_port=22,
                frontend_port_range_start=4000,
                frontend_port_range_end=4100,
                network_security_group_rules=[
                    batchmodels.NetworkSecurityGroupRule(
                        priority=170,
                        access=batchmodels.NetworkSecurityGroupRuleAccess.ALLOW,
                        source_address_prefix='192.168.1.0/24'
                    ),
                    batchmodels.NetworkSecurityGroupRule(
                        priority=175,
                        access=batchmodels.NetworkSecurityGroupRuleAccess.DENY,
                        source_address_prefix='*'
                    )
                ]
            )]
        )
    )
)

result = client.pool.create(
    resource_group_name=resource_group_name,
    account_name=account_name,
    pool_name=pool_name,
    parameters=pool_parameters
)

print(f"Pool '{result.name}' created successfully.")

예: 모든 RDP 트래픽 거부

다음 C# 코드 조각에서는 모든 네트워크 트래픽을 거부하도록 Windows 풀의 컴퓨팅 노드에 있는 RDP 엔드포인트를 구성하는 방법을 보여줍니다. 이 엔드포인트는 60000 - 60099 범위의 프런트 엔드 포트 풀을 사용합니다.

참고

Batch API 버전 2024-07-01에서는 일반적으로 RDP와 연결된 포트 3389가 더 이상 기본적으로 매핑되지 않습니다. 이 API 버전 이상으로 만든 Batch 풀에 대한 인터넷에서 액세스할 필요가 없는 경우 더 이상 명시적 거부 규칙을 만들 필요가 없습니다. 다른 원본의 액세스를 제한하기 위해 명시적 거부 규칙을 지정해야 할 수도 있습니다.

ArmClient armClient = new ArmClient(new DefaultAzureCredential());

        ResourceIdentifier batchAccountResourceId =
            BatchAccountResource.CreateResourceIdentifier("subscriptionId", "resourceGroupName", "accountName");
        BatchAccountResource batchAccount = armClient.GetBatchAccountResource(batchAccountResourceId);

        BatchAccountPoolCollection poolCollection = batchAccount.GetBatchAccountPools();

        BatchAccountPoolData poolData = new BatchAccountPoolData()
        {
            VmSize = "Standard_D2_v2",
            DeploymentConfiguration = new BatchDeploymentConfiguration()
            {
                VmConfiguration = new BatchVmConfiguration(
                    imageReference: new BatchImageReference()
                    {
                        Publisher = "canonical",
                        Offer = "0001-com-ubuntu-server-jammy",
                        Sku = "22_04-lts",
                        Version = "latest"
                    },
                    nodeAgentSkuId: "batch.node.ubuntu 22.04")
            },
            ScaleSettings = new BatchAccountPoolScaleSettings()
            {
                FixedScale = new BatchAccountFixedScaleSettings() { TargetDedicatedNodes = 2 }
            },
            NetworkConfiguration = new BatchNetworkConfiguration()
            {
                EndpointInboundNatPools =
                {
                    new BatchInboundNatPool(
                        name: "RDP",
                        protocol: BatchInboundEndpointProtocol.Tcp,
                        backendPort: 3389,
                        frontendPortRangeStart: 60000,
                        frontendPortRangeEnd: 60099)
                    {
                        NetworkSecurityGroupRules =
                        {
                            new BatchNetworkSecurityGroupRule(
                                priority: 162,
                                access: BatchNetworkSecurityGroupRuleAccess.Deny,
                                sourceAddressPrefix: "*")
                        }
                    }
                }
            }
        };

        ArmOperation<BatchAccountPoolResource> pool = await poolCollection.CreateOrUpdateAsync(
            WaitUntil.Completed, "myPool", poolData);

예: 인터넷에서 오는 모든 SSH 트래픽 거부

다음 Python 코드 조각에서는 모든 인터넷 트래픽을 거부하도록 Linux 풀의 컴퓨팅 노드에 있는 SSH 엔드포인트를 구성하는 방법을 보여줍니다. 이 엔드포인트는 4000 - 4100 범위의 프런트 엔드 포트 풀을 사용합니다.

참고

Batch API 버전 2024-07-01에서는 일반적으로 SSH와 연결된 포트 22가 더 이상 기본적으로 매핑되지 않습니다. 이 API 버전 이상으로 만든 Batch 풀에 대한 인터넷에서 액세스할 필요가 없는 경우 더 이상 명시적 거부 규칙을 만들 필요가 없습니다. 다른 원본의 액세스를 제한하기 위해 명시적 거부 규칙을 지정해야 할 수도 있습니다.

from azure.batch import models

class AzureBatch(object):
    def set_ports_pool(self, **kwargs):
        pool.network_configuration = models.NetworkConfiguration(
            endpoint_configuration=models.BatchPoolEndpointConfiguration(
                inbound_nat_pools=[models.BatchInboundNatPool(
                    name='SSH',
                    protocol=models.InboundEndpointProtocol.TCP,
                    backend_port=22,
                    frontend_port_range_start=4000,
                    frontend_port_range_end=4100,
                    network_security_group_rules=[
                        models.NetworkSecurityGroupRule(
                            priority=170,
                            access=models.NetworkSecurityGroupRuleAccess.DENY,
                            source_address_prefix='Internet'
                        )
                    ]
                )
                ]
            )
        )
    ),
    network_configuration=batchmodels.NetworkConfiguration(
        endpoint_configuration=batchmodels.PoolEndpointConfiguration(
            inbound_nat_pools=[batchmodels.InboundNatPool(
                name='SSH',
                protocol=batchmodels.InboundEndpointProtocol.TCP,
                backend_port=22,
                frontend_port_range_start=4000,
                frontend_port_range_end=4100,
                network_security_group_rules=[
                    batchmodels.NetworkSecurityGroupRule(
                        priority=170,
                        access=batchmodels.NetworkSecurityGroupRuleAccess.DENY,
                        source_address_prefix='Internet'
                    )
                ]
            )]
        )
    )
)

result = client.pool.create(
    resource_group_name=resource_group_name,
    account_name=account_name,
    pool_name=pool_name,
    parameters=pool_parameters
)

print(f"Pool '{result.name}' created successfully.")

다음 단계