1
1
package s3control
2
2
3
3
import (
4
- "fmt "
4
+ "context "
5
5
"log"
6
+ "reflect"
7
+ "strconv"
6
8
7
9
"github.com/aws/aws-sdk-go/aws"
8
10
"github.com/aws/aws-sdk-go/service/s3control"
9
11
"github.com/hashicorp/aws-sdk-go-base/v2/awsv1shim/v2/tfawserr"
12
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
10
13
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
11
14
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
12
15
"github.com/hashicorp/terraform-provider-aws/internal/conns"
13
16
"github.com/hashicorp/terraform-provider-aws/internal/tfresource"
14
17
"github.com/hashicorp/terraform-provider-aws/internal/verify"
15
18
)
16
19
17
- func ResourceAccountPublicAccessBlock () * schema.Resource {
20
+ func init () {
21
+ _sp .registerSDKResourceFactory ("aws_s3_account_public_access_block" , resourceAccountPublicAccessBlock )
22
+ }
23
+
24
+ func resourceAccountPublicAccessBlock () * schema.Resource {
18
25
return & schema.Resource {
19
- Create : resourceAccountPublicAccessBlockCreate ,
20
- Read : resourceAccountPublicAccessBlockRead ,
21
- Update : resourceAccountPublicAccessBlockUpdate ,
22
- Delete : resourceAccountPublicAccessBlockDelete ,
26
+ CreateWithoutTimeout : resourceAccountPublicAccessBlockCreate ,
27
+ ReadWithoutTimeout : resourceAccountPublicAccessBlockRead ,
28
+ UpdateWithoutTimeout : resourceAccountPublicAccessBlockUpdate ,
29
+ DeleteWithoutTimeout : resourceAccountPublicAccessBlockDelete ,
30
+
23
31
Importer : & schema.ResourceImporter {
24
32
State : schema .ImportStatePassthrough ,
25
33
},
@@ -56,7 +64,7 @@ func ResourceAccountPublicAccessBlock() *schema.Resource {
56
64
}
57
65
}
58
66
59
- func resourceAccountPublicAccessBlockCreate (d * schema.ResourceData , meta interface {}) error {
67
+ func resourceAccountPublicAccessBlockCreate (ctx context. Context , d * schema.ResourceData , meta interface {}) diag. Diagnostics {
60
68
conn := meta .(* conns.AWSClient ).S3ControlConn ()
61
69
62
70
accountID := meta .(* conns.AWSClient ).AccountID
@@ -74,130 +82,151 @@ func resourceAccountPublicAccessBlockCreate(d *schema.ResourceData, meta interfa
74
82
},
75
83
}
76
84
77
- log . Printf ( "[DEBUG] Creating S3 Account Public Access Block: %s" , input )
78
- _ , err := conn . PutPublicAccessBlock ( input )
85
+ _ , err := conn . PutPublicAccessBlockWithContext ( ctx , input )
86
+
79
87
if err != nil {
80
- return fmt .Errorf ("error creating S3 Account Public Access Block: %s" , err )
88
+ return diag .Errorf ("creating S3 Account Public Access Block (%s) : %s" , accountID , err )
81
89
}
82
90
83
91
d .SetId (accountID )
84
92
85
- return resourceAccountPublicAccessBlockRead (d , meta )
86
- }
87
-
88
- func resourceAccountPublicAccessBlockRead (d * schema.ResourceData , meta interface {}) error {
89
- conn := meta .(* conns.AWSClient ).S3ControlConn ()
93
+ _ , err = tfresource .RetryWhenNotFoundContext (ctx , propagationTimeout , func () (interface {}, error ) {
94
+ return FindPublicAccessBlockByAccountID (ctx , conn , d .Id ())
95
+ })
90
96
91
- input := & s3control. GetPublicAccessBlockInput {
92
- AccountId : aws . String ( d .Id ()),
97
+ if err != nil {
98
+ return diag . Errorf ( "waiting for S3 Account Public Access Block (%s) create: %s" , d .Id (), err )
93
99
}
94
100
95
- // Retry for eventual consistency on creation
96
- var output * s3control.GetPublicAccessBlockOutput
97
- err := resource .Retry (propagationTimeout , func () * resource.RetryError {
98
- var err error
99
- output , err = conn .GetPublicAccessBlock (input )
100
-
101
- if d .IsNewResource () && tfawserr .ErrCodeEquals (err , s3control .ErrCodeNoSuchPublicAccessBlockConfiguration ) {
102
- return resource .RetryableError (err )
103
- }
104
-
105
- if err != nil {
106
- return resource .NonRetryableError (err )
107
- }
101
+ return resourceAccountPublicAccessBlockRead (ctx , d , meta )
102
+ }
108
103
109
- return nil
110
- } )
104
+ func resourceAccountPublicAccessBlockRead ( ctx context. Context , d * schema. ResourceData , meta interface {}) diag. Diagnostics {
105
+ conn := meta .( * conns. AWSClient ). S3ControlConn ( )
111
106
112
- if tfresource .TimedOut (err ) {
113
- output , err = conn .GetPublicAccessBlock (input )
114
- }
107
+ output , err := FindPublicAccessBlockByAccountID (ctx , conn , d .Id ())
115
108
116
- if ! d .IsNewResource () && tfawserr . ErrCodeEquals (err , s3control . ErrCodeNoSuchPublicAccessBlockConfiguration ) {
109
+ if ! d .IsNewResource () && tfresource . NotFound (err ) {
117
110
log .Printf ("[WARN] S3 Account Public Access Block (%s) not found, removing from state" , d .Id ())
118
111
d .SetId ("" )
119
112
return nil
120
113
}
121
114
122
115
if err != nil {
123
- return fmt .Errorf ("error reading S3 Account Public Access Block: %s" , err )
124
- }
125
-
126
- if output == nil || output .PublicAccessBlockConfiguration == nil {
127
- return fmt .Errorf ("error reading S3 Account Public Access Block (%s): missing public access block configuration" , d .Id ())
116
+ return diag .Errorf ("reading S3 Account Public Access Block (%s): %s" , d .Id (), err )
128
117
}
129
118
130
119
d .Set ("account_id" , d .Id ())
131
- d .Set ("block_public_acls" , output .PublicAccessBlockConfiguration . BlockPublicAcls )
132
- d .Set ("block_public_policy" , output .PublicAccessBlockConfiguration . BlockPublicPolicy )
133
- d .Set ("ignore_public_acls" , output .PublicAccessBlockConfiguration . IgnorePublicAcls )
134
- d .Set ("restrict_public_buckets" , output .PublicAccessBlockConfiguration . RestrictPublicBuckets )
120
+ d .Set ("block_public_acls" , output .BlockPublicAcls )
121
+ d .Set ("block_public_policy" , output .BlockPublicPolicy )
122
+ d .Set ("ignore_public_acls" , output .IgnorePublicAcls )
123
+ d .Set ("restrict_public_buckets" , output .RestrictPublicBuckets )
135
124
136
125
return nil
137
126
}
138
127
139
- func resourceAccountPublicAccessBlockUpdate (d * schema.ResourceData , meta interface {}) error {
128
+ func resourceAccountPublicAccessBlockUpdate (ctx context. Context , d * schema.ResourceData , meta interface {}) diag. Diagnostics {
140
129
conn := meta .(* conns.AWSClient ).S3ControlConn ()
141
130
131
+ publicAccessBlockConfiguration := & s3control.PublicAccessBlockConfiguration {
132
+ BlockPublicAcls : aws .Bool (d .Get ("block_public_acls" ).(bool )),
133
+ BlockPublicPolicy : aws .Bool (d .Get ("block_public_policy" ).(bool )),
134
+ IgnorePublicAcls : aws .Bool (d .Get ("ignore_public_acls" ).(bool )),
135
+ RestrictPublicBuckets : aws .Bool (d .Get ("restrict_public_buckets" ).(bool )),
136
+ }
142
137
input := & s3control.PutPublicAccessBlockInput {
138
+ AccountId : aws .String (d .Id ()),
139
+ PublicAccessBlockConfiguration : publicAccessBlockConfiguration ,
140
+ }
141
+
142
+ _ , err := conn .PutPublicAccessBlockWithContext (ctx , input )
143
+
144
+ if err != nil {
145
+ return diag .Errorf ("updating S3 Account Public Access Block (%s): %s" , d .Id (), err )
146
+ }
147
+
148
+ if _ , err := waitPublicAccessBlockEqual (ctx , conn , d .Id (), publicAccessBlockConfiguration ); err != nil {
149
+ return diag .Errorf ("waiting for S3 Account Public Access Block (%s) update: %s" , d .Id (), err )
150
+ }
151
+
152
+ return resourceAccountPublicAccessBlockRead (ctx , d , meta )
153
+ }
154
+
155
+ func resourceAccountPublicAccessBlockDelete (ctx context.Context , d * schema.ResourceData , meta interface {}) diag.Diagnostics {
156
+ conn := meta .(* conns.AWSClient ).S3ControlConn ()
157
+
158
+ log .Printf ("[DEBUG] Deleting S3 Account Public Access Block: %s" , d .Id ())
159
+ _ , err := conn .DeletePublicAccessBlockWithContext (ctx , & s3control.DeletePublicAccessBlockInput {
143
160
AccountId : aws .String (d .Id ()),
144
- PublicAccessBlockConfiguration : & s3control.PublicAccessBlockConfiguration {
145
- BlockPublicAcls : aws .Bool (d .Get ("block_public_acls" ).(bool )),
146
- BlockPublicPolicy : aws .Bool (d .Get ("block_public_policy" ).(bool )),
147
- IgnorePublicAcls : aws .Bool (d .Get ("ignore_public_acls" ).(bool )),
148
- RestrictPublicBuckets : aws .Bool (d .Get ("restrict_public_buckets" ).(bool )),
149
- },
161
+ })
162
+
163
+ if tfawserr .ErrCodeEquals (err , s3control .ErrCodeNoSuchPublicAccessBlockConfiguration ) {
164
+ return nil
150
165
}
151
166
152
- log .Printf ("[DEBUG] Updating S3 Account Public Access Block: %s" , input )
153
- _ , err := conn .PutPublicAccessBlock (input )
154
167
if err != nil {
155
- return fmt .Errorf ("error updating S3 Account Public Access Block (%s): %s" , d .Id (), err )
168
+ return diag .Errorf ("deleting S3 Account Public Access Block (%s): %s" , d .Id (), err )
156
169
}
157
170
158
- if d .HasChange ("block_public_acls" ) {
159
- if _ , err := waitPublicAccessBlockConfigurationBlockPublicACLsUpdated (conn , d .Id (), d .Get ("block_public_acls" ).(bool )); err != nil {
160
- return fmt .Errorf ("error waiting for S3 Account Public Access Block (%s) block_public_acls update: %w" , d .Id (), err )
161
- }
171
+ return nil
172
+ }
173
+
174
+ func FindPublicAccessBlockByAccountID (ctx context.Context , conn * s3control.S3Control , accountID string ) (* s3control.PublicAccessBlockConfiguration , error ) {
175
+ input := & s3control.GetPublicAccessBlockInput {
176
+ AccountId : aws .String (accountID ),
162
177
}
163
178
164
- if d .HasChange ("block_public_policy" ) {
165
- if _ , err := waitPublicAccessBlockConfigurationBlockPublicPolicyUpdated (conn , d .Id (), d .Get ("block_public_policy" ).(bool )); err != nil {
166
- return fmt .Errorf ("error waiting for S3 Account Public Access Block (%s) block_public_policy update: %w" , d .Id (), err )
179
+ output , err := conn .GetPublicAccessBlockWithContext (ctx , input )
180
+
181
+ if tfawserr .ErrCodeEquals (err , s3control .ErrCodeNoSuchPublicAccessBlockConfiguration ) {
182
+ return nil , & resource.NotFoundError {
183
+ LastError : err ,
184
+ LastRequest : input ,
167
185
}
168
186
}
169
187
170
- if d .HasChange ("ignore_public_acls" ) {
171
- if _ , err := waitPublicAccessBlockConfigurationIgnorePublicACLsUpdated (conn , d .Id (), d .Get ("ignore_public_acls" ).(bool )); err != nil {
172
- return fmt .Errorf ("error waiting for S3 Account Public Access Block (%s) ignore_public_acls update: %w" , d .Id (), err )
173
- }
188
+ if err != nil {
189
+ return nil , err
174
190
}
175
191
176
- if d .HasChange ("restrict_public_buckets" ) {
177
- if _ , err := waitPublicAccessBlockConfigurationRestrictPublicBucketsUpdated (conn , d .Id (), d .Get ("restrict_public_buckets" ).(bool )); err != nil {
178
- return fmt .Errorf ("error waiting for S3 Account Public Access Block (%s) restrict_public_buckets update: %w" , d .Id (), err )
179
- }
192
+ if output == nil || output .PublicAccessBlockConfiguration == nil {
193
+ return nil , tfresource .NewEmptyResultError (input )
180
194
}
181
195
182
- return resourceAccountPublicAccessBlockRead ( d , meta )
196
+ return output . PublicAccessBlockConfiguration , nil
183
197
}
184
198
185
- func resourceAccountPublicAccessBlockDelete (d * schema.ResourceData , meta interface {}) error {
186
- conn := meta .(* conns.AWSClient ).S3ControlConn ()
199
+ func statusPublicAccessBlockEqual (ctx context.Context , conn * s3control.S3Control , accountID string , target * s3control.PublicAccessBlockConfiguration ) resource.StateRefreshFunc {
200
+ return func () (interface {}, string , error ) {
201
+ output , err := FindPublicAccessBlockByAccountID (ctx , conn , accountID )
187
202
188
- input := & s3control.DeletePublicAccessBlockInput {
189
- AccountId : aws .String (d .Id ()),
190
- }
203
+ if tfresource .NotFound (err ) {
204
+ return nil , "" , nil
205
+ }
206
+
207
+ if err != nil {
208
+ return nil , "" , err
209
+ }
191
210
192
- _ , err := conn .DeletePublicAccessBlock (input )
211
+ return output , strconv .FormatBool (reflect .DeepEqual (output , target )), nil
212
+ }
213
+ }
193
214
194
- if tfawserr .ErrCodeEquals (err , s3control .ErrCodeNoSuchPublicAccessBlockConfiguration ) {
195
- return nil
215
+ func waitPublicAccessBlockEqual (ctx context.Context , conn * s3control.S3Control , accountID string , target * s3control.PublicAccessBlockConfiguration ) (* s3control.PublicAccessBlockConfiguration , error ) {
216
+ stateConf := & resource.StateChangeConf {
217
+ Pending : []string {strconv .FormatBool (false )},
218
+ Target : []string {strconv .FormatBool (true )},
219
+ Refresh : statusPublicAccessBlockEqual (ctx , conn , accountID , target ),
220
+ Timeout : propagationTimeout ,
221
+ MinTimeout : propagationMinTimeout ,
222
+ ContinuousTargetOccurence : propagationContinuousTargetOccurence ,
196
223
}
197
224
198
- if err != nil {
199
- return fmt .Errorf ("error deleting S3 Account Public Access Block (%s): %s" , d .Id (), err )
225
+ outputRaw , err := stateConf .WaitForStateContext (ctx )
226
+
227
+ if output , ok := outputRaw .(* s3control.PublicAccessBlockConfiguration ); ok {
228
+ return output , err
200
229
}
201
230
202
- return nil
231
+ return nil , err
203
232
}
0 commit comments