翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
を使用して IAM ポリシーを作成する AWS SDK for Java 2.x
IAM Policy Builder API
この API では、JSON 文字列を手動で組み立てたりファイルを読み取ったりして IAM ポリシーを構築する代わりに、クライアント側のオブジェクト指向の方法で JSON 文字列を生成します。既存の IAM ポリシーを JSON 形式で読み取ると、API は処理のためにそれをIamPolicy
IAM Policy Builder API は SDK のバージョン 2.20.105 で利用できるようになったため、Maven ビルドファイルではそのバージョンまたはそれ以降のバージョンを使用してください。SDK の最新バージョン番号は Maven central にリスト
次のスニペットは、Maven pom.xml
ファイルの依存関係ブロック例を示しています。これにより、IAM Policy Builder API をプロジェクトで使用できるようになります。
<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>iam-policy-builder</artifactId> <version>
2.20.139
</version> </dependency>
IamPolicy
の作成
このセクションでは、IAM Policy Builder API を使用してポリシーを構築する方法の例をいくつか示します。
以下の各例では、IamPolicy.Builder
から始めて、addStatement
メソッドを使用して 1 つ以上のステートメントを追加します。このパターンに従って、IamStatement.Builder
例: 時間ベースのポリシーを作成する
次の例では、2 つの時点間の 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 文字列を返します。
この例の詳細については、「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 属性へのアクセスを許可する ID ベースポリシーを作成する方法を示します。ポリシーには 2 つの条件が含まれています。
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:::DOC-EXAMPLE-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:::DOC-EXAMPLE-BUCKET/*", "Condition" : { "StringEquals" : { "s3:x-amz-acl" : "bucket-owner-full-control" } } } }
IAM で IamPolicy
を使用する
IamPolicy
インスタンスを作成したら、IamClient
次の例では、IAM ID が 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" } }