From 415da2760335b58277a9676dd58706d8f84b7f70 Mon Sep 17 00:00:00 2001 From: scmacdon <scmacdon@amazon.com> Date: Mon, 13 Jan 2025 11:48:04 -0500 Subject: [PATCH 01/10] updated the S3 Java ListBuckets example --- .../s3/src/main/java/com/example/s3/ListBuckets.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java b/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java index 4717df9de74..519d2fd91ba 100644 --- a/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java +++ b/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java @@ -37,8 +37,11 @@ public static void main(String[] args) { public static void listAllBuckets(S3Client s3) { ListBucketsResponse response = s3.listBuckets(); List<Bucket> bucketList = response.buckets(); - for (Bucket bucket: bucketList) { - System.out.println("Bucket name "+bucket.name()); + // Print bucket names + System.out.println("Your Amazon S3 buckets are:"); + for (Bucket bucket : bucketList) { + System.out.println(bucket.name()); + System.out.println(bucket.creationDate()); } } } From 649e09b300551aac3650f3e254d2af57a24926c4 Mon Sep 17 00:00:00 2001 From: scmacdon <scmacdon@amazon.com> Date: Tue, 14 Jan 2025 09:53:16 -0500 Subject: [PATCH 02/10] added a locl policy example --- .../s3/lockscenario/CreateObjectLockRole.java | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java b/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java new file mode 100644 index 00000000000..d3a87d0c875 --- /dev/null +++ b/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java @@ -0,0 +1,82 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + + +package com.example.s3.lockscenario; + +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.iam.IamClient; +import software.amazon.awssdk.services.iam.model.CreateRoleRequest; +import software.amazon.awssdk.services.iam.model.PutRolePolicyRequest; + +public class CreateObjectLockRole { + public static void main(String[] args) { + createLockRole(); + } + + // snippet-start:[S3Lock.javav2.lock.role.main] + /** + * Creates an IAM role for AWS S3 Batch Operations to manage object locks. + */ + public static void createLockRole() { + final String roleName = "batch_operations-object-lock1"; + + // Trust policy + final String trustPolicy = "{" + + "\"Version\":\"2012-10-17\"," + + "\"Statement\":[{" + + "\"Effect\":\"Allow\"," + + "\"Principal\":{" + + "\"Service\":\"batchoperations.s3.amazonaws.com\"" + + "}," + + "\"Action\":\"sts:AssumeRole\"" + + "}]" + + "}"; + + // Permissions policy + final String bopsPermissions = "{" + + "\"Version\":\"2012-10-17\"," + + "\"Statement\":[" + + "{" + + "\"Effect\":\"Allow\"," + + "\"Action\":\"s3:GetBucketObjectLockConfiguration\"," + + "\"Resource\":\"arn:aws:s3:::amzn-s3-demo-manifest-bucket\"" + + "}," + + "{" + + "\"Effect\":\"Allow\"," + + "\"Action\":[\"s3:GetObject\",\"s3:GetObjectVersion\",\"s3:GetBucketLocation\"]," + + "\"Resource\":\"arn:aws:s3:::amzn-s3-demo-manifest-bucket/*\"" + + "}," + + "{" + + "\"Effect\":\"Allow\"," + + "\"Action\":[\"s3:PutObject\",\"s3:GetBucketLocation\"]," + + "\"Resource\":\"arn:aws:s3:::amzn-s3-demo-completion-report-bucket/*\"" + + "}" + + "]" + + "}"; + + // Create IAM client + final IamClient iam = IamClient.builder() + .region(Region.US_WEST_2) + .build(); + + // Create the role with the trust policy + final CreateRoleRequest createRoleRequest = CreateRoleRequest.builder() + .assumeRolePolicyDocument(trustPolicy) + .roleName(roleName) + .build(); + + iam.createRole(createRoleRequest); + + // Attach the permissions policy to the role + final PutRolePolicyRequest putRolePolicyRequest = PutRolePolicyRequest.builder() + .policyDocument(bopsPermissions) + .policyName("batch_operations-permissions") + .roleName(roleName) + .build(); + + iam.putRolePolicy(putRolePolicyRequest); + System.out.println("The object lock role was created."); + } + // snippet-end:[S3Lock.javav2.lock.role.main] +} From d135839dc4f82e90f48c611986e2ef6e6d492d4d Mon Sep 17 00:00:00 2001 From: scmacdon <scmacdon@amazon.com> Date: Tue, 14 Jan 2025 13:44:49 -0500 Subject: [PATCH 03/10] updated the S3 listbucket example to use pagnation --- .../main/java/com/example/s3/ListBuckets.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java b/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java index 519d2fd91ba..d313e12ee05 100644 --- a/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java +++ b/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java @@ -8,6 +8,8 @@ import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.Bucket; import software.amazon.awssdk.services.s3.model.ListBucketsResponse; +import software.amazon.awssdk.services.s3.paginators.ListBucketsIterable; + import java.util.List; /** @@ -35,14 +37,13 @@ public static void main(String[] args) { * @param s3 The {@link S3Client} instance to use for interacting with the Amazon S3 service. */ public static void listAllBuckets(S3Client s3) { - ListBucketsResponse response = s3.listBuckets(); - List<Bucket> bucketList = response.buckets(); - // Print bucket names - System.out.println("Your Amazon S3 buckets are:"); - for (Bucket bucket : bucketList) { - System.out.println(bucket.name()); - System.out.println(bucket.creationDate()); - } + ListBucketsIterable response = s3.listBucketsPaginator(); + + // Iterate over each response page and print bucket names. + response.stream() + .map(ListBucketsResponse::buckets) + .flatMap(buckets -> buckets.stream()) + .forEach(bucket -> System.out.println("Bucket Name: " + bucket.name())); } } // snippet-end:[s3.java2.list.buckets.main] \ No newline at end of file From 293d232234669b80226436edebb45e8020a5709d Mon Sep 17 00:00:00 2001 From: scmacdon <scmacdon@amazon.com> Date: Mon, 27 Jan 2025 09:41:21 -0500 Subject: [PATCH 04/10] rolled in review comments --- .../s3/lockscenario/CreateObjectLockRole.java | 75 +++++++++++-------- 1 file changed, 45 insertions(+), 30 deletions(-) diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java b/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java index d3a87d0c875..756209d7534 100644 --- a/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java +++ b/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java @@ -15,6 +15,7 @@ public static void main(String[] args) { } // snippet-start:[S3Lock.javav2.lock.role.main] + /** * Creates an IAM role for AWS S3 Batch Operations to manage object locks. */ @@ -22,38 +23,52 @@ public static void createLockRole() { final String roleName = "batch_operations-object-lock1"; // Trust policy - final String trustPolicy = "{" - + "\"Version\":\"2012-10-17\"," - + "\"Statement\":[{" - + "\"Effect\":\"Allow\"," - + "\"Principal\":{" - + "\"Service\":\"batchoperations.s3.amazonaws.com\"" - + "}," - + "\"Action\":\"sts:AssumeRole\"" - + "}]" - + "}"; + final String trustPolicy = """ + { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "Service": "batchoperations.s3.amazonaws.com" + }, + "Action": "sts:AssumeRole" + } + ] + } + """; + // Permissions policy - final String bopsPermissions = "{" - + "\"Version\":\"2012-10-17\"," - + "\"Statement\":[" - + "{" - + "\"Effect\":\"Allow\"," - + "\"Action\":\"s3:GetBucketObjectLockConfiguration\"," - + "\"Resource\":\"arn:aws:s3:::amzn-s3-demo-manifest-bucket\"" - + "}," - + "{" - + "\"Effect\":\"Allow\"," - + "\"Action\":[\"s3:GetObject\",\"s3:GetObjectVersion\",\"s3:GetBucketLocation\"]," - + "\"Resource\":\"arn:aws:s3:::amzn-s3-demo-manifest-bucket/*\"" - + "}," - + "{" - + "\"Effect\":\"Allow\"," - + "\"Action\":[\"s3:PutObject\",\"s3:GetBucketLocation\"]," - + "\"Resource\":\"arn:aws:s3:::amzn-s3-demo-completion-report-bucket/*\"" - + "}" - + "]" - + "}"; + final String bopsPermissions = """ + { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": "s3:GetBucketObjectLockConfiguration", + "Resource": "arn:aws:s3:::amzn-s3-demo-manifest-bucket" + }, + { + "Effect": "Allow", + "Action": [ + "s3:GetObject", + "s3:GetObjectVersion", + "s3:GetBucketLocation" + ], + "Resource": "arn:aws:s3:::amzn-s3-demo-manifest-bucket/*" + }, + { + "Effect": "Allow", + "Action": [ + "s3:PutObject", + "s3:GetBucketLocation" + ], + "Resource": "arn:aws:s3:::amzn-s3-demo-completion-report-bucket/*" + } + ] + } + """; // Create IAM client final IamClient iam = IamClient.builder() From 475beb0eb169a05b3b96e8f7b3e9bc064c7ad7e3 Mon Sep 17 00:00:00 2001 From: scmacdon <scmacdon@amazon.com> Date: Mon, 27 Jan 2025 09:45:39 -0500 Subject: [PATCH 05/10] rolled in review comments --- .../s3/src/main/java/com/example/s3/ListBuckets.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java b/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java index d313e12ee05..ef1c2ad64e0 100644 --- a/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java +++ b/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java @@ -45,5 +45,4 @@ public static void listAllBuckets(S3Client s3) { .flatMap(buckets -> buckets.stream()) .forEach(bucket -> System.out.println("Bucket Name: " + bucket.name())); } -} -// snippet-end:[s3.java2.list.buckets.main] \ No newline at end of file +}// snippet-end:[s3.java2.list.buckets.main] \ No newline at end of file From 04fc79a9e9ea8506158293e0a7fff4bff30c1eec Mon Sep 17 00:00:00 2001 From: scmacdon <scmacdon@amazon.com> Date: Mon, 27 Jan 2025 10:37:39 -0500 Subject: [PATCH 06/10] rolled in review comments --- javav2/example_code/s3/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/javav2/example_code/s3/pom.xml b/javav2/example_code/s3/pom.xml index 3c25b740083..957e73c9091 100644 --- a/javav2/example_code/s3/pom.xml +++ b/javav2/example_code/s3/pom.xml @@ -48,7 +48,7 @@ </execution> </executions> </plugin> - </plugins> + </plugins> </build> <dependencyManagement> <dependencies> @@ -185,4 +185,4 @@ <version>2.10.1</version> </dependency> </dependencies> - </project> \ No newline at end of file +</project> \ No newline at end of file From 263df5061d30249ea46187bd3f9ec5c05c2bd4f8 Mon Sep 17 00:00:00 2001 From: scmacdon <scmacdon@amazon.com> Date: Mon, 27 Jan 2025 10:42:55 -0500 Subject: [PATCH 07/10] rolled in review comments --- .../s3/lockscenario/CreateObjectLockRole.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java b/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java index 756209d7534..4cdb455a3b0 100644 --- a/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java +++ b/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java @@ -11,7 +11,20 @@ public class CreateObjectLockRole { public static void main(String[] args) { - createLockRole(); + final String usage = """ + + Usage: <roleName> + + Where: + roleName - the IAM role name. + """; + + if (args.length != 1) { + System.out.println(usage); + System.exit(1); + } + String roleName = args[0]; + createLockRole(roleName); } // snippet-start:[S3Lock.javav2.lock.role.main] @@ -19,9 +32,7 @@ public static void main(String[] args) { /** * Creates an IAM role for AWS S3 Batch Operations to manage object locks. */ - public static void createLockRole() { - final String roleName = "batch_operations-object-lock1"; - + public static void createLockRole(String roleName) { // Trust policy final String trustPolicy = """ { From 7ee54d50684470674e79355439a23d6e6d67c9a9 Mon Sep 17 00:00:00 2001 From: scmacdon <scmacdon@amazon.com> Date: Mon, 27 Jan 2025 10:49:19 -0500 Subject: [PATCH 08/10] rolled in review comments --- .../s3/src/main/java/com/example/s3/ListBuckets.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java b/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java index ef1c2ad64e0..1e776d17a9e 100644 --- a/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java +++ b/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java @@ -38,11 +38,7 @@ public static void main(String[] args) { */ public static void listAllBuckets(S3Client s3) { ListBucketsIterable response = s3.listBucketsPaginator(); - - // Iterate over each response page and print bucket names. - response.stream() - .map(ListBucketsResponse::buckets) - .flatMap(buckets -> buckets.stream()) - .forEach(bucket -> System.out.println("Bucket Name: " + bucket.name())); + response.buckets().forEach(bucket -> + System.out.println("Bucket Name: " + bucket.name())); } }// snippet-end:[s3.java2.list.buckets.main] \ No newline at end of file From 3709cb3b2006fff3556096ab86796a6753d2e4d1 Mon Sep 17 00:00:00 2001 From: scmacdon <scmacdon@amazon.com> Date: Mon, 27 Jan 2025 11:54:38 -0500 Subject: [PATCH 09/10] rolled in review comments --- .../s3/src/main/java/com/example/s3/ListBuckets.java | 5 ----- .../com/example/s3/lockscenario/CreateObjectLockRole.java | 1 - 2 files changed, 6 deletions(-) diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java b/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java index 1e776d17a9e..b5c4ef0a070 100644 --- a/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java +++ b/javav2/example_code/s3/src/main/java/com/example/s3/ListBuckets.java @@ -6,12 +6,7 @@ // snippet-start:[s3.java2.list.buckets.main] import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; -import software.amazon.awssdk.services.s3.model.Bucket; -import software.amazon.awssdk.services.s3.model.ListBucketsResponse; import software.amazon.awssdk.services.s3.paginators.ListBucketsIterable; - -import java.util.List; - /** * Before running this Java V2 code example, set up your development * environment, including your credentials. diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java b/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java index 4cdb455a3b0..8dec910af3a 100644 --- a/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java +++ b/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java @@ -28,7 +28,6 @@ public static void main(String[] args) { } // snippet-start:[S3Lock.javav2.lock.role.main] - /** * Creates an IAM role for AWS S3 Batch Operations to manage object locks. */ From ebcb3b98a525c277469a8ea66f47a9598828f334 Mon Sep 17 00:00:00 2001 From: scmacdon <scmacdon@amazon.com> Date: Mon, 27 Jan 2025 14:08:57 -0500 Subject: [PATCH 10/10] rolled in review comments made by S3 team --- .doc_gen/metadata/s3-control_metadata.yaml | 2 +- .../s3/{lockscenario => batch}/CreateObjectLockRole.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename javav2/example_code/s3/src/main/java/com/example/s3/{lockscenario => batch}/CreateObjectLockRole.java (98%) diff --git a/.doc_gen/metadata/s3-control_metadata.yaml b/.doc_gen/metadata/s3-control_metadata.yaml index 589285de221..5b34a0a4eac 100644 --- a/.doc_gen/metadata/s3-control_metadata.yaml +++ b/.doc_gen/metadata/s3-control_metadata.yaml @@ -33,7 +33,7 @@ s3-control_CreateJob: - description: Create a legal hold off job. snippet_tags: - s3control.java2.create_job.compliance.main - - description: Create a new governance retemtion job. + - description: Create a new governance retention job. snippet_tags: - s3.java2.create_governance_retemtion.main services: diff --git a/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java b/javav2/example_code/s3/src/main/java/com/example/s3/batch/CreateObjectLockRole.java similarity index 98% rename from javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java rename to javav2/example_code/s3/src/main/java/com/example/s3/batch/CreateObjectLockRole.java index 8dec910af3a..6cc3c9ea2df 100644 --- a/javav2/example_code/s3/src/main/java/com/example/s3/lockscenario/CreateObjectLockRole.java +++ b/javav2/example_code/s3/src/main/java/com/example/s3/batch/CreateObjectLockRole.java @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 -package com.example.s3.lockscenario; +package com.example.s3.batch; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.iam.IamClient;