웹 서버와 데이터베이스 인스턴스 연결

Chori·2025년 2월 11일
0
post-thumbnail

스스로 구축하는 AWS 클라우드 인프라 - 기본편을 수강하며 AWS 인프라를 Terraform으로 작성한 내용입니다.


DB 정보 작성

  • 웹 서버에서 DB에 접근할 수 있도록 dbinfo.inc 파일 필요
  • template_file.tf 파일을 만들고 아래와 같이 작성하여 Terraform이 dbinfo.inc 파일을 생성하도록 함
data "template_file" "dbinfo" {
  template = <<-EOT
  <?php
  define('DB_SERVER', '${aws_db_instance.rds.address}');
  define('DB_USERNAME', '${aws_db_instance.rds.username}');
  define('DB_PASSWORD', '${aws_db_instance.rds.password}');
  define('DB_DATABASE', '${aws_db_instance.rds.db_name}');
  ?>
  EOT
}

resource "local_file" "dbinfo_file" {
  content  = data.template_file.dbinfo.rendered
  filename = "${path.module}/dbinfo.inc"
}
  • dbinfo.inc 파일이 Private EC2에 저장되도록 terraform_data.tf 파일과 ami_from_instance.tf 파일을 아래와 같이 수정
resource "terraform_data" "copy_php" {
  depends_on = [aws_instance.public_ec2, local_file.dbinfo_file]

  count = length(var.availability_zones)

  connection {
    type        = "ssh"
    user        = "ec2-user"
    host        = element(aws_eip.public_ec2.*.public_ip, count.index)
    private_key = tls_private_key.ec2_private_key.*.private_key_pem[0]
  }

  provisioner "remote-exec" {
    inline = [
      "while [ ! -d /var/www/html ]; do sleep 5; done",
      "echo '/var/www/html is ready'",
      "sudo chown -R ec2-user:apache /var/www/html",
      "sudo chmod -R 775 /var/www/html"
    ]
  }

  provisioner "file" {
    source      = "${path.module}/index.php"
    destination = "/var/www/html/index.php"
  }

  provisioner "file" {
    source      = "${path.module}/dbinfo.inc"
    destination = "/var/www/html/dbinfo.inc"
  }
}

resource "terraform_data" "delete_dbinfo_file" {
  depends_on = [aws_ami_from_instance.public_ec2_ami]
  provisioner "local-exec" {
    command = "rm -f ${path.module}/dbinfo.inc"
  }
}

resource "terraform_data" "copy_key" {
  depends_on = [local_file.private_ec2_key, aws_ami_from_instance.public_ec2_ami]

  count = length(var.availability_zones)

  connection {
    type        = "ssh"
    user        = "ec2-user"
    host        = element(aws_eip.public_ec2.*.public_ip, count.index)
    private_key = tls_private_key.ec2_private_key.*.private_key_pem[0]
  }

  provisioner "remote-exec" {
    inline = [
      "mkdir /home/ec2-user/keys"
    ]
  }

  provisioner "file" {
    source      = "${path.module}/${local_file.private_ec2_key.filename}"
    destination = "/home/ec2-user/keys/${local_file.private_ec2_key.filename}"
  }

  provisioner "remote-exec" {
    inline = [
      "chmod 600 /home/ec2-user/keys/${local_file.private_ec2_key.filename}"
    ]
  }
}
resource "aws_ami_from_instance" "public_ec2_ami" {
  depends_on = [terraform_data.copy_php]

  name                    = "public-ec2-ami"
  source_instance_id      = aws_instance.public_ec2.*.id[0]
  snapshot_without_reboot = false
}

MySQL 접속

  • Private EC2에서 MySQL에 접속하기 위해 아래 명령어 입력
mysql -h <RDS Endpoint> -P 3306 -u admin -p
  • MySQL에 접속 후 데이터베이스 목록을 보려면 아래 명령어 입력
show databases;
  • 특정 데이터베이스를 사용하려면 아래 명령어 입력
use <DatabaseToUse>;
  • 데이터베이스에 SAMPLE 테이블 생성
CREATE TABLE SAMPLE (
ID INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(45),
ADDRESS VARCHAR(90)
);
  • 테이블에 데이터 추가
INSERT INTO SAMPLE (NAME, ADDRESS) VALUES ('KIM', 'SEOUL');
  • 테이블에 추가된 데이터 확인
SELECT * FROM SAMPLE;
profile
전부인 것처럼, 전부가 아닌 것처럼

0개의 댓글