Согласно документации, вы должны иметь возможность получить учетные данные роли, назначенной определению задачи, из выполняющейся задачи (контейнера), используя следующий 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();
}
Но это не такизменить ситуацию.