

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 를 사용하여 IAM 정책 생성 AWS SDK for Java 2.x
<a name="feature-iam-policy-builder"></a>

[IAM 정책 빌더 API](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/package-summary.html)는 Java에서 [IAM 정책을](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html) 빌드하고 AWS Identity and Access Management (IAM)에 업로드하는 데 사용할 수 있는 라이브러리입니다.

JSON 문자열을 수동으로 조합하거나 파일을 읽어 IAM 정책을 구축하는 대신 API는 JSON 문자열을 생성하기 위한 클라이언트 측 객체 지향 접근 방식을 제공합니다. JSON 형식의 기존 IAM 정책을 읽으면 API가 이를 [IamPolicy](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamPolicy.html) 인스턴스로 변환하여 처리합니다.

IAM 정책 빌더 API는 SDK 버전 2.20.105에서 사용할 수 있으므로 Maven 빌드 파일에서 해당 버전 또는 이후 버전을 사용하세요. SDK의 최신 버전 번호는 [Maven 센트럴에 나와 있습니다](https://central.sonatype.com/artifact/software.amazon.awssdk/iam-policy-builder).

다음 코드 조각은 Maven `pom.xml` 파일의 종속성 블록 예제를 보여줍니다. 이를 통해 프로젝트에서 IAM 정책 빌더 API를 사용할 수 있습니다.

```
<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>iam-policy-builder</artifactId>
    <version>2.27.21</version>
</dependency>
```

## `IamPolicy` 생성
<a name="iam-policy-builder-create"></a>

이 단원에서는 IAM Policy Builder API를 사용하여 정책을 구축하는 방법에 대한 몇 가지 예제를 보여줍니다.

다음 각 예제에서 `[IamPolicy.Builder](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamPolicy.Builder.html)`로 시작하여 `addStatement` 메서드를 사용하여 명령문을 하나 이상 추가합니다. 이 패턴에 따라 [IamStatement.Builder](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/policybuilder/iam/IamStatement.Builder.html)에는 명령문에 효과, 액션, 리소스 및 조건을 추가하는 메서드가 있습니다.

### 예제: 시간 기반 정책을 생성
<a name="iam-policy-builder-create-ex-time-based"></a>

다음 예제는 두 시점 사이에 Amazon DynamoDB`GetItem` 작업을 허용하는 자격 증명 기반 정책을 생성합니다.

```
    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 출력
<a name="iam-builder-ex-json-date"></a>

이전 예제의 마지막 문은 다음 JSON 문자열을 반환합니다.

이 [예제](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_aws-dates.html)에 대한 자세한 내용은 *AWS Identity and Access Management 사용 설명서*를 참조하세요.

------
#### [ JSON ]

****  

```
{
    "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"
            }
        }
    }
}
```

------

### 예제: 여러 조건 지정
<a name="iam-policy-builder-create-ex-multi-conditions"></a>

이 예제는 특정 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 출력
<a name="iam-builder-ex-json-multi-cond"></a>

이전 예제의 마지막 문은 다음 JSON 문자열을 반환합니다.

이 [예제](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_dynamodb_attributes.html)에 대한 자세한 내용은 *AWS Identity and Access Management 사용 설명서*를 참조하세요.

------
#### [ JSON ]

****  

```
{
    "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"
            }
        }
    }
}
```

------

### 예제: 주체 지정
<a name="iam-policy-builder-create-ex-principals"></a>

다음 예제는 조건에 지정된 주체를 제외한 모든 주체의 버킷 액세스를 거부하는 리소스 기반 정책을 생성하는 방법을 보여줍니다.

```
    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 출력
<a name="iam-policy-builder-create-json-ex-principals"></a>

이전 예제의 마지막 문은 다음 JSON 문자열을 반환합니다.

이 [예제](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html#principal-anonymous)에 대한 자세한 내용은 *AWS Identity and Access Management 사용 설명서*를 참조하세요.

------
#### [ JSON ]

****  

```
{
  "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"
      }
    }
  }
}
```

------

### 예제: 교차 계정 액세스를 허용
<a name="iam-policy-builder-create-ex-cross-account"></a>

다음 예제에서는 업로드된 객체에 대한 전체 소유자 제어를 유지하면서 다른이 버킷에 객체를 업로드 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 출력
<a name="iam-policy-builder-create-ex-json-cross-account"></a>

이전 예제의 마지막 문은 다음 JSON 문자열을 반환합니다.

이 [예제](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html#example-bucket-policies-acl-2)에 대한 자세한 내용은 *Amazon Simple Storage Service 사용 설명서*를 참조하세요.

------
#### [ JSON ]

****  

```
{
  "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"
      }
    }
  }
}
```

------

## IAM과 함께 `IamPolicy` 사용
<a name="iam-policy-builder-work-with-service"></a>

`IamPolicy` 인스턴스를 생성한 후에는 [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/iam/IamClient.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/iam/IamClient.html)를 사용하여 IAM 서비스를 사용할 수 있습니다.

다음 예제는 [IAM ID](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html)가 `accountID` 파라미터로 지정된 계정의 DynamoDB 테이블에 항목을 쓸 수 있도록 허용하는 정책을 작성합니다. 그러면 정책이 IAM에 JSON 문자열로 업로드됩니다.

```
    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
<a name="iam-policy-builder-work-with-serivce-create-client"></a>

이전 예제는 다음 코드 조각에 표시된 것처럼 생성된 `IamClient` 인수를 사용합니다.

```
IamClient iam = IamClient.builder().region(Region.AWS_GLOBAL).build();
```

### JSON 형식의 정책
<a name="iam-policy-builder-work-with-serivce-json"></a>

예제에서는 다음 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"
  }
}
```