Como soluciono problemas ao passar variáveis de ambiente para minha tarefa do Amazon ECS?

9 minuto de leitura
0

Quero solucionar problemas ao passar variáveis de ambiente para minha tarefa do Amazon Elastic Container Service (Amazon ECS).

Breve descrição

Você pode passar uma variável de ambiente dentro da sua tarefa do Amazon ECS de uma das seguintes formas:

  • Passe a variável como um objeto environmentFiles dentro de um bucket do Amazon Simple Storage Service (Amazon S3).
  • Armazene a variável dentro de um repositório de parâmetros do AWS Systems Manager.
  • Armazene a variável em sua definição de tarefa do ECS.
  • Armazene a variável dentro do AWS Secrets Manager.

**Observação:**É uma prática recomendada de segurança usar o Parameter Store ou o Secrets Manager para armazenar seus dados confidenciais como uma variável de ambiente. Ao passar as variáveis de ambiente em um dos métodos anteriores, você pode receber os seguintes erros:

Parameter Store

“Obtendo dados secretos do SSM Parameter Store na região: AccessDeniedException: Usuário: arn:aws:sts: :123456789:assumed-role/ecsExecutionRole/f512996041234a63ac354214 não está autorizado a executar: ssm:GetParameters no recurso: arn:aws:ssm:ap-south- 1:12345678:código de parâmetro/status: 400, id da solicitação: e46b40ee-0a38-46da-aedd-05f23a41e861"

-ou-

“ResourceInitializationError: não é possível extrair segredos ou autenticação do registro: falha na recuperação do recurso de execução: não é possível recuperar segredos do ssm: a chamada de serviço foi repetida 5 vezes: SolicitaçãoCancelada”

Secrets Manager

“Erro ResourceInitializationError”

-ou-

“Erro AccessDenied no Amazon Elastic Compute Cloud (Amazon EC2)”

Para resolver esses erros, consulte Como soluciono problemas relacionados aos segredos do AWS Secrets Manager no Amazon ECS?

Amazon S3

“ResourceInitializationError: falha ao baixar arquivos env: comando de download de arquivo: fluxo de erro não vazio”

Você pode enfrentar problemas ao passar variáveis de ambiente para suas tarefas do Amazon ECS devido aos seguintes motivos:

  • Sua função de execução de tarefas do Amazon ECS não tem as permissões necessárias de identidade e gerenciamento da AWS (IAM).
  • Há problemas com sua configuração de rede.
  • Seu aplicativo não consegue ler a variável de ambiente.
  • O formato da variável na definição do contêiner está incorreto.
  • A variável de ambiente não é atualizada automaticamente.

Use o runbook AWSSupport-TroubleshootECSTaskFailedToStart para solucionar os erros das tarefas do Amazon ECS que falham ao iniciar. Em seguida, consulte as etapas de solução de problemas relevantes para seu problema.

Resolução

Importante:

  • Use o runbook AWSSupport-TroubleshootECSTaskFailedToStart na mesma região da AWS em que seus recursos de cluster do ECS estão localizados.
  • Ao usar o runbook, você deve usar a ID de tarefa que falhou mais recentemente. Se a tarefa com falha fizer parte do serviço Amazon ECS, use a tarefa que falhou mais recentemente no serviço. A tarefa com falha deve estar visível em ECS:DescribeTasks durante a execução da automação. Por padrão, as tarefas interrompidas do ECS ficam visíveis por 1 hora após entrarem no estado Interrompido. O uso da ID de tarefa que falhou mais recentemente impede que a limpeza do estado da tarefa interrompa a análise durante a automação.

Para obter instruções sobre como iniciar o runbook, consulte AWSSupport-TroubleshootECSTaskFailedToStart. Com base na saída da automação, use uma das seguintes etapas manuais de solução de problemas.

Sua função de execução de tarefas do Amazon ECS não tem as permissões de IAM necessárias

Se você estiver usando variáveis de ambiente dentro do Parameter Store ou do Secrets Manage, analise os eventos do AWS CloudTrail para qualquer uma das seguintes chamadas de API:

GetParameters para Parameter Store

-ou-

GetSecretValue para Secrets Manager

Se você notar o erro AccessDenied para a função de execução de tarefas em eventos do CloudTrail, adicione manualmente as permissões necessárias como uma política embutida ao seu perfil do IAM de execução de tarefas do ECS. Você também pode criar uma política gerenciada pelo cliente e adicionar a política à sua função de execução de tarefas do ECS.

Se você estiver usando o Secrets Manager, inclua as seguintes permissões para sua função de execução de tarefas:

{  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "secretsmanager:GetSecretValue",
        "kms:Decrypt"
      ],
      "Resource": [
        "arn:aws:secretsmanager:example-region:11112222333344445555:secret:example-secret",
        "arn:aws:kms:example-region:1111222233334444:key/example-key-id"
      ]
    }
  ]
}

Se você estiver usando o Parameter Store, inclua as seguintes permissões para sua função de execução de tarefas:

{  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ssm:GetParameters",
        "secretsmanager:GetSecretValue",
        "kms:Decrypt"
      ],
      "Resource": [
        "arn:aws:ssm:example-region:1111222233334444:parameter/example-parameter",
        "arn:aws:secretsmanager:example-region:1111222233334444:secret:example-secret",
        "arn:aws:kms:example-region:1111222233334444:key/example-key-id"
      ]
    }
  ]
}

Você pode usar um bucket do S3 para armazenar a variável de ambiente como um arquivo .env. No entanto, você deve adicionar manualmente as seguintes permissões como uma política embutida à função de execução da tarefa:

