편하게 IaC 해주세요. #5 IAM Role/Security Group.

21490 단어 AWSTerraformIaCtech
안녕하세요.
저번에 네트워크 주위에서terraform으로 인코딩했어요.
https://zenn.dev/yururitto_ryuji/articles/c443c0c37111b1
할 게 뭐 있어!!이렇게 EC2의 실례를 깔끔하게 만들었죠~
나도 이런 시절이 있었다.흰눈
가벼운 마음으로 처음 보면 어이구 심각해!
찾아보고 또 플랜하고 찾아보고 또 플랜 반복해서 겨우 자기 모양으로 만들었어요.
보도하고 싶은데요.
EC2가 뭐냐면요.
EC2~ 뭐지~

EC2 인스턴스를 만들 때 스토리지 또는 네트워크 카드, IAM 또는 보안 그룹,
연결에 사용할 버튼을 설정했죠.
그리고 어느 서브넷에 두면 삭제를 보호합니다...
눈치챘어?
관리 콘솔에서 화면을 보면서 천천히 만들어내면
의식하지는 못했지만 상당수 자원이 연관돼 있음을 실감했다.
공식 등의 샘플을 쓰면 더 잘 일어설 수 있을 것 같지만 조금 더 활용해야 할 것 같아요
각종 자원과 정보를 어떻게 처리해야 할지 생각하면서
하고 싶어요.
스케줄러:할 수 있겠어?
IAM Role을 만들어 보도록 하겠습니다.
EC2와 관련된 리소스로 IAM 및 Security Group부터 먼저 제작하십시오.
공식:awsiam_role
IAM Role을 만들 때 마음속으로 그리는 것이 바로 이런 느낌이다.
  • 관리 정책 첨부
  • 간단하고 알기 쉬운 느낌을 주고 싶다
  • 여러가지 일을 조사하면서 쓸 수 있는 요소를 넣어서 해 봤어요.
    예를 들어 authority라는 디렉터리를 만들어서 작업을 진행한다.
    # authority/local_valiables.tf
    locals {
      attach_policies = [
        "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore",
        "arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess"
      ]
     }
    
    콘솔을 사용하여 IAM Policy의 일람에서 원하는 policy의arn을 설정합니다.name = [a, b, c]라는 이름의list로 변수 준비
    다음은 콘솔에서 신뢰 관계 탭으로 설정한 assume입니다.롤이지?
    자원에 jsonceode로 쓸 수 있을 것 같지만 시간이 지나면 보기 어려울 것 같습니다
    파일 디렉터리를 새로 만들고 json 파일을 저장합니다.
    (점점 ansible처럼 굴지 마...)
    # authority/files/assume_role_ec2.json
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": "ec2.amazonaws.com"
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }
    
    마지막으로 자원 주체다.
    # authority/resource_iam_role.tf
    resource "aws_iam_role" "server_role" {
      name = "${local.env}-${local.server_role}-server_role"
      path = "/"
      assume_role_policy = file("./files/assume_role_ec2.json")
      managed_policy_arns = local.attach_policies
    }
    
    개인적으로 상큼하고 좋아요.assume_role_policy = file("./files/assume_role_ec2.json")외출한 파일을 불러오는 중입니다.managed_policy_arns = local.attach_policies여기에 local에서 만든 관리 정책 목록이 설정되어 있습니다.
    그렇다면 롤러를 많이 만들어도 공간을 아낀다는 느낌을 주며 기름 소모량이 적은 느낌~.
    (여기서 단락을 연결하는 스타일)
    그리고ec2에여기서만든role를사용하고싶어서output요소를이용하고 싶어요.
    output을 사용하면 다른 곳에서 만든 자원 요소를 인용할 수 있습니다.
    # authority/output.tf
    output "server_instance_profile" {
      value = aws_iam_role.server_role.name
    }
    
    이런 느낌으로 value에 설정된 IAM Role의 이름은 이후 EC2의 terraform을 통해 얻을 수 있다.
    Security Group 만들어 주세요.
    IAM이 완성되었으니 Security Group을 시작하십시오.
    공식:awssecurity_group
    공식:awssecurity_group_rule
    Securety Group은 크게
    aws_security_group → 인라인 정의 인라인 및 아웃라인
    aws_security_group_rule → 경계 안과 경계 밖을 개별적으로 정의할 수 있음
    "어? 뭘로 하지?"판단하기 어려운 나
    aws_security_그룹으로 상자 만들기,awssecurity_group_맥주로 안에 있는 거 넣어!
    이런 방향은 스스로 받아들였다.
    그럼 우선 보안 그룹 프레임워크부터 만들어보도록 하겠습니다.
    # authority/resource_sg.tf
    resource "aws_security_group" "server_sg" {
      name = "${local.env}-${local.server_role}-sg"
      vpc_id = ""
      tags = {
        Environmrnt = local.env
      }
    }
    
    다른terraform에서 관리하는 자원에 대한 정보를 원합니다!!
    푸 푸 사랑-??
    처음아이디가 필요한데 어떻게 가져오죠?
    모든 자원 클래스가terraform을 구분하기 위해 디렉터리를 만들기 때문에aws_vpc.mainn_vpc.id이런 획득 방법을 얻을 수 없다.이렇게 하면
    A... 데이터 소스를 사용하여 현재 생성 중인 자원 정보 가져오기
    B... vpc 관리 tsftate에서 정보 얻기
    나는 두 가지가 있다고 생각한다.
  • A의 경우
  • terafform 이외에 변경된 경우 이 정보와 tfstate의 정보가 차이가 발생한다
  • 정보를 즉시 얻을 수 있음
  • B의 경우
  • tfstate 정보를 바탕으로 정적 상태로 자원을 만들어야 한다
  • 약간의 시간 소요
  • 나는 이렇게 생각한다
    개인이 부득이하게 운용 중에 수공 작업이 발생하더라도terraform으로 따라가야 한다
    만약 코드 방면을 정확하게 설정하지 않는다면, 가까스로 인코딩해도 헛수고가 될 것이다
    수동 변경 을 잊고 자원 을 펼치면 재작업 의 원가 가 큰일 이 될 것 같다
    생각했으니까 B 쪽으로 가고 싶어요.
    그렇다면 차점이 생겨도 "아, 그렇구나, 수공으로 만들었구나"
    알아볼 수 있을 것 같아서요.(개인적 견해)
    여기서 아웃풋 차례!
    그렇다면 VPC아이디 가져와.
    먼저 아웃풋.새로 제작한 tf, VPC의 정보aws-를security_그룹을 통해 얻을 수 있습니다.
    (VPC에 대한 자세한 내용은 두 번째 참조)
    https://zenn.dev/yururitto_ryuji/articles/991dc353e4abc4
    # networks/output.tf
    output "vpc_id" {
      description = "main vpc id"
      value = aws_vpc.main-vpc.id
    }
    
    여기 아웃풋으로 필요한 값을 씁니다.value = aws_vpc.main-vpc.id 부분에서 vpc다른 디렉터리로 id의terraform 만들기
    쓸만한 것을 토하다.terraform output 확인해보세요.
    $ terraform output
    vpc_id = "vpc-0e62d30b251ee1aaf"
    
    좋은 아이디가 있어요.다음은 수용자.
    # authority/data_source.tf
    data "terraform_remote_state" "networks" {
      backend = "s3"
      config = {
        bucket = "yururitto-tfstate-backet"
        key = "tfstate-files/dev/vpc.tfstate"
        region = "ap-northeast-1"
      }
    }
    
    여기 사용terraform_remote_state을 통해 s3의 구간에 있는 vpc에 대한 정보를 기록했습니다.
    tfstate 파일의 output 정보를 얻을 수 있습니다.
    security_그룹의 최종 계열은 이쪽입니다.
    # authority/valiable.tf
    # アクセスを許可するIPリスト
    locals {
      allow_ip_lists = [
        "192.168.33.100/32",
        "192.168.33.101/32",
        "192.168.33.102/32"
      ]
    }
    
    # authority/resource_sg.tf
    
    # ここで器を作って
    resource "aws_security_group" "server_sg" {
      name = "${local.env}-${local.server_role}-sg"
      vpc_id = "${data.terraform_remote_state.networks.outputs.vpc_id}"
      tags = {
        Environmrnt = local.env
      }
    }
    
    # インバウンドの紐付け
    resource "aws_security_group_rule" "server-inbound" {
      type = "ingress"
      protocol = "tcp"
      from_port = "80"
      to_port = "80"
      cidr_blocks = local.allow_ip_lists
      security_group_id = aws_security_group.server_sg.id
    }
    
    # アウトバウンドの紐付け
    resource "aws_security_group_rule" "server_outbound" {
      type = "egress"
      protocol = "-1"
      from_port = 0
      to_port = 0
      cidr_blocks = ["0.0.0.0/0"]
      security_group_id = aws_security_group.server_sg.id
    }
    
    vpc_id = "${data.terraform_remote_state.networks.outputs.vpc_id}"이렇게 넷워크스 디렉터리에서 만든 자원의outputid 가져오기
    그럴게요.
    그리고 security_group_id = aws_security_group.server_sg.id 링크
    입국과 외부를 포위하는 느낌을 유연하게 설정할 수 있다.
    자가 길어졌지만 그래도 apply!
    아뇨, 정말 콘솔로 했다면 눈 깜짝할 사이에 설명할 수 있는 게 너무 진했어요
    미안합니다. 다시 한 번 사귀어 주세요.
    $ terraform apply
    
    Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
      + create
    
    Terraform will perform the following actions:
    
      # aws_iam_role.server_role will be created
      + resource "aws_iam_role" "server_role" {
          + arn                   = (known after apply)
          + assume_role_policy    = jsonencode(
                {
                  + Statement = [
                      + {
                          + Action    = "sts:AssumeRole"
                          + Effect    = "Allow"
                          + Principal = {
                              + Service = "ec2.amazonaws.com"
                            }
                        },
                    ]
                  + Version   = "2012-10-17"
                }
            )
    	
     # (中略)
    
      # aws_security_group_rule.server_outbound will be created
      + resource "aws_security_group_rule" "server_outbound" {
          + cidr_blocks              = [
              + "0.0.0.0/0",
            ]
          + from_port                = 0
          + id                       = (known after apply)
          + protocol                 = "-1"
          + security_group_id        = (known after apply)
          + self                     = false
          + source_security_group_id = (known after apply)
          + to_port                  = 0
          + type                     = "egress"
        }
        
    Apply complete! Resources: 4 added, 0 changed, 0 destroyed.
    
    IAM Role 완성!!!

    안전단체도 좋아요!!

    최후
    길이가 상당히 길었을 뿐 아니라 이번에는 다양한 요소를 가미했다.file("./files/assume_role_ec2.json")외부 파일 로드data "terraform_remote_state" "networks" {아웃풋이 만든 자원에 대한 정보를 이용해서 만든 거 아닌가 싶어요.
    힘든 부분, 코딩이 완성되었을 때의 성취감은 부족합니다!
    terraform은 아직 초보자일 뿐이지만, 이 상태로 자원을 만들어 보도하고 싶어요.
    다시 당신과 천천히 사귈 수 있었으면 좋겠습니다.
    감사합니다!
    다음에 드디어 EC2에 갈 수 있을까요?

    좋은 웹페이지 즐겨찾기