만약 아마존 웹 서비스 (AWS)를 관리하고 작업할 계획이라면, Terraform을 사용하여 AWS 프로바이더를 사용하는 것이 필수입니다. 이것은 여러분이 아마존 S3, 탄력적 Beanstalk, Lambda 등 AWS에서 지원하는 많은 리소스와 상호 작용할 수 있도록 해줍니다.
이 궁극적인 가이드에서는, AWS 프로바이더에 대해 알아야 할 거의 모든 것과 이 프로바이더를 Terraform과 함께 사용하여 Amazon 인프라를 관리하는 방법을 단계별로 배우게 될 것입니다.
시작해 봅시다!
전제 조건
다음 자습서를 따라가려면 다음 사항이 준비되어 있는지 확인하세요:
- Amazon Web Service 계정 (AWS).
- 로컬 머신에 설정된 액세스 키 ID 및 비밀 키 를 갖춘 IAM 사용자.
- Terraform v0.14.9 – 이 자습서의 데모는 Ubuntu 18.04.5 LTS에서 진행되었지만 다른 운영 체제에서도 Terraform이 작동합니다.
- A code editor – Even though you can use any text editor to work with Terraform configuration files, you should have one that understands the HCL Terraform language. Try out Visual Studio (VS) Code.
Terraform AWS 프로바이더가 무엇인지요?
Terraform는 AWS, Google Cloud Platform (GCP) 및 Oracle과 같은 클라우드 제공업체와 상호 작용하기 위해 플러그인에 의존합니다. AWS 제공업체 중 가장 널리 사용되는 것 중 하나입니다. 이 제공업체는 Amazon S3, Elastic Beanstalk, Lambda 등 AWS에서 지원하는 많은 리소스와 상호 작용합니다.
Terraform은 올바른 자격 증명으로 AWS 제공업체를 사용하여 Amazon과 연결하여 수십 개의 AWS 서비스를 관리하거나 배포/업데이트합니다.
AWS 제공업체는 Terraform 구성 파일 내에서 선언되며 버전, 엔드포인트 URL 또는 클라우드 리전 등과 같은 다양한 매개변수를 포함합니다.
AWS 제공업체 선언하기
제공 업체 이름을 참조해야 할 때 로컬 이름을 정의해야 합니다. 로컬 이름은 required_providers
블록 내에서 할당된 제공 업체 이름입니다. 제공 업체를 필요로 할 때 로컬 이름을 할당하고 모듈당 고유해야 합니다.
required_providers
를 선언할 때 Terraform 0.13 이상 버전에서도 source
매개 변수를 선언해야 합니다. source
매개 변수는 Terraform이 플러그인을 다운로드할 수 있는 소스 주소를 설정합니다.
소스 주소는 다음과 같은 세 부분으로 구성됩니다.
- 호스트 이름 – 제공 업체를 배포하는 Terraform 레지스트리의 호스트 이름입니다. 기본 호스트 이름은 registry.terraform.io입니다.
- 네임스페이스 – 지정된 레지스트리 내의 조직적 네임스페이스입니다.
- 유형 – 유형은 제공 업체가 관리하는 플랫폼 또는 시스템에 대한 짧은 이름이며 고유해야 합니다.
아래에서는 소스 주소의 선언 구문을 볼 수 있으며 소스 주소의 세 부분은 슬래시 (/
)로 구분됩니다.
Terraform 구성은 아래와 같이 필요한 공급자 이름(aws
)을 선언하며, 소스 주소, AWS 공급자 버전을 함께 선언하고 공급자 영역을 구성합니다.
AWS 계정을 하드코딩된 자격 증명으로 인증하는 방법
AWS 공급자를 선언하는 방법에 대한 기본적인 이해를 얻었으므로 이제 AWS 계정을 인증하는 방법을 살펴봅시다.
당신은 몇 가지 다른 방법으로 AWS 공급자를 인증할 수 있습니다. 예를 들어 환경 변수를 선언하거나 이름이 지정된 프로파일에 자격 증명을 저장하는 것입니다. 그러나 AWS 계정에 인증하는 가장 빠른 방법은 자격 증명을 AWS 공급자 내에서 하드 코딩하는 것입니다.
비록 하드 코딩된 자격 증명은 누출의 위험이 있기 때문에 권장되지 않지만, 여전히 Terraform 구성에서 하드 코딩된 자격 증명을 선언하여 빠르게 AWS 리소스를 테스트할 수 있습니다. 하지만 계속 읽어 나가면 환경 변수를 선언하여 AWS 계정을 더 안전하게 인증하는 더 나은 방법을 배울 것입니다.
아래 구성은 로컬 이름(aws
)과 공급자 지역(us-east-2
)을 선언합니다. AWS 공급자 블록에서는 또한 AWS 계정을 인증하기 위해 액세스 키와 비밀 키를 선언합니다.
환경 변수로 자격 증명 보호하기
여러분은 방금 Terraform을 사용하여 AWS 클라우드 서비스를 정적으로 인증하는 방법을 배웠습니다. 그러나 하드 코딩은 안전하지 않으며 코드를 빠르게 테스트하는 테스트 환경에서만 권장됩니다.
이외에도 자격 증명을 안전하게 보호하는 다른 방법이 있을까요? 네, 환경 변수로 선언하여 보안을 유지할 수 있습니다. 선언할 수 있는 환경 변수의 수에 제한이 없습니다. 환경 변수는 값이 Terraform 구성 파일 외부에서 설정되는 변수로, 이름/값 쌍으로 구성됩니다.
아래의 export
명령어 시리즈를 실행하여 각 환경 변수를 내보냅니다. 환경 변수를 내보내면 프로그램 전체 또는 Terraform이 실행될 때까지 이용 가능합니다.
이름이 지정된 프로파일에 여러 자격 증명 저장
자격 증명을 하드 코딩하거나 환경 변수로 선언하는 두 가지 방법 모두 AWS 계정을 한 번에 인증하는 데 사용됩니다. 그러나 필요할 때 여러 자격 증명을 저장하고 사용해야 하는 경우는 어떨까요? 이름이 지정된 프로필에 자격 증명을 저장하는 것이 이상적입니다.
아래 코드는 액세스 키와 시크릿 키를 포함하는 Myprofile
이라는 이름이 지정된 프로필을 생성합니다.
이름이 지정된 프로필의 기본 위치는 Linux 및 macOS의 $HOME/.aws/credentials/Myprofile 또는 Windows의 %USERPROFILE%\.aws\credentials\Myprofile입니다. 실제 프로필 이름으로 Myprofile을 대체하십시오.
~/.aws/credentials에서 명명된 프로필을 생성한 후에는 profile
속성을 사용하여 Terraform 구성에서 해당 프로필을 참조할 수 있습니다. 아래에서는 Myprofile
이라는 명명된 프로필을 참조하고 있습니다.
AWS 프로바이더에서 Assume Role을 선언합니다.
Terraform을 실행하기 전에 하드코딩된 자격 증명을 선언하여 방금 AWS 프로바이더를 구성하는 방법을 배웠습니다. 그러나 실행 중에 자격 증명을 선언하려면 AssumeRole API가 필요합니다. AssumeRole은 액세스 키 ID, 비밀 액세스 키 및 보안 토큰을 포함하는 일시적인 자격 증명을 제공합니다. 이러한 자격 증명을 사용하여 AWS에 연결할 수 있습니다.
아래 코드는 aws
라는 provider
및 역할 이름 및 세션 이름이 포함된 assume_role
을 선언합니다. AssumeRole 액세스를 구성하려면 특권 및 누가 그것을 가정할 수 있는지를 지정하는 IAM 역할을 정의해야 합니다.
여러 AWS 공급자 선언하기
지금까지 테라폼에서 단일 지역과 작동하는 AWS 공급자를 선언하고 구성하는 방법을 배웠습니다. 그러나 여러 클라우드 지역에서 인프라 또는 AWS 서비스를 관리해야 하는 경우 어떻게 해야 할까요? 이 경우, 키워드 alias
를 선언해야 합니다.
별칭은 동일한 공급자에 대한 여러 구성을 정의하고 리소스 또는 모듈별로 사용할 것인지 또는 여러 지역을 지원할 것인지를 선택할 수 있습니다.
아래 코드는 기본 AWS 공급자인 aws
를 선언하고 region
을 us-east-2
로 설정합니다. 그런 다음 동일한 이름을 가진 추가 AWS 공급자를 선언하고 alias
를 west
로 설정하고 region
을 us-west-2
로 설정합니다.
alias
를 선언하면, 기본적으로 us-east-2
지역 또는 프로바이더 aws.west
를 선택한 경우 us-west-2
지역에 리소스를 생성할 수 있습니다.
AWS 프로바이더의 엔드포인트 구성 맞춤 설정
엔드포인트 구성을 맞춤 설정하는 것은 AWS Snowball과 같은 기본이 아닌 AWS 서비스 엔드포인트에 연결하거나 로컬 테스트를 수행할 때 편리합니다.
Terraform AWS Provider을 사용자 정의 엔드포인트로 구성하십시오. 아래에 표시된 대로, 제공자 블록 내에서 endpoints
구성 블록을 선언함으로써 이를 수행할 수 있습니다.
아래 구성은 AWS S3 서비스에 로컬 포트 4572
로 액세스하면 AWS 계정에서 AWS S3 서비스에 실제로 액세스하는 것과 동일하게 작동합니다. 마찬가지로, 이 구성을 사용하여 로컬에서 dynamodb
에 포트 4569
로 액세스할 수 있습니다. DynamoDB는 빠른 성능과 매끄러운 확장성을 제공하는 NoSQL 데이터베이스 서비스입니다.
Terraform AWS Provider가 허용하는 사용자 정의 엔드포인트 목록을 확인하십시오.
태그 추가
이전에 AWS 제공자가 리전, 소스 위치 등과 같은 구성으로 선언되는 방법을 배웠습니다. 하지만 리소스를 더 잘 관리하기 위해 제공자 수준에서 태그를 추가해야 합니다.
태그는 사용자 정의 키와 값으로 구성된 레이블입니다. 태그는 AWS 계정에서 청구, 소유권, 자동화, 액세스 제어 등 다양한 용도에서 사용될 때 편리합니다.
개별 리소스에 태그를 추가하는 대신, 공급자 수준에서 모든 리소스에 태그를 추가하는 방법을 배워보겠습니다. 이렇게 하면 많은 코드와 시간을 절약할 수 있습니다.
아래 코드는 default_tags
안에 정의된 태그로 AWS 공급자를 구성합니다. 공급자 내에 태그를 추가하는 장점은 이 공급자로 리소스를 생성할 때 지정된 태그가 자동으로 추가된다는 것입니다.
태그 무시하기
공급자 수준에서 태그를 사용하면 환경 전체에 태그를 적용할 수 있습니다. 그러나 때로는 EC2 인스턴스에 기본 태그를 추가하지 않고 AWS 계정의 나머지 리소스에만 적용하려는 경우가 있습니다. 확인해보겠습니다!
아래 코드는 공급자 내에서 ignore_tags를 정의한 AWS 공급자를 구성합니다. ignore 태그를 사용하는 장점은 특정 리소스에 기본 태그를 추가하지 않고 나머지 리소스에만 적용하려는 경우입니다.
아래 코드에서 aws
제공자를 사용하여 리소스를 생성할 때, 모든 리소스가 LastScanned
및 kubernetes.io
태그를 무시합니다.
AWS S3 버킷 생성
지금까지 AWS 제공자를 선언하고 구성하는 방법에 대해 상세히 배웠습니다. 그러나 AWS 제공자를 선언하는 것만으로는 아무것도 하지 않습니다. AWS S3 버킷을 프로비저닝하거나 Ec2 인스턴스를 삭제하는 등의 AWS 리소스를 관리해야 합니다. 그래서 AWS S3 버킷을 만드는 방법을 배워보겠습니다!
1. ~/terraform-s3-demo이라는 폴더를 만들고, 작업 디렉토리를 해당 폴더로 변경합니다. ~/terraform-s3-demo 폴더에는 Terraform이 생성할 구성 파일 및 모든 관련 파일이 포함됩니다.
2. 좋아하는 코드 편집기에서 아래 구성을 복사하여 main.tf로 저장합니다. 저장 위치는 ~/terraform-s3-demo 폴더입니다.
main.tf 파일은 몇 가지 필수 리소스를 생성합니다:
- 제공자 요구사항: 제공자 요구사항은 로컬 이름, 소스 위치 및 버전 제약 조건으로 구성됩니다.
- 암호화 키: Amazon S3 암호화 키는 S3 버킷을 도와 새로운 모든 객체가 버킷에 저장될 때 암호화되도록 합니다. 암호화 키는 Terraform에서
aws_kms_key
를 사용하여 생성됩니다. - AWS 프로바이더 구성: 프로바이더 이름(
aws
)과 지역us-east-2
을 선언합니다. - Bucket: 이 Terraform 모듈은
terraformdemobucket
이라는 버킷을 생성합니다. 이 버킷은force_destroy
플래그를 포함하고 있어 Terraform이 이를 파괴하지 못합니다.
버전 관리: Amazon S3에서의 버전 관리는 동일한 버킷 내에서 객체의 여러 버전을 유지하는 것을 의미합니다.
3. 이제 아래 명령어를 실행하여 ~\\terraform-s3-demo
디렉토리로 이동하고 Terraform을 초기화하세요. Terraform은 리소스와 작업하기 위해 필요한 플러그인과 프로바이더를 초기화합니다.
Terraform은 일반적으로 순차적으로 세 단계 명령어를 사용합니다: terraform init, terraform plan, 그리고 terraform apply.
AWS EC2 인스턴스 및 IAM 사용자 생성
이전 섹션에서 Terraform과 AWS Provider를 사용하여 AWS S3 버킷 하나를 생성하는 방법을 배웠습니다. 하지만 실제로 Terraform을 사용하여 동일한 종류의 여러 개체를 생성할 수 있습니다.
1. ~/terraform-ec2-iam-demo이라는 폴더를 만들고 그 안으로 이동하세요
2. 좋아하는 코드 편집기를 열고 아래 구성을 복사하여 main.tf 파일로 저장하고 ~/terraform-ec2-iam-demo 디렉토리에 저장하세요.
아래 코드는 두 개의 EC2 인스턴스 ec21a
와 ec21a
를 만들고 t2.micro
및 t2.medium
인스턴스 유형을 생성한 다음 네 가지 다른 이름의 IAM 사용자를 생성합니다. 코드에서 선언된 ami
는 인스턴스를 시작하는 데 필요한 정보를 제공하는 Amazon Machine Image (AMI)입니다. 운영 체제의 유형, 설치할 소프트웨어 등과 같은 정보를 제공합니다.
Amazon EC2 콘솔을 사용하여 Linux AMI를 찾을 수 있습니다.
3. 그 다음, 다른 파일을 생성하고 아래 코드를 복사하여 vars.tf로 저장하십시오. 이 파일은 ~/terraform-ec2-iam-demo 디렉토리에 있어야 합니다.
아래 코드는 main.tf 파일에서 참조되는 모든 변수를 선언합니다. Terraform 코드를 실행한 후에는 변수 tag_ec2
가 ec21a
및 ec21b
값으로 설정되어 main.tf 파일에 정의된 두 개의 EC2 인스턴스에 할당됩니다.
4. output.tf라는 또 다른 Terraform 구성 파일을 ~/terraform-ec2-iam-demo 디렉토리에 생성한 다음, 아래 코드를 output.tf 파일에 복사하여 붙여 넣으십시오.
terraform apply 명령을 성공적으로 실행한 후에는 해당 명령의 출력 끝에 ${aws_instance.my-machine.*.id}
및 ${aws_iam_user.accounts.*.name}
의 값이 표시됩니다.
아래 코드는 Terraform에게 main.tf 구성 파일에서 정의된 aws_instance
및 aws_iam_user
리소스를 참조하도록 지시합니다.
5. ~/terraform-ec2-iam-demo 디렉토리에 더 많은 구성 파일을 만들어 provider.tf라고하며 아래 코드를 provider.tf 파일에 붙여 넣으십시오. 아래 provider.tf는 이전 단계에서 정의한 모든 AWS 리소스와 상호 작용하는 방법을 Terraform에 알려주는 Terraform AWS 프로바이더를 정의합니다.
6. 이제 ~/terraform-ec2-iam-demo 폴더에 모든 필요한 파일이 포함되어 있는지 확인하려면 tree
명령을 실행하십시오.

7. 순차적으로 아래 명령을 실행하여 Terraform을 초기화하고 AWS EC2 인스턴스 및 IAM 사용자를 생성하십시오.

마지막으로 AWS 관리 콘솔로 이동한 다음 AWS EC2 서비스 및 IAM 콘솔로 이동하십시오.
다음 스크린 샷에서 EC2 인스턴스 및 IAM 사용자가 존재하는지 확인할 수 있습니다.


결론
이 궁극적인 가이드로 AWS 프로바이더를 사용하여 AWS 서비스를 선언하고 실행하는 지식을 습득했습니다. 또한 AWS 프로바이더가 여러 가지 방법으로 안전하게 자격 증명을 선언할 수 있도록 합니다.
이제 AWS 프로바이더와 Terraform을 사용하여 관리하고 싶은 AWS 서비스가 무엇인가요?