2
votes

Comment créer un rôle IAM dans Terraform pour Amazon ECR?

À la suite de cette réponse , j'essaye de créer un aws_iam_role qui permet d'accéder à ECR. Cependant, lorsque je définis ce qui suit:

Error: Error creating IAM Role JenkinsECRRole:
MalformedPolicyDocument: Invalid principal in policy: "SERVICE":"*"

j'obtiens l'erreur:

resource "aws_iam_role" "jenkins_ecr_role" {
  name = "JenkinsECRRole"

  assume_role_policy = <<END_OF_POLICY
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "ecr.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
END_OF_POLICY
}

Cela ressemble à ecr.amazonaws.com est un principal valide selon la documentation AWS. Qu'est-ce que je fais mal?


2 commentaires

Cela permet à ECR d'assumer le rôle, ne permettant pas à un profil d'utilisateur / d'instance d'assumer un rôle pour pouvoir interagir avec ECR.


@ydaetskcoR Alors, quel serait le bon Principal dans cette situation?


3 Réponses :


0
votes

Je pense que vous essayez d'autoriser EC2 à accéder à l'ECR. Pour cela, vous devez créer une stratégie IAM pour ECR et créer un rôle IAM pour EC2 et attacher le rôle à la stratégie.

Veuillez vous référer à ce code:

resource "aws_iam_role" "role" {
  name = "test-role"

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

resource "aws_iam_policy" "policy" {
  name        = "test-policy"
  description = "A test policy"

  policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "ecr:*",
        "cloudtrail:LookupEvents"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}
EOF
}

resource "aws_iam_role_policy_attachment" "test-attach" {
  role       = "${aws_iam_role.role.name}"
  policy_arn = "${aws_iam_policy.policy.arn}"
}

J'espère que ça aide.


0 commentaires

0
votes

Vous devez joindre une politique manuelle mentionnée ci-dessous à votre rôle IAM.

resource "aws_iam_role_policy" "role_policy" {
  name   = "${aws_iam_role.role.name}"
  role   = "${aws_iam_role.role.id}"
  policy = <<EOF
{
  "Version": "2008-10-17",
  "Statement": [
    {
      "Sid": "new statement",
      "Effect": "Allow",
      "Principal": {
        "AWS": "<IAM-ROLE-ARN>"
      },
      "Action": [
        "ecr:BatchCheckLayerAvailability",
        "ecr:BatchGetImage",
        "ecr:CompleteLayerUpload",
        "ecr:GetDownloadUrlForLayer",
        "ecr:InitiateLayerUpload",
        "ecr:PutImage",
        "ecr:UploadLayerPart"
      ]
    }
  ]
}
EOF
}


0 commentaires

0
votes

Votre rôle est créé pour un service qui aura besoin de la stratégie pour utiliser d'autres ressources, je ne suis pas sûr que cela aide.

Vous devez créer un rôle que quelque chose pourra assumer, ec2, sagemaker, s3, quelque chose. ECR n'assume pas de rôle car c'est juste un registre.

Par exemple, j'ai une instance Sagemaker:

resource "aws_ecr_repository_policy" "policy" {

  repository = <aws_ecr_repository.repo.name>
  policy     = <<EOF
{
  "Version": "2008-10-17",
  "Statement": [
    {
      "Sid": "new statement",
      "Effect": "Allow",
      "Principal": {
        "AWS": "${aws_iam_role.sagemaker_model.arn}"
      },
      "Action": [
        "ecr:*"
      ]
    }
  ]
}
EOF
}

Ensuite, cette instance a besoin d'une autorisation pour utiliser autre ressource (ECR):

resource "aws_iam_role_policy_attachment" "model_attach_ecr" {
  role       = aws_iam_role.sagemaker_model.name
  policy_arn = aws_iam_policy.ecr.arn
}

Ensuite, j'attache cette stratégie au rôle précédent:

resource "aws_iam_policy" "ecr" {

  policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "ecr:*"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}
EOF
}

Bien que ECR ait un propriété spécifique qu'il a sa propre politique d'accès, vous devrez autoriser le rôle précédemment créé à accéder au registre de conteneurs spécifique en créant une aws_ecr_repository_policy:

resource "aws_iam_role" "sagemaker_model" {

  assume_role_policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": "sagemaker.amazonaws.com"
      },
      "Effect": "Allow",
      "Sid": ""
    }
  ]
}
EOF

}

Dans celui-ci, vous devrez remplacer par le nom réel du référentiel.

J'espère que cela vous aidera.

p>


0 commentaires