diff --git a/lib/modules/manager/terraform/extract.spec.ts b/lib/modules/manager/terraform/extract.spec.ts
index 0cd851c567fbaebb6a7801f2a5d5aedb953293fc..d407b781d2077fd9c86e9663a131d2b3c03f4bef 100644
--- a/lib/modules/manager/terraform/extract.spec.ts
+++ b/lib/modules/manager/terraform/extract.spec.ts
@@ -655,7 +655,7 @@ describe('modules/manager/terraform/extract', () => {
 
     it('update lockfile constraints with range strategy update-lockfile', async () => {
       fs.readLocalFile.mockResolvedValueOnce(lockedVersionLockfile);
-      fs.getSiblingFileName.mockReturnValueOnce('aLockFile.hcl');
+      fs.findLocalSiblingOrParent.mockResolvedValueOnce('aLockFile.hcl');
 
       const res = await extractPackageFile(
         lockedVersion,
diff --git a/lib/modules/manager/terraform/lockfile/index.spec.ts b/lib/modules/manager/terraform/lockfile/index.spec.ts
index 5294f00725c51cc8d213f0dd3fc96af1d8a79311..354b84fd4fdd8204ed494458092125e972ea5075 100644
--- a/lib/modules/manager/terraform/lockfile/index.spec.ts
+++ b/lib/modules/manager/terraform/lockfile/index.spec.ts
@@ -39,7 +39,19 @@ describe('modules/manager/terraform/lockfile/index', () => {
   });
 
   it('returns null if no .terraform.lock.hcl found', async () => {
+    expect(
+      await updateArtifacts({
+        packageFileName: 'main.tf',
+        updatedDeps: [{ depName: 'aws' }],
+        newPackageFileContent: '',
+        config,
+      })
+    ).toBeNull();
+  });
+
+  it('returns null if .terraform.lock.hcl is empty', async () => {
     fs.readLocalFile.mockResolvedValueOnce('');
+    fs.findLocalSiblingOrParent.mockResolvedValueOnce('.terraform.lock.hcl');
 
     expect(
       await updateArtifacts({
@@ -51,8 +63,9 @@ describe('modules/manager/terraform/lockfile/index', () => {
     ).toBeNull();
   });
 
-  it('returns null if .terraform.lock.hcl is empty', async () => {
+  it('returns null if .terraform.lock.hcl is invalid', async () => {
     fs.readLocalFile.mockResolvedValueOnce('empty');
+    fs.findLocalSiblingOrParent.mockResolvedValueOnce('.terraform.lock.hcl');
 
     expect(
       await updateArtifacts({
@@ -66,7 +79,7 @@ describe('modules/manager/terraform/lockfile/index', () => {
 
   it('update single dependency with exact constraint and depType provider', async () => {
     fs.readLocalFile.mockResolvedValueOnce(validLockfile);
-    fs.getSiblingFileName.mockReturnValueOnce('.terraform.lock.hcl');
+    fs.findLocalSiblingOrParent.mockResolvedValueOnce('.terraform.lock.hcl');
 
     mockHash.mockResolvedValueOnce([
       'h1:lDsKRxDRXPEzA4AxkK4t+lJd3IQIP2UoaplJGjQSp2s=',
@@ -101,7 +114,7 @@ describe('modules/manager/terraform/lockfile/index', () => {
 
   it('update single dependency with exact constraint and and depType required_provider', async () => {
     fs.readLocalFile.mockResolvedValueOnce(validLockfile);
-    fs.getSiblingFileName.mockReturnValueOnce('.terraform.lock.hcl');
+    fs.findLocalSiblingOrParent.mockResolvedValueOnce('.terraform.lock.hcl');
 
     mockHash.mockResolvedValueOnce([
       'h1:lDsKRxDRXPEzA4AxkK4t+lJd3IQIP2UoaplJGjQSp2s=',
@@ -154,7 +167,7 @@ describe('modules/manager/terraform/lockfile/index', () => {
 
   it('update single dependency with range constraint and minor update from private registry', async () => {
     fs.readLocalFile.mockResolvedValueOnce(validLockfile);
-    fs.getSiblingFileName.mockReturnValueOnce('.terraform.lock.hcl');
+    fs.findLocalSiblingOrParent.mockResolvedValueOnce('.terraform.lock.hcl');
 
     mockHash.mockResolvedValueOnce([
       'h1:lDsKRxDRXPEzA4AxkK4t+lJd3IQIP2UoaplJGjQSp2s=',
@@ -190,7 +203,7 @@ describe('modules/manager/terraform/lockfile/index', () => {
 
   it('update single dependency with range constraint and major update', async () => {
     fs.readLocalFile.mockResolvedValueOnce(validLockfile);
-    fs.getSiblingFileName.mockReturnValueOnce('.terraform.lock.hcl');
+    fs.findLocalSiblingOrParent.mockResolvedValueOnce('.terraform.lock.hcl');
 
     mockHash.mockResolvedValueOnce([
       'h1:lDsKRxDRXPEzA4AxkK4t+lJd3IQIP2UoaplJGjQSp2s=',
@@ -225,7 +238,9 @@ describe('modules/manager/terraform/lockfile/index', () => {
 
   it('update single dependency in subfolder', async () => {
     fs.readLocalFile.mockResolvedValueOnce(validLockfile);
-    fs.getSiblingFileName.mockReturnValueOnce('test/.terraform.lock.hcl');
+    fs.findLocalSiblingOrParent.mockResolvedValueOnce(
+      'test/.terraform.lock.hcl'
+    );
 
     mockHash.mockResolvedValueOnce([
       'h1:lDsKRxDRXPEzA4AxkK4t+lJd3IQIP2UoaplJGjQSp2s=',
@@ -260,7 +275,9 @@ describe('modules/manager/terraform/lockfile/index', () => {
 
   it('update multiple dependencies which are not ordered', async () => {
     fs.readLocalFile.mockResolvedValue(validLockfile2);
-    fs.getSiblingFileName.mockReturnValue('test/.terraform.lock.hcl');
+    fs.findLocalSiblingOrParent.mockResolvedValueOnce(
+      'test/.terraform.lock.hcl'
+    );
 
     mockHash.mockResolvedValue([
       'h1:lDsKRxDRXPEzA4AxkK4t+lJd3IQIP2UoaplJGjQSp2s=',
@@ -316,7 +333,7 @@ describe('modules/manager/terraform/lockfile/index', () => {
 
   it('do full lock file maintenance', async () => {
     fs.readLocalFile.mockResolvedValueOnce(validLockfile);
-    fs.getSiblingFileName.mockReturnValueOnce('.terraform.lock.hcl');
+    fs.findLocalSiblingOrParent.mockResolvedValueOnce('.terraform.lock.hcl');
 
     mockGetPkgReleases
       .mockResolvedValueOnce({
@@ -389,7 +406,9 @@ describe('modules/manager/terraform/lockfile/index', () => {
 
   it('do full lock file maintenance with lockfile in subfolder', async () => {
     fs.readLocalFile.mockResolvedValueOnce(validLockfile);
-    fs.getSiblingFileName.mockReturnValueOnce('subfolder/.terraform.lock.hcl');
+    fs.findLocalSiblingOrParent.mockResolvedValueOnce(
+      'subfolder/.terraform.lock.hcl'
+    );
 
     mockGetPkgReleases
       .mockResolvedValueOnce({
@@ -519,6 +538,7 @@ describe('modules/manager/terraform/lockfile/index', () => {
 
   it('return null if hashing fails', async () => {
     fs.readLocalFile.mockResolvedValueOnce(validLockfile);
+    fs.findLocalSiblingOrParent.mockResolvedValueOnce('.terraform.lock.hcl');
 
     mockGetPkgReleases
       .mockResolvedValueOnce({
diff --git a/lib/modules/manager/terraform/lockfile/index.ts b/lib/modules/manager/terraform/lockfile/index.ts
index d4421c3d41310ac91d118d945be35a5187a9b980..e036638d2621b651f7df14d3a9972d3e31c1cbc3 100644
--- a/lib/modules/manager/terraform/lockfile/index.ts
+++ b/lib/modules/manager/terraform/lockfile/index.ts
@@ -69,7 +69,13 @@ export async function updateArtifacts({
 }: UpdateArtifact): Promise<UpdateArtifactsResult[] | null> {
   logger.debug(`terraform.updateArtifacts(${packageFileName})`);
 
-  const lockFilePath = findLockFile(packageFileName);
+  const lockFilePath = await findLockFile(packageFileName);
+
+  if (!lockFilePath) {
+    logger.debug('No .terraform.lock.hcl found');
+    return null;
+  }
+
   try {
     const lockFileContent = await readLockFile(lockFilePath);
     if (!lockFileContent) {
diff --git a/lib/modules/manager/terraform/lockfile/util.ts b/lib/modules/manager/terraform/lockfile/util.ts
index 2f59bb1e566722e7d220c4c97d7ad2bc4e722d53..22c78f1bb773d9a849fd4ebf286306830317a57a 100644
--- a/lib/modules/manager/terraform/lockfile/util.ts
+++ b/lib/modules/manager/terraform/lockfile/util.ts
@@ -1,4 +1,4 @@
-import { getSiblingFileName, readLocalFile } from '../../../../util/fs';
+import { findLocalSiblingOrParent, readLocalFile } from '../../../../util/fs';
 import { newlineRegex, regEx } from '../../../../util/regex';
 import { get as getVersioning } from '../../../versioning';
 import type { UpdateArtifactsResult } from '../../types';
@@ -22,8 +22,8 @@ const hashLineRegex = regEx(`^(?<prefix>\\s*")(?<hash>[^"]+)(?<suffix>",.*)$`);
 
 const lockFile = '.terraform.lock.hcl';
 
-export function findLockFile(packageFilePath: string): string {
-  return getSiblingFileName(packageFilePath, lockFile);
+export function findLockFile(packageFilePath: string): Promise<string | null> {
+  return findLocalSiblingOrParent(packageFilePath, lockFile);
 }
 
 export function readLockFile(lockFilePath: string): Promise<string | null> {
diff --git a/lib/modules/manager/terraform/util.ts b/lib/modules/manager/terraform/util.ts
index b20fd368121e94a52da6227a0ef474c1a660d327..a1644e3057217c14afd3e43cf328999dc441cf71 100644
--- a/lib/modules/manager/terraform/util.ts
+++ b/lib/modules/manager/terraform/util.ts
@@ -55,7 +55,7 @@ export async function extractLocksForPackageFile(
   fileName: string
 ): Promise<ProviderLock[]> {
   const locks: ProviderLock[] = [];
-  const lockFilePath = findLockFile(fileName);
+  const lockFilePath = await findLockFile(fileName);
   if (lockFilePath) {
     const lockFileContent = await readLockFile(lockFilePath);
     if (lockFileContent) {