Woodland, 35, made a long birdie putt on 18 to shoot a 2-under 69 on the final day to finish at 13 under for the tournament.
Koepka, who was trying to become the first player since Willie Anderson in 1905 to win three straight U.S. Opens, finished with a 68 on Sunday and became the first player to shoot all four rounds of a U.S. Open in the 60s and fail to win.
Woodland closed the deal after top-10 finishes in the last two PGA Championships, including taking the lead into the weekend at Bellerive last year, when he finished tied for sixth.
Justin Rose, the 2013 U.S. Open winner paired with Woodland on Sunday, dropped out of contention on the back nine after making bogeys on 12, 13 and 15 and finished in a tie for third at 7 under with Xander Schauffele, Jon Rahm and Chez Reavie.
Tiger Woods quietly finished at 2 under for the tournament, his third-best score to par in his 21st career appearance in a U.S. Open. He finished tied for 21st.