기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
Gremlin Java와 함께 IAM을 사용하여 Amazon Neptune 데이터베이스에 연결
다음은 Sigv4 서명과 함께 Gremlin Java 드라이버를 사용하여 Neptune에 연결하는 방법의 예입니다(Maven 사용에 대한 일반적인 지식을 가정함).
참고
다음 예제는 requestInterceptor() 사용을 포함하도록 업데이트되었습니다. 이는 TinkerPop 3.6.6에 추가되었습니다. TinkerPop 버전 3.6.6 이전에는 코드 예제에서 해당 릴리스에서 더 이상 사용되지 않는 handshakeInterceptor()를 사용했습니다.
<dependency> <groupId>com.amazonaws</groupId> <artifactId>amazon-neptune-sigv4-signer</artifactId> <version>3.1.0</version> </dependency>
Amazon Neptune SigV4 서명자는 AWS Java SDK 버전 1.x 및 2.x 사용을 모두 지원합니다. 다음 예제는 2.x를 사용하며, 여기서 DefaultCredentialsProvider는 software.amazon.awssdk.auth.credentials.AwsCredentialsProvider 인스턴스이지만, 1.x 형식도 com.amazonaws.auth.AWSCredentialsProvider를 사용하여 동일하게 사용할 수 있습니다. 1.x에서 2.x로 업그레이드하는 경우 Java 2.x용 AWS SDK 설명서의 자격 증명 공급자 변경 사항에서 1.x와 2.x 간의 변경 사항에 대해 자세히 알아볼 수 있습니다.
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain; import com.amazonaws.neptune.auth.NeptuneNettyHttpSigV4Signer; import com.amazonaws.neptune.auth.NeptuneSigV4SignerException;...System.setProperty("aws.accessKeyId","your-access-key"); System.setProperty("aws.secretKey","your-secret-key");...Cluster cluster = Cluster.build((your cluster)) .enableSsl(true) .requestInterceptor( r -> { try { NeptuneNettyHttpSigV4Signer sigV4Signer = new NeptuneNettyHttpSigV4Signer("(your region)", DefaultCredentialsProvider.create()); sigV4Signer.signRequest(r); } catch (NeptuneSigV4SignerException e) { throw new RuntimeException("Exception occurred while signing the request", e); } return r; } ).create(); try { Client client = cluster.connect(); client.submit("g.V().has('code','IAD')").all().get(); } catch (Exception e) { throw new RuntimeException("Exception occurred while connecting to cluster", e); }
교차 계정 IAM 인증
Amazon Neptune은 역할 체인이라고도 하는 역할 가정을 사용하여 교차 계정 IAM 인증을 지원합니다. 다른 AWS 계정에 호스팅된 애플리케이션에서 Neptune 클러스터에 대한 액세스를 제공하려면:
-
사용자 또는 역할이 다른 IAM 역할을 수임하도록 허용하는 신뢰 정책을 사용하여 애플리케이션 AWS 계정에서 새 IAM 사용자 또는 역할을 생성합니다. 애플리케이션을 호스트하는 컴퓨팅(EC2 인스턴스, Lambda 함수, ECS 태스크 등)에 이 역할을 할당합니다.
-
Neptune 데이터베이스 AWS 계정에서 Neptune 데이터베이스에 대한 액세스를 허용하고 애플리케이션 계정 IAM 사용자/역할의 역할 가정을 허용하는 새 IAM 역할을 생성합니다. 다음과 같은 신뢰 정책을 사용합니다.
-
다음 코드 예제를 이 두 역할을 사용하여 애플리케이션이 Neptune에 액세스하도록 허용하는 방법에 대한 지침으로 사용합니다. 이 예제에서는
STSclient를 생성할 때 DefaultCredentialProviderChain을 통해 애플리케이션 계정 역할이 인수됩니다. 그런 다음STSclient를 통해STSAssumeRoleSessionCredentialsProvider를 사용하여 Neptune 데이터베이스 AWS 계정에서 호스팅되는 역할을 수임합니다.public static void main( String[] args ) { /* * Establish an STS client from the application account. */ AWSSecurityTokenService client = AWSSecurityTokenServiceClientBuilder .standard() .build(); /* * Define the role ARN that you will be assuming in the database account where the Neptune cluster resides. */ String roleArnToAssume = "arn:aws:iam::012345678901:role/CrossAccountNeptuneRole"; String crossAccountSessionName = "cross-account-session-" + UUID.randomUUID(); /* * Change the Credentials Provider in the SigV4 Signer to use the STSAssumeRole Provider and provide it * with both the role to be assumed, the original STS client, and a session name (which can be * arbitrary.) */ Cluster cluster = Cluster.build() .addContactPoint("neptune-cluster.us-west-2.neptune.amazonaws.com") .enableSsl(true) .port(8182) .requestInterceptor( r -> { try { NeptuneNettyHttpSigV4Signer sigV4Signer = // new NeptuneNettyHttpSigV4Signer("us-west-2", new DefaultAWSCredentialsProviderChain()); new NeptuneNettyHttpSigV4Signer( "us-west-2", new STSAssumeRoleSessionCredentialsProvider .Builder(roleArnToAssume, crossAccountSessionName) .withStsClient(client) .build()); sigV4Signer.signRequest(r); } catch (NeptuneSigV4SignerException e) { throw new RuntimeException("Exception occurred while signing the request", e); } return r; } ).create(); GraphTraversalSource g = traversal().withRemote(DriverRemoteConnection.using(cluster)); /* whatever application code is necessary */ cluster.close(); }