@@ -151,7 +151,7 @@ func resourceSecretVersionCreate(ctx context.Context, d *schema.ResourceData, me
151151 d .SetId (secretVersionCreateResourceID (secretID , versionID ))
152152
153153 _ , err = tfresource .RetryWhenNotFound (ctx , propagationTimeout , func (ctx context.Context ) (any , error ) {
154- return findSecretVersionByTwoPartKey (ctx , conn , secretID , versionID )
154+ return checkExists (ctx , conn , secretID , versionID , secretStringWO != "" )
155155 })
156156
157157 if err != nil {
@@ -161,6 +161,25 @@ func resourceSecretVersionCreate(ctx context.Context, d *schema.ResourceData, me
161161 return append (diags , resourceSecretVersionRead (ctx , d , meta )... )
162162}
163163
164+ type secretVersionExistsOutput struct {
165+ VersionStages []string
166+ }
167+
168+ func checkExists (ctx context.Context , conn * secretsmanager.Client , secretID , versionID string , hasWriteOnly bool ) (* secretVersionExistsOutput , error ) {
169+ if hasWriteOnly {
170+ _ , output , err := findSecretVersionEntryByTwoPartKey (ctx , conn , secretID , versionID )
171+ if err != nil {
172+ return nil , err
173+ }
174+ return & secretVersionExistsOutput {VersionStages : output .VersionStages }, nil
175+ }
176+ output , err := findSecretVersionByTwoPartKey (ctx , conn , secretID , versionID )
177+ if err != nil {
178+ return nil , err
179+ }
180+ return & secretVersionExistsOutput {VersionStages : output .VersionStages }, nil
181+ }
182+
164183func resourceSecretVersionRead (ctx context.Context , d * schema.ResourceData , meta any ) diag.Diagnostics {
165184 var diags diag.Diagnostics
166185 conn := meta .(* conns.AWSClient ).SecretsManagerClient (ctx )
@@ -170,26 +189,6 @@ func resourceSecretVersionRead(ctx context.Context, d *schema.ResourceData, meta
170189 return sdkdiag .AppendFromErr (diags , err )
171190 }
172191
173- output , err := findSecretVersionByTwoPartKey (ctx , conn , secretID , versionID )
174-
175- if ! d .IsNewResource () && tfresource .NotFound (err ) {
176- log .Printf ("[WARN] Secrets Manager Secret Version (%s) not found, removing from state" , d .Id ())
177- d .SetId ("" )
178- return diags
179- }
180-
181- if err != nil {
182- return sdkdiag .AppendErrorf (diags , "reading Secrets Manager Secret Version (%s): %s" , d .Id (), err )
183- }
184-
185- d .Set (names .AttrARN , output .ARN )
186- d .Set ("secret_binary" , inttypes .Base64EncodeOnce (output .SecretBinary ))
187- d .Set ("secret_id" , secretID )
188- d .Set ("secret_string" , output .SecretString )
189- d .Set ("version_id" , output .VersionId )
190- d .Set ("version_stages" , output .VersionStages )
191-
192- // unset secret_string if the value is configured as write-only
193192 hasWriteOnly := flex .HasWriteOnlyValue (d , "secret_string_wo" )
194193 secretStringWO , di := flex .GetWriteOnlyStringValue (d , cty .GetAttrPath ("secret_string_wo" ))
195194 diags = append (diags , di ... )
@@ -201,6 +200,48 @@ func resourceSecretVersionRead(ctx context.Context, d *schema.ResourceData, meta
201200 hasWriteOnly = true
202201 }
203202
203+ d .Set ("secret_id" , secretID )
204+
205+ if hasWriteOnly {
206+ arn , versionEntry , err := findSecretVersionEntryByTwoPartKey (ctx , conn , secretID , versionID )
207+
208+ if ! d .IsNewResource () && tfresource .NotFound (err ) {
209+ log .Printf ("[WARN] Secrets Manager Secret Version (%s) not found, removing from state" , d .Id ())
210+ d .SetId ("" )
211+ return diags
212+ }
213+
214+ if err != nil {
215+ return sdkdiag .AppendErrorf (diags , "reading Secrets Manager Secret Version (%s): %s" , d .Id (), err )
216+ }
217+
218+ d .Set (names .AttrARN , arn )
219+ d .Set ("secret_binary" , nil )
220+
221+ if versionEntry != nil {
222+ d .Set ("version_id" , versionEntry .VersionId )
223+ d .Set ("version_stages" , versionEntry .VersionStages )
224+ }
225+ } else {
226+ output , err := findSecretVersionByTwoPartKey (ctx , conn , secretID , versionID )
227+
228+ if ! d .IsNewResource () && tfresource .NotFound (err ) {
229+ log .Printf ("[WARN] Secrets Manager Secret Version (%s) not found, removing from state" , d .Id ())
230+ d .SetId ("" )
231+ return diags
232+ }
233+
234+ if err != nil {
235+ return sdkdiag .AppendErrorf (diags , "reading Secrets Manager Secret Version (%s): %s" , d .Id (), err )
236+ }
237+
238+ d .Set (names .AttrARN , output .ARN )
239+ d .Set ("secret_binary" , inttypes .Base64EncodeOnce (output .SecretBinary ))
240+ d .Set ("secret_string" , output .SecretString )
241+ d .Set ("version_id" , output .VersionId )
242+ d .Set ("version_stages" , output .VersionStages )
243+ }
244+
204245 if hasWriteOnly {
205246 d .Set ("has_secret_string_wo" , true )
206247 d .Set ("secret_string" , nil )
@@ -335,7 +376,8 @@ func resourceSecretVersionDelete(ctx context.Context, d *schema.ResourceData, me
335376 }
336377
337378 _ , err = tfresource .RetryUntilNotFound (ctx , propagationTimeout , func (ctx context.Context ) (any , error ) {
338- output , err := findSecretVersionByTwoPartKey (ctx , conn , secretID , versionID )
379+ hasWriteOnly := flex .HasWriteOnlyValue (d , "secret_string_wo" )
380+ output , err := checkExists (ctx , conn , secretID , versionID , hasWriteOnly )
339381
340382 if err != nil {
341383 return nil , err
@@ -355,6 +397,49 @@ func resourceSecretVersionDelete(ctx context.Context, d *schema.ResourceData, me
355397 return diags
356398}
357399
400+ func findSecretVersionEntryByTwoPartKey (ctx context.Context , conn * secretsmanager.Client , secretID , versionID string ) (* string , * types.SecretVersionsListEntry , error ) {
401+ input := & secretsmanager.ListSecretVersionIdsInput {
402+ SecretId : aws .String (secretID ),
403+ IncludeDeprecated : aws .Bool (true ),
404+ }
405+
406+ paginator := secretsmanager .NewListSecretVersionIdsPaginator (conn , input )
407+
408+ for paginator .HasMorePages () {
409+ page , err := paginator .NextPage (ctx )
410+
411+ if errs.IsA [* types.ResourceNotFoundException ](err ) ||
412+ errs .IsAErrorMessageContains [* types.InvalidRequestException ](err , "because it was deleted" ) ||
413+ errs .IsAErrorMessageContains [* types.InvalidRequestException ](err , "because it was marked for deletion" ) {
414+ return nil , nil , & retry.NotFoundError {
415+ LastError : err ,
416+ LastRequest : input ,
417+ }
418+ }
419+
420+ if err != nil {
421+ return nil , nil , err
422+ }
423+
424+ if page == nil {
425+ continue
426+ }
427+
428+ for i := range page .Versions {
429+ version := & page .Versions [i ]
430+
431+ if aws .ToString (version .VersionId ) == versionID {
432+ return page .ARN , version , nil
433+ }
434+ }
435+ }
436+
437+ return nil , nil , & retry.NotFoundError {
438+ LastError : tfresource .NewEmptyResultError (input ),
439+ LastRequest : input ,
440+ }
441+ }
442+
358443func findSecretVersion (ctx context.Context , conn * secretsmanager.Client , input * secretsmanager.GetSecretValueInput ) (* secretsmanager.GetSecretValueOutput , error ) {
359444 output , err := conn .GetSecretValue (ctx , input )
360445
0 commit comments