GitHub Actions中Liquibase连接RDS Postgres端口转发失败排查
GitHub Actions中通过堡垒机连接RDS执行Liquibase Update的问题与解决
问题背景
需要在GitHub Workflow中执行Liquibase Update操作,目标数据库是位于AWS私有子网内的RDS Postgres实例,必须通过堡垒机才能从外部访问,本地使用Putty可正常连接该数据库。
最初的Workflow配置
最初的Job包含两个独立步骤:
- name: Set up port forwarding run: | mkdir -p ~/.ssh/ echo "$(aws ssm get-parameter --name ${{ env.BASTION_KEY_SSM_PARAMETER_NAME }} --output text --query 'Parameter.Value')" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa echo "$(ssh-keyscan -p 22 ${{ env.BASTION_FQDN }})" >> ~/.ssh/known_hosts ssh -fN -v -L 15432:${{ env.DATABASE_ENDPOINT }} ubuntu@${{ env.BASTION_FQDN }} - uses: liquibase-github-actions/update@v4.23.1 with: changelogFile: "./liquibase/changelog.xml" url: "jdbc:postgresql://127.0.0.1:15432/mydatabase" username: ${{ env.DATABASE_USER }} password: ${{ env.DATABASE_USER_PASSWORD }} logLevel: FINE
问题现象
第一步日志显示已成功建立端口转发,将本地15432端口映射到RDS实例地址并正常监听;添加测试步骤后确认SSH进程确实在监听该端口。但第二步执行Liquibase官方Action时,始终报错无法连接127.0.0.1:15432。经进一步验证,SSH隧道本身功能正常,问题根源是Liquibase Action无法访问该隧道。
解决方案
将端口转发、Liquibase安装与命令执行合并到同一个步骤中,直接使用Liquibase CLI调用update命令,最终成功完成数据库更新。完整可用代码如下:
- name: Run Liquibase run: | password=$(aws secretsmanager get-secret-value --secret-id ${{ env.TF_DATABASE_USER_SECRET }} --output text --query 'SecretString' | jq -r '.password') echo "::add-mask::$password" mkdir -p ~/.ssh/ echo "$(aws ssm get-parameter --name ${{ env.TF_BASTION_KEY_SSM_PARAMETER_NAME }} --output text --query 'Parameter.Value')" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa echo "$(ssh-keyscan -p 22 ${{ env.TF_BASTION_FQDN }})" >> ~/.ssh/known_hosts ssh -fN -L 15432:${{ env.TF_DATABASE_ENDPOINT }} ubuntu@${{ env.TF_BASTION_FQDN }} wget -O- https://repo.liquibase.com/liquibase.asc | gpg --dearmor > liquibase-keyring.gpg && \ cat liquibase-keyring.gpg | sudo tee /usr/share/keyrings/liquibase-keyring.gpg > /dev/null && \ echo 'deb [arch=amd64 signed-by=/usr/share/keyrings/liquibase-keyring.gpg] https://repo.liquibase.com stable main' | sudo tee /etc/apt/sources.list.d/liquibase.list sudo apt-get update sudo apt-get install liquibase export LIQUIBASE_COMMAND_CHANGELOG_FILE=".\liquibase\changelog.xml" export LIQUIBASE_COMMAND_URL=jdbc:postgresql://localhost:15432/mydatabase export LIQUIBASE_COMMAND_USERNAME=${{ env.TF_DATABASE_USER }} export LIQUIBASE_COMMAND_PASSWORD=$password export LIQUIBASE_LOG_LEVEL=FINE liquibase update
内容的提问来源于stack exchange,提问作者user2691402
相关产品推荐
相关产品推荐

