기존 인프라를 인코딩할 때 주의해야 할 일

9729 단어 AWSTerraformIaCtech
새해 최초 JAWS-UG 행사에 참석해 발표한 내용을 더 자세히 덧붙인 기사다.
https://jawsug-bgnr.connpass.com/event/235497/

개요


지난해 12월부터 사내 AWS 인프라 시스템(IaC=Infrastructure as Code)에 대한 코드 관리(IaC=Infrastructure as Code)가 시작됐다.
테라폼과 AWS CDK 등 새로운 자원을 활용해 인코딩한 사례가 다수 소개됐지만, 의외로 기존 인프라를 인코딩하는 방법의 수가 적어 어렵다.
이 보도에서 나는 내가 직면한 기존 인프라 시설의 인코딩 중 가장 적합한 점을 소개할 것이다.

배경.


2020년까지 사내 인프라팀은 2명에 불과했고 이 중 1명은 매니저로 기본적으로 비즈니스 인력과의 커뮤니케이션 위주여서 실질적으로 1명이 인프라 구축·운용·뉴미디어 서버 제작을 담당했다.
한 사람이 검증 환경을 담은 EC2 실례를 포함해 수백 대의 서버를 운용해 뉴미디어를 구축하는 서버다.
물론 시간도 부족하고 우선 속도로 AWS 콘솔 화면의 조작을 통해 자원을 구축한다.

지난해부터 인원이 늘면서 새로운 임원이 연대됐고, 팀 체제가 완비돼 서버 구축이 이전보다 빠르게 제작될 수 있어 IaC에 착수하기로 했다.
매니저가 나에게 팀에 적합한 IaC 도구의 선정과 운용 방법을 고려해 달라고 부탁하여 12월에 각종 도구의 기술 선택과 검증을 진행하였다.

기술 선정 조사


