Почему время ожидания получения учетных данных AWS в контейнере / задаче Windows через API истекло? - PullRequest
2 голосов
/ 05 июня 2019

Согласно документации, вы должны иметь возможность получить учетные данные роли, назначенной определению задачи, из выполняющейся задачи (контейнера), используя следующий URL: http://169.254.170.2'AWS_CONTAINER_CREDENTIALS_RELATIVE_URI', где AWS_CONTAINER_CREDENTIALS_RELATIVE_URI разрешается в часть URL-адреса.,

В моем случае в файле журнала я вижу, что он разрешается в: http://169.254.170.2/v2/credentials/063b6cc6-0dc7-486e-ba0a-843a308b222d

Но вызов API приводит к тайм-ауту.В чем может быть причина, по которой конечная точка не прослушивает?

Контейнер выполняет образ ECS_OPTIMIZED windows-server-2019

private static async Task<string> GetCredentials(EnvironmentOptions opts)
{
    try
    {
        using (var httpClient = new HttpClient())
        {
                using (var request = new HttpRequestMessage(new HttpMethod("GET"), $"http://169.254.170.2{opts.CredentailsUrl}"))
                {
                    var response = await httpClient.SendAsync(request);
                    return await response.Content.ReadAsStringAsync();
                }
            }
        }
        catch (Exception ex)
        {
            return $"{ex.Message} {ex.StackTrace}";
        }
    }

opts.CredentailsUrl = '/ v2 / credentials / 063b6cc6-0dc7-486e-ba0a-843a308b222d 'например и получен из переменной среды AWS_CONTAINER_CREDENTIALS_RELATIVE_URI

Полученное сообщение об ошибке: попытка подключения не удалась, потому что подключенная сторона не ответила должным образом после определенного периода времени,или не удалось установить соединение, потому что подключенный хост не смог ответить

Мне действительно нужно получить класс json, например:

{
    "AccessKeyId": "ACCESS_KEY_ID",
    "Expiration": "EXPIRATION_DATE",
    "RoleArn": "TASK_ROLE_ARN",
    "SecretAccessKey": "SECRET_ACCESS_KEY",
    "Token": "SECURITY_TOKEN_STRING"
}

В экземпляре контейнера я запускаю следующие две команды из powershell:

Import-Module ECSTools
Initialize-ECSAgent -Cluster 'txp-dev-windows' -EnableTaskIAMRole -Version "latest"

И это привело к тому, что последняя строка фактически никогда не продолжалась (= зависает)

019-06-07T10:15:06Z - [INFO]:Runtime is already installed.
2019-06-07T10:15:06Z - [INFO]:Docker version 18.09.4, build c3516c43ef
2019-06-07T10:15:06Z - [INFO]:Configuring ECS Host...
2019-06-07T10:15:06Z - [INFO]:Checking Hyper-V Network adapter
2019-06-07T10:15:08Z - [INFO]:Default vEthernet adapter found for nat. Using this adapter.
2019-06-07T10:15:08Z - [INFO]:VMNetwork adapter found with mac: 00-15-5D-2B-E1-89
2019-06-07T10:15:08Z - [INFO]:Checking for network adatper with mac: 00-15-5D-2B-E1-89
2019-06-07T10:15:08Z - [INFO]:Network adapter found.
2019-06-07T10:15:08Z - [INFO]:Network adapter found with mac 00-15-5D-2B-E1-89 on interface 2
2019-06-07T10:15:08Z - [INFO]:Getting subnet info from docker...
2019-06-07T10:15:08Z - [INFO]:Docker subnet: 0.0.0.0/0
2019-06-07T10:15:08Z - [INFO]:Docker gateway:
WARNING: Waiting for service 'Docker Engine (docker)' to stop...
WARNING: Waiting for service 'Docker Engine (docker)' to stop...
WARNING: Waiting for service 'Docker Engine (docker)' to stop...
WARNING: Waiting for service 'Docker Engine (docker)' to stop...
WARNING: Waiting for service 'Docker Engine (docker)' to stop...
2019-06-07T10:15:22Z - [INFO]:Docker subnet: 172.31.16.0/20
2019-06-07T10:15:22Z - [INFO]:Docker gateway: 172.31.16.1
2019-06-07T10:15:24Z - [INFO]:Getting net ip address
2019-06-07T10:15:25Z - [INFO]:IP address not found.
Name                           Value
----                           -----
PrefixLength                   32
IPAddress                      169.254.170.2
InterfaceIndex                 2



2019-06-07T10:15:25Z - [INFO]:Creating new virtual network adapter ip...
New-NetIPAddress : Element not found.
At C:\Program Files\WindowsPowerShell\Modules\ECSTools\ECSTools.psm1:1370 char:28
+             $newIpOutput = New-NetIPAddress @IPAddrParams
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (MSFT_NetIPAddress:ROOT/StandardCimv2/MSFT_NetIPAddress) [New-NetIPAddress], CimException
    + FullyQualifiedErrorId : Windows System Error 1168,New-NetIPAddress

2019-06-07T10:15:25Z - [INFO]:Virtual network adapter ip created:
2019-06-07T10:15:25Z - [INFO]:Waiting for it to become available on the device...

Затем я нашел это в документации AWS: роли IAM для сценария начальной загрузки контейнера задач Прежде чем контейнеры смогут получить доступ к прокси-серверу учетных данных на экземпляре контейнера, чтобыet учетные данные, контейнер должен быть загружен с необходимыми сетевыми командами.

Поэтому я добавил этот скрипт начальной загрузки в программу контейнера при запуске:

                string script = @"
$gateway = (Get-NetRoute | Where { $_.DestinationPrefix -eq '0.0.0.0/0' } | Sort-Object RouteMetric | Select NextHop).NextHop
$ifIndex = (Get-NetAdapter -InterfaceDescription 'Hyper-V Virtual Ethernet*' | Sort-Object | Select ifIndex).ifIndex
New-NetRoute -DestinationPrefix 169.254.170.2/32 -InterfaceIndex $ifIndex -NextHop $gateway
";
                using (PowerShell PowerShellInstance = PowerShell.Create())
                {
                    PowerShellInstance.AddScript(script);
                    PowerShellInstance.Invoke();
                }

Но это не такизменить ситуацию.

1 Ответ

0 голосов
/ 07 июня 2019

Точная причина неудачи неясна. Он должен что-то сделать, чтобы экземпляр EC2 был неправильно настроен для кластера ECS. Он был создан вручную, и сценарий powershell данных инициализации подключил его к (пустому) кластеру. Я так и сделал, потому что мастера создания кластеров позволяли использовать только AMI Server 2016. Но, к моему удивлению, сегодня он также позволяет использовать сервер 2019 AMI. Делать это с помощью мастера. Код контейнера начал работать.

...