{  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:s3:::example-bucket/example-folder/example-env-file"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetBucketLocation"
      ],
      "Resource": [
        "arn:aws:s3:::example-bucket"
      ]
    }
  ]
}

Há problemas com sua configuração de rede

Se sua tarefa do ECS estiver em uma sub-rede privada, verifique os seguintes pontos:

  • Certifique-se de que o grupo de segurança da tarefa ou do serviço permita tráfego de saída na porta 443.
  • Se você usa um endpoint da VPC, certifique-se de que a lista de controle de acesso à rede (ACL) permita tráfego de saída na porta 443.
  • Verifique a conectividade com o Systems Manager/Secrets Manager e o endpoint Amazon S3. Para fazer isso, use o comando telnet.
  • Se você usa um gateway NAT, certifique-se de que sua tarefa tenha uma rota padrão para o gateway NAT.
  • Defina os endpoints da VPC para suas tarefas. Verifique se você tem os endpoints da VPC necessários para o Secrets Manager/Systems Manager Parameter Store e o Amazon S3.

Se você usa um endpoint da VPC, verifique os seguintes pontos:

  • O grupo de segurança do seu endpoint da VPC permite o tráfego de saída da tarefa ou do serviço na porta 443.
  • Associe o endpoint da VPC à VPC correta.
  • Ative os atributos VPC enableDnsHostnames e enableDnsSupport.

Se sua tarefa do ECS estiver em uma sub-rede pública, verifique os seguintes pontos:

  • Você deve ativar um endereço IP público para a tarefa.
  • Certifique-se de que o grupo de segurança da sua VPC tenha acesso externo à Internet na porta 443.
  • A configuração da rede ACL permite que todo o tráfego entre e saia das sub-redes para a Internet.

Seu aplicativo não consegue ler a variável de ambiente

Para verificar se as variáveis de ambiente corretas estão preenchidas dentro do seu contêiner de tarefas, faça o seguinte:

  1. Liste todas as variáveis de ambiente que estão expostas dentro do contêiner.
  2. Verifique se essa lista inclui as variáveis de ambiente que você definiu na definição da tarefa ou no arquivo**.env** no S3.

Se você estiver usando os tipos de lançamento do Amazon EC2 ou do AWS Fargate, é uma melhor prática usar o recurso ECS Exec. Você pode usar esse recurso para executar comandos ou transferir um shell para um contêiner em execução em uma instância do Amazon EC2 ou no Fargate. Depois de ativar esse recurso, execute o seguinte comando para interagir com seu contêiner:

aws ecs execute-command --cluster example-cluster \--task example-task-id \
--container example-container \
--interactive \
--command "/bin/sh"

Se você usar o tipo de inicialização do Amazon EC2, também poderá usar o comando Docker exec para interagir com seu contêiner. Nesse caso, conclua as seguintes etapas: Conecte-se à instância do contêiner em que sua tarefa está sendo executada. Em seguida, execute o seguinte comando do Docker para encontrar o ID do contêiner de tarefas:

docker container ps

Para interagir com o contêiner, execute o seguinte

docker exec -it example-container-id bash

**Observação:**Selecione o shell de acordo com o shell padrão do contêiner.

Depois de estabelecer a conexão com o contêiner, execute o comando env em seu contêiner para obter a lista completa de suas variáveis de ambiente. Examine essa lista para garantir que as variáveis de ambiente que você definiu na definição da tarefa ou no arquivo .env estejam presentes.

O formato da variável na definição do contêiner está incorreto

Ao definir variáveis de ambiente dentro da definição do contêiner, defina as variáveis de ambiente como objetos KeyValuePair:

"environment": [{    "name": "foo",
    "value": "bar"
}]

Certifique-se de usar esse formato ao definir também as variáveis de ambiente em seus arquivos .env.

A variável de ambiente não é atualizada automaticamente

Quando você atualiza a variável de ambiente em seu arquivo .env, a variável não é atualizada automaticamente no contêiner em execução.
Para injetar os valores atualizados das variáveis ambientais em sua tarefa, atualize o serviço executando o seguinte comando:

aws ecs update-service --cluster example-cluster --service example-service --force-new-deployment

Se você usar variáveis de ambiente em sua definição de contêiner, deverá criar uma nova definição de tarefa para atualizar as variáveis de ambiente atualizadas. Com essa nova definição de tarefa, você pode criar uma nova tarefa ou atualizar seu serviço ECS:

`aws ecs update-service --cluster example-cluster --service example-service --task-definition <family:revision>`;

**Observação:**Lembre-se dos seguintes pontos ao passar variáveis de ambiente para sua tarefa:

  • Se você especificar variáveis de ambiente com o parâmetro de ambiente em uma definição de contêiner, elas terão precedência sobre as variáveis contidas em um arquivo de ambiente.
  • Se você especificar vários arquivos de ambiente e eles contiverem a mesma variável, eles serão processados na ordem de entrada. O primeiro valor da variável é usado e os valores subsequentes das variáveis duplicadas são ignorados. É uma prática recomendada usar nomes de variáveis exclusivos.
  • Se você especificar um arquivo de ambiente como uma substituição de contêiner, o arquivo será usado. Todos os outros arquivos de ambiente especificados em uma definição de contêiner são ignorados.
  • As variáveis de ambiente estão disponíveis para os processos do PID 1 em um contêiner a partir do arquivo /proc/1/environ. Se o contêiner executar vários processos ou processos de inicialização, como wrapper script ou supervisord, a variável de ambiente não estará disponível para processos não PID 1.

Informações relacionadas

Passando variáveis de ambiente para um contêiner