본문 바로가기
DevOps/Terraform

Terraform + PowerShell local-exec에서 ssh/scp 실행 시 불필요한 . 출력 문제 해결기

by Rainbound-IT 2025. 8. 19.
반응형

AWS 인프라를 Terraform으로 프로비저닝하면서, null_resource + local-exec 프로비저너를 활용해 OpenVPN 서버에서 client.ovpn 파일을 scp로 다운로드하는 작업을 넣었습니다.

그런데 terraform apply 실행 시 콘솔 로그에 다음과 같은 출력이 계속 찍히는 문제가 발생했습니다.

 
null_resource.download_client_ovpn (local-exec): .
null_resource.download_client_ovpn (local-exec): .
null_resource.download_client_ovpn (local-exec): .
null_resource.download_client_ovpn: Still creating... [00m20s elapsed]
null_resource.download_client_ovpn (local-exec): .
null_resource.download_client_ovpn (local-exec): .
 
 

Terraform이 local-exec 출력 스트림을 받으면서, 줄바꿈 없는 stderr/진행바 같은 것들을 . 으로 치환해서 보여주기 때문에 발생하는 현상입니다. 즉, ssh/scp가 남기는 프로그레스 메시지를 Terraform이 점(.)으로 바꿔 찍어버리는 거죠.


문제 원인 정리

  1. PowerShell 진행 표시 문제
    • $ProgressPreference가 기본값(Continue)일 때, PowerShell은 Copy-Item, Start-Sleep 같은 내부 cmdlet에 대해 진행 상태를 Write-Progress로 계속 뿌린다.
    • Terraform 콘솔은 이걸 제대로 해석하지 못하고 .으로 찍는다.
  2. ssh/scp 자체의 stderr 출력
    • scp는 기본적으로 전송 진행률을 stderr로 출력한다. (예: ########## 12%)
    • Terraform은 줄바꿈 없는 stderr를 그대로 찍지 못하고 .으로 대체한다.

해결 방법

1) PowerShell 진행바 억제

스크립트 상단에 다음을 추가한다:

 
$ProgressPreference = 'SilentlyContinue'

이걸 넣으면 PowerShell 자체 cmdlet의 프로그레스 바 출력은 사라진다.


2) ssh/scp 출력 억제

ssh와 scp 실행 시 다음 옵션을 추가한다:

 
-q -o LogLevel=ERROR

여기에 추가로, PowerShell에서 표준 출력/에러를 모두 버리려면:

 
*> $null

즉, 최종 호출은 다음과 같이 조용하게 만든다:

 
ssh -q -o StrictHostKeyChecking=no -o LogLevel=ERROR -i $KeyPath ec2-user@$HostIp 'sudo test -r /home/ec2-user/client.ovpn' *> $null
scp -q -o StrictHostKeyChecking=no -o LogLevel=ERROR -i $KeyPath "$remoteSpec" "$LocalFile" *> $null
 

최종 코드 (핵심 부분)

 
provisioner "local-exec" {
  command = <<EOT
    $ProgressPreference = 'SilentlyContinue'

    $HostIp     = "${aws_instance.openvpn.public_ip}"
    $RemoteFile = "/home/ec2-user/client.ovpn"
    $LocalFile  = "./client.ovpn"
    $KeyPath    = "C:/Users/$env:USERNAME/.ssh/barun-dev-eks-connect.pem"

    # 파일 존재 여부 확인 (조용히)
    ssh -q -o StrictHostKeyChecking=no -o LogLevel=ERROR -i "$KeyPath" ec2-user@$HostIp "sudo test -r $RemoteFile" *> $null

    # 다운로드 (조용히)
    $remoteSpec = "ec2-user@${HostIp}:${RemoteFile}"
    & scp -q -o StrictHostKeyChecking=no -o LogLevel=ERROR -i "$KeyPath" "$remoteSpec" "$LocalFile" *> $null

    Write-Host "✅ client.ovpn 다운로드 완료"
  EOT
  interpreter = ["PowerShell", "-Command"]
}
 
 

결론

  • Terraform local-exec에서 보이는 . 출력은 PowerShell 진행바ssh/scp stderr 때문이다.
  • $ProgressPreference = 'SilentlyContinue'로 PowerShell 프로그레스는 끄고,
  • ssh/scp에는 -q -o LogLevel=ERROR 옵션 + *> $null 리다이렉션을 적용하면 된다.

이렇게 하면 로그에 불필요한 점(.)이 사라지고, 내가 Write-Host로 남긴 메시지(✅ 다운로드 성공, ⏳ xx초 경과)만 깔끔하게 표시된다.

반응형

댓글