먼저 IaC AWS 리소스가 사용하는 도구에 대해 살펴보았습니다.
다른 회사의 사례와 일본어 보도가 많았는데 학습 원가의 문턱이 낮다는 세 가지 측면에서 검증됐다.
  • AWS CloudFormation
  • AWS CDK
  • Terraform
  • 또한 선정 기준의 중점은 기존 자원을 인코딩할 때의 난이도, 코드의 가독성, 장래의 운용의 확장성에 있다.
    향후 운용의 확장성과 관련해서는 Giit에서 CI/CD 환경을 바탕으로 구성 관리 도구를 구현하고자 한다git push 이후 자동으로 개발해 인프라 자원이 업데이트된다.

    AWS CloudFormation


    https://aws.amazon.com/jp/cloudformation/
    클라우드 포메이션은 지난해 미디어 서버 구축에서도 일부 활용됐는데, IaC AWS 리소스만 생각한다면 적합한 도구다.
    그러나 기존 자원을 가져올 때 자원에 맞는 템플릿 파일을 미리 준비해야 하기 때문에 기존 자원의 인코딩에 어려움을 느낀다.

    AWS CDK


    https://aws.amazon.com/jp/cdk/
    AWS CDK는 프로그래밍 언어를 사용하여 AWS 리소스를 구성합니다.
    2022년 1월에는 현재 다음 프로그래밍 언어가 지원된다.
  • JavaScript
  • TypeScript
  • Python
  • Java
  • C#
  • Go(preview)
  • 다만 팀에 대응하는 언어를 사용하는 구성원이 적고 나 자신도 프로그래밍을 잘하지 못해 AWS CDK를 이용한 IaC를 포기했다.
    또 AWS CDK는 기존 리소스를 가져오는 기능이 없어 OSS의former2를 사용하면 가능하지만, L1 Consutruct처럼 추상도가 낮은 코드가 생성돼 CDK의 은혜를 받아들이기 어렵다는 느낌을 받았다.[1]
    (그리고 생성된 코드가 한 시스템에서 직접 실행cdk 명령에 실패했지만, 파이톤에 대해 잘 모르는 나도 이유를 모르는 경우가 있다)
    AWS CDK는 또 아래의 일본어 세미나도 준비했는데 아주 적은 기술만으로 AWS 자원을 간단하게 구축할 수 있어서 감동적이어서 후술한 CDK for Terraform으로 다시 도전해보고 싶다.
    https://catalog.us-east-1.prod.workshops.aws/v2/workshops/99731164-1d19-4d2e-9319-727a130e2d57/ja-JP/

    Terraform


    https://www.terraform.io/
    나는 최종적으로Terraform을 사용하여 IaC화를 실현하는 것이 현재의 팀에 가장 적합하다고 생각한다.import 하위 명령을 사용하여 기존 리소스를 가져올 수 있습니다.
    그러나 import 명령은 EC2, VPC, RDS 등 여러 자원을 통일적으로 가져올 수 없기 때문에 목표 자원의 수량이 많으면 매우 힘든 문제가 존재한다.
    따라서 terraformer라는 OSS를 사용하여 기존 리소스를 가져옵니다.
    https://github.com/GoogleCloudPlatform/terraformer
    또한 제 개인적인 소감은 클라우드 포메이션의 템플릿 파일 형식인 YAML 형식보다 테라폼이 독자적인 HCL 형식으로 쓴 테라폼 파일을 쉽게 읽을 수 있다는 것입니다.
    향후 운용의 확장성도 GiitHub Actions와 Terraform을 활용한 CI/CD 환경 기반 구축이 가능하고, 이는 예전에 제가 쓴 기사에서도 검증된 것이기 때문에 기대가 된다고 생각합니다.
    https://zenn.dev/yuta28/articles/terraform-gha
    또 하나의 흥미로운 기능은 CDK for Terraform이라는 CDK를 사용하여Terraform을 실행할 수 있다는 것이다.
    https://www.terraform.io/cdktf
    베타 버전이라 본격적으로 활용하기는 어려울 것 같은데, 이게 GA가 되면 테라form에서 AWS CDK로의 이전도 쉬워지겠죠.

    홀린 곳


    다만 그래도 기존 자원에 푹 빠진 부분이 있기 때문에 그 부분을 소개해 드리겠습니다.

    Terraform과 terraformer의 버전 차이


    $ terraform --version
    Terraform v1.1.3
    on linux_amd64
    $ cat terraform.tfstate | jq -r '. | { terroform_version: .terraform_version }'
    {
      "terroform_version": "0.12.31"
    }
    
    Terraform은 인프라 자원 구성 정보.tfstate를 저장하는 파일을 바탕으로 인프라 자원 IaC화를 하지만 terraformer를 통해 기존 자원을 가져올 때 생성된.tfstate 파일은 버전 0.12의 옛 파일을 생성한다.
    이렇게 실행terraform init해도 버전 충돌로 인한 오류가 발생하여 Terraform을 실행할 수 없습니다.
    $ terraform init
    
    Initializing the backend...
    ╷
    │ Error: Invalid legacy provider address
    │
    │ This configuration or its associated state refers to the unqualified provider "aws".
    │
    │ You must complete the Terraform 0.13 upgrade process before upgrading to later versions.
    
    해결 방법은Terraform의 버전 관리 도구tfenv를 통해 터미널의Terraform 버전을 0.12시스템으로 변경하거나terraformer의 tfstate 파일 버전을 업그레이드하는 방법이 있다.
    나는 tfstate 파일의 Terraform 버전을 시스템으로 바꾸는 것을 선택했다.
    자세한 절차는 네트워크 에이전트의 Tec 블로그를 참조하십시오↓
    https://developers.cyberagent.co.jp/blog/archives/33331/

    시작할 수 없는 AWS 리소스


    terraformer이지만 모든 AWS 자원을 가져올 수 있는 것이 아니라 terraformer import aws list 목록의 자원만 가져올 수 있습니다.
    $ terraformer import aws list
    accessanalyzer
    acm
    alb
    api_gateway
    appsync
    auto_scaling
    batch
    budgets
    cloud9
    cloudformation
    cloudfront
    cloudhsm
    cloudtrail
    cloudwatch
    codebuild
    codecommit
    codedeploy
    codepipeline
    cognito
    config
    customer_gateway
    datapipeline
    devicefarm
    docdb
    dynamodb
    ebs             #EBSについて注目
    ec2_instance
    ecr
    ecrpublic
    ecs
    efs
    eip
    eks
    elastic_beanstalk
    elasticache
    elb
    emr
    eni
    es
    firehose
    glue
    iam
    igw
    iot
    kinesis
    kms
    lambda
    logs
    media_package
    media_store
    msk
    nacl
    nat
    opsworks
    organization
    qldb
    rds
    resourcegroups
    route53
    route_table
    s3
    secretsmanager
    securityhub
    servicecatalog
    ses
    sfn
    sg
    sns
    sqs
    ssm
    subnet
    swf
    transit_gateway
    vpc
    vpc_peering
    vpn_connection
    vpn_gateway
    waf
    waf_regional
    workspaces
    xray
    
    모든 AWS 자원은 지원되지 않는다고 하지만 주요 AWS 자원은 이미 갖추어져 있어 이번 상황은 문제없다고 생각합니다.
    하지만 EBS가 목록에 있어도 가져올 수 없는 이유는 무엇입니까?
    $ terraformer import aws -r ebs
    2022/01/16 14:25:57 aws importing default region
    2022/01/16 14:25:59 aws importing... ebs
    2022/01/16 14:25:59 aws done importing ebs
    2022/01/16 14:25:59 Number of resources for service ebs: 0 #インポートされず
    2022/01/16 14:25:59 aws Connecting....
    2022/01/16 14:25:59 aws save ebs
    2022/01/16 14:25:59 aws save tfstate for ebs
    
    JAWS-UG의 LT에서는 EBS가 포함된 상태에서 다른 AWS 자원을 가져오려다 패닉 오류가 발생했지만, 2022/16에서 재실행되면 패닉 오류가 발생하지 않는다.
    다만 EBS를 변함없이 가져오지는 못했다.

    나도 매니저와 상의해 봤는데 현재 EBS에 대해 직접 손으로 tf 파일을 써서 인코딩할 계획이다.

    감상


    우리는 기존의 자원을 IaC화하는 것이 생각보다 어렵다는 것을 발견했다.
    AWS는 아직 기존 자원을 간단하게 가져올 수 있는 도구를 제공하지 않기 때문에 기존 자원의 난이도는 처음부터 인코딩하는 것보다 어렵다.
    올해 상반기 주요 서비스 부분은 테라form 코드 관리, 하반기에는 전체 자원 IaC화를 통해 팀 내 IaC 운영 확대를 목표로 올해 1년간 노력할 예정이다.

    LT 자료


    LT 슬라이드 자료입니다.

    영어 뉴스


    나는 영어로 번역했다.

    참고 문헌


    https://beyondjapan.com/blog/2020/05/terraform-resource-import/
    https://beyondjapan.com/blog/2020/05/terraformer-import-existing-infrastructure/
    각주
    https://dev.classmethod.jp/articles/aws-cdk-layer/ ↩︎

    좋은 웹페이지 즐겨찾기