InstanceAgent:: Плагины:: CodeDeployPlugin:: CommandPoller: Отсутствуют учетные данные

Я пытаюсь развернуть проект GitHub для экземпляра EC2, используя AWS CodeDeploy. После следующих двух видеоуроков, связанных с ответом Google, я все еще получаю следующую ошибку:

2017-02-01 12:20:08 INFO  [codedeploy-agent(1379)]: master 1379: Spawned child 1/1
2017-02-01 12:20:09 INFO  [codedeploy-agent(1383)]: On Premises config file does not exist or not readable
2017-02-01 12:20:09 INFO  [codedeploy-agent(1383)]: InstanceAgent::Plugins::CodeDeployPlugin::CommandExecutor: Archives to retain is: 5}
2017-02-01 12:20:09 INFO  [codedeploy-agent(1383)]: Version file found in /opt/codedeploy-agent/.version.
2017-02-01 12:20:09 ERROR [codedeploy-agent(1383)]: InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller: Missing credentials - please check if this instance was started with an IAM instance profile

У меня два IAM:

  • CodeDeployInstanceRole
  • CodeDeployServiceRole

CodeDeployInstanceRole для экземпляра EC2

Имя политики: AmazonEC2RoleforAWSCodeDeploy

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "s3:GetObject",
        "s3:GetObjectVersion",
        "s3:ListObjects"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}

Имя политики: AutoScalingNotificationAccessRole

{
    "Version": "2012-10-17",
    "Statement": [{
        "Effect": "Allow",
        "Resource": "*",
        "Action": [
            "sqs:SendMessage",
            "sqs:GetQueueUrl",
            "sns:Publish"
        ]
      }
    ]
}

Доверительные отношения

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "codedeploy.amazonaws.com",
          "ec2.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

CodeDeployServiceRole для CodeDeploy

Имя политики: AWSCodeDeployRole

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "autoscaling:CompleteLifecycleAction",
        "autoscaling:DeleteLifecycleHook",
        "autoscaling:DescribeAutoScalingGroups",
        "autoscaling:DescribeLifecycleHooks",
        "autoscaling:PutLifecycleHook",
        "autoscaling:RecordLifecycleActionHeartbeat",
        "autoscaling:CreateAutoScalingGroup",
        "autoscaling:UpdateAutoScalingGroup",
        "autoscaling:EnableMetricsCollection",
        "autoscaling:DescribeAutoScalingGroups",
        "autoscaling:DescribePolicies",
        "autoscaling:DescribeScheduledActions",
        "autoscaling:DescribeNotificationConfigurations",
        "autoscaling:DescribeLifecycleHooks",
        "autoscaling:SuspendProcesses",
        "autoscaling:ResumeProcesses",
        "autoscaling:AttachLoadBalancers",
        "autoscaling:PutScalingPolicy",
        "autoscaling:PutScheduledUpdateGroupAction",
        "autoscaling:PutNotificationConfiguration",
        "autoscaling:PutLifecycleHook",
        "autoscaling:DescribeScalingActivities",
        "autoscaling:DeleteAutoScalingGroup",
        "ec2:DescribeInstances",
        "ec2:DescribeInstanceStatus",
        "ec2:TerminateInstances",
        "tag:GetTags",
        "tag:GetResources",
        "sns:Publish",
        "cloudwatch:DescribeAlarms",
        "elasticloadbalancing:DescribeLoadBalancers",
        "elasticloadbalancing:DescribeInstanceHealth",
        "elasticloadbalancing:RegisterInstancesWithLoadBalancer",
        "elasticloadbalancing:DeregisterInstancesFromLoadBalancer"
      ],
      "Resource": "*"
    }
  ]
}

Доверительные отношения

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "codedeploy.amazonaws.com",
          "ec2.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

Экземпляр EC2

Я создаю свой собственный образ, созданный на основе Debian, поэтому у меня уже установлен NodeJS. Когда я запускаю новый экземпляр, я также вставляю следующий код в текстовую область User data, чтобы убедиться, что установлен CodeDeploy.

#!/bin/bash -x

REGION=$(curl 169.254.169.254/latest/meta-data/placement/availability-zone/ | sed 's/[a-z]$//') &&

sudo apt-get update -y &&

sudo apt-get install -y python-pip &&

sudo apt-get install -y ruby &&

sudo apt-get install -y wget &&

cd /home/admin &&

wget https://aws-codedeploy-$REGION.s3.amazonaws.com/latest/install &&

chmod +x ./install &&

sudo ./install auto &&

sudo apt-get remove -y wget &&

sudo service codedeploy-agent start

Отладка

Если я вхожу в экземпляр EC2, который я создал, и выполните следующую команду:

echo $(curl http://169.254.169.254/latest/meta-data/iam/security-credentials/)

Получаю следующий ответ CodeDeployInstanceRole

Когда я выполняю

curl http://169.254.169.254/latest/meta-data/iam/security-credentials/CodeDeployInstanceRole

Получаю следующий ответ

{
  "Code" : "Success",
  "LastUpdated" : "2017-02-01T12:38:07Z",
  "Type" : "AWS-HMAC",
  "AccessKeyId" : "THE_KEY",
  "SecretAccessKey" : "SECRET",
  "Token" : "TOKEN",
  "Expiration" : "2017-02-01T19:08:43Z"
}

В GitHub я вижу, что CodeDeploy никогда не обращается к моему репо, даже когда я выбираю развертывание с помощью GitHub, я устанавливаю правильное имя репо и фиксирую идентификатор.

введите описание изображения здесь

Вопрос

Что мне не хватает?

Ответ 1

Оказывается, что по умолчанию Debian не установлен curl. Установка curl перед выполнением запроса на завивание для получения региона, на котором выполняется сервер, была отсутствующей частью в Bash script.

Ответ 2

Я столкнулся с той же проблемой. Вкратце что вызвало проблему:

  • Запустите экземпляр БЕЗ любых прикрепленных к нему ролей
  • Затем установите codedeploy-agent на этом компьютере
  • Только наконец добавьте роль IAM к машине

Результат: я получаю сообщение об ошибке: Missing credentials - please check if this instance was started with an IAM instance profile

Решение: перезапустите агент codedeploy. Использование:

sudo service codedeploy-agent restart

Ошибка должна исчезнуть сейчас!

Ответ 3

Разрешения роли экземпляра выглядят хорошо для меня. Но профиль экземпляра IAM был добавлен только в первый раз, когда экземпляр был запущен. Не могли бы вы убедиться, что роль экземпляра имела правильные разрешения перед запуском экземпляров?