代码之家  ›  专栏  ›  技术社区  ›  Ricardo Branco

如何将IAM角色附加到EC2实例,以便它们可以在Terraform中从ECR提取特定图像

  •  3
  • Ricardo Branco  · 技术社区  · 8 年前

    我正在尝试将IAM角色附加到EC2实例(不是ECS),以便它们可以从ECR中提取图像。

    3 回复  |  直到 7 年前
        1
  •  2
  •   Eric M. Johnson    7 年前

    像这样做。注:您可能希望限制可访问的ECR回购。

    resource "aws_instance" "test" {
      ...
    }
    
    resource "aws_launch_configuration" "ecs_cluster" {
      ...
      iam_instance_profile = "${aws_iam_instance_profile.test.id}"
    }
    
    resource "aws_iam_role" "test" {
      name = "test_role"
      assume_role_policy = "..."
    }
    
    resource "aws_iam_instance_profile" "test" {
      name = "ec2-instance-profile"
      role = "${aws_iam_role.test.name}"
    }
    
    resource "aws_iam_role_policy_attachment" "test" {
      role       = "${aws_iam_role.test.name}"
      policy_arn = "${aws_iam_policy.test.arn}"
    }
    
    resource "aws_iam_policy" "test" {
      name        = "ec2-instance-pulls-from-ecr"
      description = "EC2 instance can pull from ECR"
    
      policy = <<EOF
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "ecr:GetAuthorizationToken",
            "ecr:BatchCheckLayerAvailability",
            "ecr:GetDownloadUrlForLayer",
            "ecr:BatchGetImage"
          ],
          "Resource": "*"
        }
      ]
    }
    EOF
    }
    
        2
  •  1
  •   mmell Daniel Rearden    7 年前

    已知这在地形v0.11.13中起作用

    簇tf公司

    locals {
      cluster_name = "cluster-${terraform.workspace}"
    }
    
    resource "aws_iam_role_policy" "cluster_member" {
      name = "${local.cluster_name}"
      role = "${aws_iam_role.cluster_member.id}"
    
      policy = <<EOF
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "ecs:UpdateContainerInstancesState",
            "ecs:DeregisterContainerInstance",
            "ecs:DiscoverPollEndpoint",
            "ecs:Poll",
            "ecs:RegisterContainerInstance",
            "ecs:StartTelemetrySession",
            "ecs:Submit*",
            "ecr:GetAuthorizationToken",
            "ecr:BatchCheckLayerAvailability",
            "ecr:GetDownloadUrlForLayer",
            "ecr:BatchGetImage",
            "logs:CreateLogStream",
            "logs:PutLogEvents"
          ],
          "Resource": "*"
        }
      ]
    }
    EOF
    }
    
    resource "aws_iam_role" "cluster_member" {
      name = "${local.cluster_name}"
    
      assume_role_policy = <<EOF
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Action": "sts:AssumeRole",
          "Effect": "Allow",
          "Principal": {
            "Service": "ec2.amazonaws.com"
          },
          "Sid": ""
        }
      ]
    }
    EOF
    }
    
    resource "aws_iam_instance_profile" "cluster_member" {
      name = "${local.cluster_name}"
      role = "${aws_iam_role.cluster_member.name}"
    }
    
    data "template_file" "cloud_config" {
      template = "${file("${path.module}/templates/user_data.sh")}"
      vars {
        ecs_cluster = "${local.cluster_name}"
      }
    }
    
    resource "aws_instance" "cluster_member" {
      # http://docs.aws.amazon.com/AmazonECS/latest/developerguide/instance_IAM_role.html
      iam_instance_profile = "${aws_iam_instance_profile.cluster_member.name}"
    
      user_data = "${data.template_file.cloud_config.rendered}"
    }
    

    模板/用户数据。上海

    #!/bin/bash
    
    # See https://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_container_instance.html
    
    cat <<'EOF' >> /etc/ecs/ecs.config
    ECS_CLUSTER=${ecs_cluster}
    EOF
    
        3
  •  0
  •   Saurav Jha    6 年前

    Eric M.Johnson给出的答案是正确的,只是为了完整性,

    resource "aws_launch_configuration" "ecs_launch_configuration" {
      name                        = "${var.application_name}-${var.stack}"
      image_id                    = var.image_id
      instance_type               = var.instance_type
      iam_instance_profile        = aws_iam_instance_profile.esc_launch_configuration_iam_instance_profile.arn
      security_groups             = split(",",aws_security_group.ecs_launch_configuration_security_group.id)
      associate_public_ip_address = "true"
    //  key_name                    = "${var.ecs-key-pair-name}"
      user_data                   = data.template_file.user_data.rendered
    }
    
    data "template_file" "user_data" {
      template = file("${path.module}/ec2/user-data.sh")
    
      vars = {
        ecs_cluster_name = "${var.application_name}-${var.stack}"
      }
    }
    
    resource "aws_iam_instance_profile" "esc_launch_configuration_iam_instance_profile" {
      name = "${var.application_name}-${var.stack}"
      role = aws_iam_role.iam_role.name
    }
    
    resource "aws_iam_role" "iam_role" {
      name = "${var.application_name}-${var.stack}"
      force_detach_policies = true
    
      assume_role_policy = <<EOF
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": "sts:AssumeRole",
                "Principal": {
                   "Service": [
                      "ec2.amazonaws.com",
                      "ecs.amazonaws.com"
                  ]
                },
                "Effect": "Allow",
                "Sid": ""
            }
        ]
    }
    EOF
    }
    
    resource "aws_iam_role_policy_attachment" "iam_role_policy_attachment" {
      role       = aws_iam_role.iam_role.name
      policy_arn = aws_iam_policy.ecs_iam_policy.arn
    }
    
    
    resource "aws_iam_policy" "ecs_iam_policy" {
      name = "${var.application_name}-${var.stack}"
      description = "EC2 instance can pull from ECR"
    
      policy = <<EOF
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
              "ec2:DescribeTags",
              "ecs:CreateCluster",
              "ecs:DeregisterContainerInstance",
              "ecs:DiscoverPollEndpoint",
              "ecs:Poll",
              "ecs:RegisterContainerInstance",
              "ecs:StartTelemetrySession",
              "ecs:UpdateContainerInstancesState",
              "ecs:Submit*",
              "ecr:GetAuthorizationToken",
              "ecr:BatchCheckLayerAvailability",
              "ecr:GetDownloadUrlForLayer",
              "ecr:BatchGetImage",
              "logs:CreateLogStream",
              "logs:PutLogEvents"
          ],
          "Resource": "*"
        }
      ]
    }
    EOF
    }
    
    推荐文章