2017-03-01 12 views
2

オンラインで読んだ内容に基づいてAWS Athenaに接続しようとしていますが、問題が発生しています。R AWSに接続するAthena

  • 更新するJava
  • を取っ

    手順ユーザーとユーザー/アクセスキー/秘密鍵

  • に渡す
  • パスアクセスキー/秘密鍵を交換/

にだけでなく任意のアイデアを渡しますか?

エラーメッセージ:

.jcallでのエラー(DRVする@ jdrv、 "Ljava/SQL /接続;"、 "接続"、as.character(URL)[1]: のjava.sql .SQLException:AWS accessId /秘密鍵やAWSの資格情報プロバイダが

システム情報

sysname       release          version 
    "Linux"       "4.4.0-62-generic"  "#83-Ubuntu SMP Wed Jan 18 14:10:15 UTC 2017" 
    nodename       machine          login 
"ip-***-**-**-***"     "x86_64"          "unknown" 
    user        effective_user 
"rstudio"       "rstudio" 

コードを提供しなければなりません

library(RJDBC) 

URL <- 'https://s3.amazonaws.com/athena-downloads/drivers/AthenaJDBC41-1.0.0.jar' 
fil <- basename(URL) 
if (!file.exists(fil)) download.file(URL, fil) 

drv <- JDBC(driverClass="com.amazonaws.athena.jdbc.AthenaDriver", fil, identifier.quote="'") 

con <- jdbcConnection <- dbConnect(drv, 'jdbc:awsathena://athena.us-east-1.amazonaws.com:443/', 
            s3_staging_dir="s3://mybucket", 
            user=Sys.getenv("myuser"), 
            password=Sys.getenv("mypassword")) 

答えて

5

アテナJDBCドライバがpasswordとしてuserとして、あなたのAWSアクセスキーIDを期待して、秘密鍵れる:

accessKeyId <- "your access key id..." 
secretKey <- "your secret key..." 

jdbcConnection <- dbConnect(
    drv, 
    'jdbc:awsathena://athena.us-east-1.amazonaws.com:443', 
    s3_staging_dir="s3://mybucket", 
    user=accessKeyId, 
    password=secretKey 
) 

R-ブロガーの記事を使用して環境変数からのものを取得し、 Sys.getenv("ATHENA_USER")Sys.getenv("ATHENA_PASSWORD")ですが、これはオプションです。


更新:

@Samは、資格情報プロバイダは、AWSの資格情報を処理するためのベストプラクティスであることを正しいRからアテナドライバで資格情報プロバイダを使用します。私はDefaultCredentialsProviderChainお勧めします、それは、CLIプロファイル、環境変数など

  1. からロード資格のためのいくつかのオプションAWS SDK for Javaをダウンロードし、特に(lib)からSDKジャーとサードパーティの依存関係のjarファイルのディレクトリ(third-party/libをカバー)。
  2. athenaConn <- dbConnect(
        athenaDriver, 
        'jdbc:awsathena://athena.us-east-1.amazonaws.com:443', 
        s3_staging_dir="s3://mybucket", 
        aws_credentials_provider_class="com.amazonaws.auth.DefaultAWSCredentialsProviderChain" 
    ) 
    

の取得による資格情報プロバイダクラスをロードするrJavaのクラスパス

# Load JAR Files 
library("rJava") 

.jinit() 

# Load AWS SDK jar 
.jaddClassPath("/path/to/aws-java-sdk-1.11.98/lib/aws-java-sdk-1.11.98.jar") 

# Add Third-Party JARs 
jarFilePaths <- dir("/path/to/aws-java-sdk-1.11.98/third-party/lib/", full.names=TRUE, pattern=".jar") 
for(i in 1:length(jarFilePaths)) { 
    .jaddClassPath(jarFilePaths[i]) 
} 
  • 設定アテナドライバにすべてのjarファイルを追加するためのRコードのビットを追加します。クラスパスの設定が重要です。 dbConnectが実行されると、AthenaドライバはJARから指定されたクラスをロードしようとします。これにより、すべての依存関係がロードされます。クラスパスは、SDKのJARが含まれていない場合は、次のようなエラーが表示されます。

    Error in .jcall([email protected], "Ljava/sql/Connection;", "connect", as.character(url)[1], : java.lang.NoClassDefFoundError: Could not initialize class com.amazonaws.auth.DefaultAWSCredentialsProviderChain

    をとサードパーティのJARを参照せずに、次のようなエラーが表示されることがあります。AWSへの新しい

    Error in .jcall([email protected], "Ljava/sql/Connection;", "connect", as.character(url)[1], : java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

  • +0

    おかげで、私の頭を傷つけていた。 – user2600629

    +0

    コードでAWS資格情報をハードコードするのではなく、IAMインスタンスプロファイルを使用する方がよいでしょう。以前は、IAMロールを使用してインスタンスを起動しただけの場合はロールを使用できましたが、AWSではRUNNINGインスタンスにもロールをアタッチできる機能を導入しましたが、AWS CLIでこれを行う必要があります。幸運 – Sam

    +2

    @Sam、資格情報プロバイダを使用することがベストプラクティスであることに同意します。代替案を説明するために答えを更新しました。私が好きかもしれないようにRで行うのは簡単ではありませんでした。 – James

    関連する問題