기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
를 사용하여 IAM 정책 생성 AWS SDK for Java 2.x
IAM Policy BuilderAPI
JSON 문자열을 수동으로 조립하거나 파일을 읽IAM는 대신 는 JSON 문자열을 생성하기 위한 클라이언트 측 객체 지향 접근 방식을 API 제공합니다. 기존 정책을 JSON 형식으로 읽으면 는 처리를 위해 해당 IAM 정책을 IamPolicy
IAM Policy Builder는 의 버전 2.20.105에서 API 사용할 수 SDK있으므로 Maven 빌드 파일에서 해당 버전 이상을 사용합니다. 의 최신 버전 번호는 Maven 중앙 에 나열되어
다음 코드 조각은 Maven pom.xml
파일의 종속성 블록 예제를 보여줍니다. 이렇게 하면 프로젝트API에서 IAM Policy Builder를 사용할 수 있습니다.
<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>iam-policy-builder</artifactId> <version>
2.27.21
</version> </dependency>
IamPolicy
생성
이 섹션에서는 IAM Policy Builder를 사용하여 정책을 빌드하는 방법의 몇 가지 예를 보여줍니다API.
다음 각 예제에서 IamPolicy.Builder
로 시작하여 addStatement
메서드를 사용하여 명령문을 하나 이상 추가합니다. 이 패턴에 따라 IamStatement.Builder
예제: 시간 기반 정책을 생성
다음 예제는 두 시점 사이에 Amazon DynamoDBGetItem
작업을 허용하는 자격 증명 기반 정책을 생성합니다.
public String timeBasedPolicyExample() { IamPolicy policy = IamPolicy.builder() .addStatement(b -> b .effect(IamEffect.ALLOW) .addAction("dynamodb:GetItem") .addResource(IamResource.ALL) .addCondition(b1 -> b1 .operator(IamConditionOperator.DATE_GREATER_THAN) .key("aws:CurrentTime") .value("2020-04-01T00:00:00Z")) .addCondition(b1 -> b1 .operator(IamConditionOperator.DATE_LESS_THAN) .key("aws:CurrentTime") .value("2020-06-30T23:59:59Z"))) .build(); // Use an IamPolicyWriter to write out the JSON string to a more readable format. return policy.toJson(IamPolicyWriter.builder() .prettyPrint(true) .build()); }
이전 예제의 마지막 문은 다음 JSON 문자열을 반환합니다.
이 예제에 대한 자세한 내용은 AWS Identity and Access Management 사용 설명서를 참조하세요.
{ "Version" : "2012-10-17", "Statement" : { "Effect" : "Allow", "Action" : "dynamodb:GetItem", "Resource" : "*", "Condition" : { "DateGreaterThan" : { "aws:CurrentTime" : "2020-04-01T00:00:00Z" }, "DateLessThan" : { "aws:CurrentTime" : "2020-06-30T23:59:59Z" } } }
예제: 여러 조건 지정
이 예제는 특정 DynamoDB 속성에 대한 액세스를 허용하는 아이덴티티 기반 정책을 생성하는 방법을 보여줍니다. 정책에는 두 가지 조건이 있습니다.
public String multipleConditionsExample() { IamPolicy policy = IamPolicy.builder() .addStatement(b -> b .effect(IamEffect.ALLOW) .addAction("dynamodb:GetItem") .addAction("dynamodb:BatchGetItem") .addAction("dynamodb:Query") .addAction("dynamodb:PutItem") .addAction("dynamodb:UpdateItem") .addAction("dynamodb:DeleteItem") .addAction("dynamodb:BatchWriteItem") .addResource("arn:aws:dynamodb:*:*:table/table-name") .addConditions(IamConditionOperator.STRING_EQUALS.addPrefix("ForAllValues:"), "dynamodb:Attributes", List.of("column-name1", "column-name2", "column-name3")) .addCondition(b1 -> b1.operator(IamConditionOperator.STRING_EQUALS.addSuffix("IfExists")) .key("dynamodb:Select") .value("SPECIFIC_ATTRIBUTES"))) .build(); return policy.toJson(IamPolicyWriter.builder() .prettyPrint(true).build()); }
이전 예제의 마지막 문은 다음 JSON 문자열을 반환합니다.
이 예제에 대한 자세한 내용은 AWS Identity and Access Management 사용 설명서를 참조하세요.
{ "Version" : "2012-10-17", "Statement" : { "Effect" : "Allow", "Action" : [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:BatchWriteItem" ], "Resource" : "arn:aws:dynamodb:*:*:table/table-name", "Condition" : { "ForAllValues:StringEquals" : { "dynamodb:Attributes" : [ "column-name1", "column-name2", "column-name3" ] }, "StringEqualsIfExists" : { "dynamodb:Select" : "SPECIFIC_ATTRIBUTES" } } }
예제: 주체 지정
다음 예제는 조건에 지정된 주체를 제외한 모든 주체의 버킷 액세스를 거부하는 리소스 기반 정책을 생성하는 방법을 보여줍니다.
public String specifyPrincipalsExample() { IamPolicy policy = IamPolicy.builder() .addStatement(b -> b .effect(IamEffect.DENY) .addAction("s3:*") .addPrincipal(IamPrincipal.ALL) .addResource("arn:aws:s3:::BUCKETNAME/*") .addResource("arn:aws:s3:::BUCKETNAME") .addCondition(b1 -> b1 .operator(IamConditionOperator.ARN_NOT_EQUALS) .key("aws:PrincipalArn") .value("arn:aws:iam::444455556666:user/user-name"))) .build(); return policy.toJson(IamPolicyWriter.builder() .prettyPrint(true).build()); }
이전 예제의 마지막 문은 다음 JSON 문자열을 반환합니다.
이 예제에 대한 자세한 내용은 AWS Identity and Access Management 사용 설명서를 참조하세요.
{ "Version" : "2012-10-17", "Statement" : { "Effect" : "Deny", "Principal" : "*", "Action" : "s3:*", "Resource" : [ "arn:aws:s3:::BUCKETNAME/*", "arn:aws:s3:::BUCKETNAME" ], "Condition" : { "ArnNotEquals" : { "aws:PrincipalArn" : "arn:aws:iam::444455556666:user/user-name" } } } }
예제: 교차 계정 액세스를 허용
다음 예제에서는 업로드된 객체에 대한 전체 소유자 제어를 유지하면서 다른 이 버킷에 객체를 업로드 AWS 계정 하도록 허용하는 방법을 보여줍니다.
public String allowCrossAccountAccessExample() { IamPolicy policy = IamPolicy.builder() .addStatement(b -> b .effect(IamEffect.ALLOW) .addPrincipal(IamPrincipalType.AWS, "111122223333") .addAction("s3:PutObject") .addResource("arn:aws:s3:::amzn-s3-demo-bucket/*") .addCondition(b1 -> b1 .operator(IamConditionOperator.STRING_EQUALS) .key("s3:x-amz-acl") .value("bucket-owner-full-control"))) .build(); return policy.toJson(IamPolicyWriter.builder() .prettyPrint(true).build()); }
이전 예제의 마지막 문은 다음 JSON 문자열을 반환합니다.
이 예제에 대한 자세한 내용은 Amazon Simple Storage Service 사용 설명서를 참조하세요.
{ "Version" : "2012-10-17", "Statement" : { "Effect" : "Allow", "Principal" : { "AWS" : "111122223333" }, "Action" : "s3:PutObject", "Resource" : "arn:aws:s3:::amzn-s3-demo-bucket/*", "Condition" : { "StringEquals" : { "s3:x-amz-acl" : "bucket-owner-full-control" } } } }
와 IamPolicy
함께 사용 IAM
IamPolicy
인스턴스를 생성한 후 IamClient
다음 예제에서는 IAM 자격 증명이 accountID
파라미터로 지정된 계정의 DynamoDB 테이블에 항목을 쓸 수 있도록 허용하는 정책을 구축합니다. 그러면 정책이 JSON 문자열IAM로 에 업로드됩니다.
public String createAndUploadPolicyExample(IamClient iam, String accountID, String policyName) { // Build the policy. IamPolicy policy = IamPolicy.builder() // 'version' defaults to "2012-10-17". .addStatement(IamStatement.builder() .effect(IamEffect.ALLOW) .addAction("dynamodb:PutItem") .addResource("arn:aws:dynamodb:us-east-1:" + accountID + ":table/exampleTableName") .build()) .build(); // Upload the policy. iam.createPolicy(r -> r.policyName(policyName).policyDocument(policy.toJson())); return policy.toJson(IamPolicyWriter.builder().prettyPrint(true).build()); }
이 예제는 이전 예제를 기반으로 구축되었습니다. 코드는 정책을 다운로드하고 명령문을 복사하고 변경하여 이를 새 정책의 기초로 사용합니다. 그러면 새 정책이 업로드됩니다.
public String createNewBasedOnExistingPolicyExample(IamClient iam, String accountID, String policyName, String newPolicyName) { String policyArn = "arn:aws:iam::" + accountID + ":policy/" + policyName; GetPolicyResponse getPolicyResponse = iam.getPolicy(r -> r.policyArn(policyArn)); String policyVersion = getPolicyResponse.policy().defaultVersionId(); GetPolicyVersionResponse getPolicyVersionResponse = iam.getPolicyVersion(r -> r.policyArn(policyArn).versionId(policyVersion)); // Create an IamPolicy instance from the JSON string returned from IAM. String decodedPolicy = URLDecoder.decode(getPolicyVersionResponse.policyVersion().document(), StandardCharsets.UTF_8); IamPolicy policy = IamPolicy.fromJson(decodedPolicy); /* All IamPolicy components are immutable, so use the copy method that creates a new instance that can be altered in the same method call. Add the ability to get an item from DynamoDB as an additional action. */ IamStatement newStatement = policy.statements().get(0).copy(s -> s.addAction("dynamodb:GetItem")); // Create a new statement that replaces the original statement. IamPolicy newPolicy = policy.copy(p -> p.statements(Arrays.asList(newStatement))); // Upload the new policy. IAM now has both policies. iam.createPolicy(r -> r.policyName(newPolicyName) .policyDocument(newPolicy.toJson())); return newPolicy.toJson(IamPolicyWriter.builder().prettyPrint(true).build()); }
이전 예제는 다음 코드 조각에 표시된 것처럼 생성된 IamClient
인수를 사용합니다.
IamClient iam = IamClient.builder().region(Region.AWS_GLOBAL).build();
예제에서는 다음 JSON 문자열을 반환합니다.
First example { "Version" : "2012-10-17", "Statement" : { "Effect" : "Allow", "Action" : "dynamodb:PutItem", "Resource" : "arn:aws:dynamodb:us-east-1:
111122223333
:table/exampleTableName" } } Second example { "Version" : "2012-10-17", "Statement" : { "Effect" : "Allow", "Action" : [ "dynamodb:PutItem", "dynamodb:GetItem" ], "Resource" : "arn:aws:dynamodb:us-east-1:111122223333
:table/exampleTableName" } }