こちらでPrivateLink環境を構築し、
こちらでクロスアカウントのS3バケットにアクセスできるように設定しました。ここまででも結構な道のり。
問題なく接続できるだろうと思ったらエラーに。
Python
display(dbutils.fs.ls("s3a://ty-databricks-cross-account-bucket"))
org.apache.hadoop.net.ConnectTimeoutException: Instantiate shaded.databricks.org.apache.hadoop.fs.s3a.auth.AssumedRoleCredentialProvider on : com.amazonaws.SdkClientException: Unable to execute HTTP request: Connect to sts.amazonaws.com:443 [sts.amazonaws.com/54.239.21.217] failed: connect timed out
インスタンスプロファイルも設定して、クラスターのSpark設定も以下のようになっています。
fs.s3a.aws.credentials.provider org.apache.hadoop.fs.s3a.auth.AssumedRoleCredentialProvider
spark.databricks.hive.metastore.glueCatalog.enabled true
fs.s3a.assumed.role.arn arn:aws:iam::<S3バケットがあるAWSアカウントID>:role/bucket-owner-acct-s3-access-role
エラーメッセージをよく見てみると、Unable to execute HTTP request: Connect to sts.amazonaws.com:443 [sts.amazonaws.com/54.239.21.217] failed: connect timed out
であれっと。STSのリージョナルエンドポイントも設定しているのになぜグローバルURLにアクセスしているのか。
解決策はTroubleshoot regional endpointsに。Spark設定で明示的にリージョナルエンドポイントを参照するようにすることで解決しました。以下の2行を追加。リージョンはap-northeast-1
です。
spark.hadoop.fs.s3a.endpoint https://s3.ap-northeast-1.amazonaws.com
spark.hadoop.fs.s3a.stsAssumeRole.stsEndpoint https://sts.ap-northeast-1.amazonaws.com