Gremlin JavaIAM와 함께 를 사용하여 Amazon Neptune 데이터베이스에 연결 - Amazon Neptune

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

Gremlin JavaIAM와 함께 를 사용하여 Amazon Neptune 데이터베이스에 연결

TinkerPop 3.4.11 이상을 사용하여 Sig4 서명으로 Neptune에 연결

다음은 TinkerPop 3.4.11 이상을 사용할 때 Sig4 서명과 API 함께 Gremlin Java를 사용하여 Neptune에 연결하는 방법의 예입니다(Maven 사용에 대한 일반적인 지식을 가정합니다). 먼저 종속성을 pom.xml 파일의 일부로 정의합니다.

<dependency> <groupId>com.amazonaws</groupId> <artifactId>amazon-neptune-sigv4-signer</artifactId> <version>2.4.0</version> </dependency>

그런 다음 아래와 같은 코드를 사용합니다.

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) .handshakeInterceptor( r -> { try { NeptuneNettyHttpSigV4Signer sigV4Signer = new NeptuneNettyHttpSigV4Signer("(your region)", new DefaultAWSCredentialsProviderChain()); 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); }
참고

3.4.11에서 업그레이드하는 경우 amazon-neptune-gremlin-java-sigv4 라이브러리에 대한 참조를 제거하세요. 위의 예제와 같이 handshakeInterceptor()를 사용하면 더 이상 필요하지 않습니다. 오류가 발생할 수 있으므로, handshakeInterceptor()를 채널라이저(SigV4WebSocketChannelizer.class)와 함께 사용하지 마세요.

교차 계정 IAM 인증

Amazon Neptune은 역할 체인이라고도 하는 역할 가정을 사용하여 교차 계정 IAM 인증을 지원합니다. 다른 AWS 계정에 호스팅된 애플리케이션에서 Neptune 클러스터에 대한 액세스를 제공하려면:

  • IAM 사용자 또는 역할이 다른 역할을 수임할 수 있도록 허용하는 신뢰 정책을 사용하여 애플리케이션 AWS 계정에서 새 사용자 또는 IAM 역할을 생성합니다. 애플리케이션을 호스팅하는 컴퓨팅(EC2인스턴스, Lambda 함수, ECS 태스크 등)에 이 역할을 할당합니다.

    { "Version": "2012-10-17", "Statement": [ { "Sid": "assume-role-policy", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "(ARN of the role in the database account)" } ] }
  • Neptune 데이터베이스 AWS 계정에 새 IAM 역할을 생성하여 Neptune 데이터베이스에 대한 액세스를 허용하고 애플리케이션 계정 IAM 사용자/역할의 역할 가정을 허용합니다. 신뢰 정책 사용:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "(ARN of application account IAM user or role)" ] }, "Action": "sts:AssumeRole", "Condition": {} } ] }
  • 다음 코드 예제를 사용하여 애플리케이션이 Neptune에 액세스할 수 있도록 허용하기 위해 이 두 역할을 사용하는 방법에 대한 지침으로 사용합니다. 이 예제에서는 를 생성할 DefaultCredentialProviderChain 때 를 통해 애플리케이션 계정 역할을 수임합니다STSclient. 그런 다음 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) .handshakeInterceptor( 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(); }

3.4.11 이전 버전의 TinkerPop 를 사용하여 Sig4 서명으로 Neptune에 연결

TinkerPop 이전 버전3.4.11이전 섹션에 표시된 handshakeInterceptor() 구성을 지원하지 않으므로 amazon-neptune-gremlin-java-sigv4 패키지에 의존해야 합니다. 이 라이브러리는 SigV4WebSocketChannelizer 클래스를 포함하는 Neptune 라이브러리로, 표준 TinkerPop Channelizer를 SigV4 서명을 자동으로 주입할 수 있는 것으로 대체합니다. amazon-neptune-gremlin-java-sigv4 라이브러리가 더 이상 사용되지 않으므로 가능하면 TinkerPop 3.4.11 이상으로 ugrade합니다.

다음은 3.4.11 이전 TinkerPop 버전을 사용할 때 Sig4 서명과 API 함께 Gremlin Java를 사용하여 Neptune에 연결하는 방법의 예입니다(Maven 사용 방법에 대한 일반적인 지식을 가정합니다).

먼저 종속성을 pom.xml 파일의 일부로 정의합니다.

<dependency> <groupId>com.amazonaws</groupId> <artifactId>amazon-neptune-gremlin-java-sigv4</artifactId> <version>2.4.0</version> </dependency>

위의 종속성에는 Gremlin 드라이버 버전 3.4.10이 포함됩니다. 최신 Gremlin 드라이버 버전(3.4.13까지)을 사용할 수 있지만, 드라이버를 3.4.11 이상으로 업그레이드하려면 위에서 설명한 handshakeInterceptor() 모델을 사용하기 위한 변경 사항이 포함되어야 합니다.

그런 다음 Java 코드에서 아래와 같이 gremlin-driver 클러스터 객체를 구성해야 합니다.

import org.apache.tinkerpop.gremlin.driver.SigV4WebSocketChannelizer; ... Cluster cluster = Cluster.build(your cluster) .enableSsl(true) .channelizer(SigV4WebSocketChannelizer.class) .create(); Client client = cluster.connect(); client.submit("g.V().has('code','IAD')").all().get();