Adopting Terraform on infrastructure that already exists is mostly import, and import brings a resource into state without writing any configuration for it.
$ terraform import aws_s3_bucket.uploads example-uploads
Import successful!
$ terraform plan
# aws_s3_bucket.uploads must be replaced
- versioning { ... }
# the config must be written to MATCH reality, by hand,
# until the plan is empty. that is the entire job.
The workflow is import, plan, adjust the configuration to match what the plan wants to change, and repeat until the plan is empty — which for a bucket with lifecycle rules and a policy takes several iterations. Doing it resource by resource with an empty plan as the acceptance criterion is the only version that is safe; importing twenty things and then writing configuration produces a plan that wants to destroy something and a long afternoon working out which line caused it.