diff --git a/.github/workflows/terraform-apply.yml b/.github/workflows/terraform-apply.yml index 2087f98..c1026b3 100644 --- a/.github/workflows/terraform-apply.yml +++ b/.github/workflows/terraform-apply.yml @@ -135,7 +135,7 @@ jobs: sudo dpkg -i /tmp/session-manager-plugin.deb echo "/usr/local/sessionmanagerplugin/bin" >> $GITHUB_PATH /usr/local/sessionmanagerplugin/bin/session-manager-plugin --version - - name: Start SSM Tunnel to RDS + - name: Start SSM Tunnel to DB EC2 run: | echo "=== session-manager-plugin 진단 ===" which session-manager-plugin || echo "NOT IN PATH" @@ -147,25 +147,26 @@ jobs: --query 'Reservations[0].Instances[0].InstanceId' \ --output text) - RDS_HOST=$(aws rds describe-db-instances \ - --query 'DBInstances[?contains(DBInstanceIdentifier, `prod`)].Endpoint.Address | [0]' \ + DB_EC2_HOST=$(aws ec2 describe-instances \ + --filters "Name=tag:Name,Values=solid-connection-db-mysql-prod" "Name=instance-state-name,Values=running" \ + --query 'Reservations[0].Instances[0].PrivateIpAddress' \ --output text) if [ -z "$EC2_ID" ] || [ "$EC2_ID" = "None" ]; then echo "::error::prod EC2 인스턴스를 찾을 수 없습니다" exit 1 fi - if [ -z "$RDS_HOST" ] || [ "$RDS_HOST" = "None" ]; then - echo "::error::prod RDS 엔드포인트를 찾을 수 없습니다" + if [ -z "$DB_EC2_HOST" ] || [ "$DB_EC2_HOST" = "None" ]; then + echo "::error::prod DB EC2 private IP를 찾을 수 없습니다" exit 1 fi - echo "Tunneling via $EC2_ID -> $RDS_HOST:3306" + echo "Tunneling via $EC2_ID -> $DB_EC2_HOST:3306" aws ssm start-session \ --target "$EC2_ID" \ --document-name AWS-StartPortForwardingSessionToRemoteHost \ - --parameters "{\"host\":[\"$RDS_HOST\"],\"portNumber\":[\"3306\"],\"localPortNumber\":[\"3306\"]}" & + --parameters "{\"host\":[\"$DB_EC2_HOST\"],\"portNumber\":[\"3306\"],\"localPortNumber\":[\"3306\"]}" & SSM_PID=$! echo "SSM_PID=$SSM_PID" >> $GITHUB_ENV diff --git a/.github/workflows/terraform-plan.yml b/.github/workflows/terraform-plan.yml index af5b416..40a2a7a 100644 --- a/.github/workflows/terraform-plan.yml +++ b/.github/workflows/terraform-plan.yml @@ -202,7 +202,7 @@ jobs: # 이후 모든 스텝의 PATH 맨 앞에 신규 설치 경로 추가 echo "/usr/local/sessionmanagerplugin/bin" >> $GITHUB_PATH /usr/local/sessionmanagerplugin/bin/session-manager-plugin --version - - name: Start SSM Tunnel to RDS + - name: Start SSM Tunnel to DB EC2 run: | echo "=== session-manager-plugin 진단 ===" which session-manager-plugin || echo "NOT IN PATH" @@ -214,25 +214,26 @@ jobs: --query 'Reservations[0].Instances[0].InstanceId' \ --output text) - RDS_HOST=$(aws rds describe-db-instances \ - --query 'DBInstances[?contains(DBInstanceIdentifier, `prod`)].Endpoint.Address | [0]' \ + DB_EC2_HOST=$(aws ec2 describe-instances \ + --filters "Name=tag:Name,Values=solid-connection-db-mysql-prod" "Name=instance-state-name,Values=running" \ + --query 'Reservations[0].Instances[0].PrivateIpAddress' \ --output text) if [ -z "$EC2_ID" ] || [ "$EC2_ID" = "None" ]; then echo "::error::prod EC2 인스턴스를 찾을 수 없습니다" exit 1 fi - if [ -z "$RDS_HOST" ] || [ "$RDS_HOST" = "None" ]; then - echo "::error::prod RDS 엔드포인트를 찾을 수 없습니다" + if [ -z "$DB_EC2_HOST" ] || [ "$DB_EC2_HOST" = "None" ]; then + echo "::error::prod DB EC2 private IP를 찾을 수 없습니다" exit 1 fi - echo "Tunneling via $EC2_ID -> $RDS_HOST:3306" + echo "Tunneling via $EC2_ID -> $DB_EC2_HOST:3306" aws ssm start-session \ --target "$EC2_ID" \ --document-name AWS-StartPortForwardingSessionToRemoteHost \ - --parameters "{\"host\":[\"$RDS_HOST\"],\"portNumber\":[\"3306\"],\"localPortNumber\":[\"3306\"]}" & + --parameters "{\"host\":[\"$DB_EC2_HOST\"],\"portNumber\":[\"3306\"],\"localPortNumber\":[\"3306\"]}" & SSM_PID=$! echo "SSM_PID=$SSM_PID" >> $GITHUB_ENV @@ -433,4 +434,3 @@ jobs: - name: Plan Status Check if: steps.plan.outputs.exitcode == '1' run: exit 1 - diff --git a/modules/app_stack/db_ec2.tf b/modules/app_stack/db_ec2.tf index deed39f..00202e2 100644 --- a/modules/app_stack/db_ec2.tf +++ b/modules/app_stack/db_ec2.tf @@ -69,11 +69,14 @@ resource "aws_instance" "db_server" { Name = "solid-connection-db-mysql-${var.env_name}" } - user_data_replace_on_change = true + user_data_replace_on_change = false lifecycle { ignore_changes = [ key_name, + user_data, + user_data_base64, + user_data_replace_on_change, ] } } diff --git a/modules/app_stack/rds.tf b/modules/app_stack/rds.tf index 9cda261..c9ed1d1 100644 --- a/modules/app_stack/rds.tf +++ b/modules/app_stack/rds.tf @@ -24,18 +24,21 @@ resource "aws_db_instance" "default" { # 6. MySQL 추가 유저 생성 resource "mysql_user" "users" { - for_each = var.enable_rds ? var.additional_db_users : {} + for_each = var.enable_rds || var.enable_db_ec2 ? var.additional_db_users : {} user = each.key host = "%" plaintext_password = each.value.password - depends_on = [aws_db_instance.default] + depends_on = [ + aws_db_instance.default, + aws_instance.db_server, + ] } # 7. MySQL 권한 부여 resource "mysql_grant" "user_grants" { - for_each = var.enable_rds ? var.additional_db_users : {} + for_each = var.enable_rds || var.enable_db_ec2 ? var.additional_db_users : {} user = each.key host = "%"