기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
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();