やったこと
2024/10/14時点の情報です!
- EC2にAirbyte version1.1.0をinstallし直したが、destination(S3)の設定で認証エラーが発生
- version 0.63では正常に設定できていたはずなのに..
- AirbyteコミュニティのSlackを漁って解決方法を見つけた
背景
Airbyteのversionは1.1.0
EC2(IMDSv2, t3.large)
destinationにS3を指定して、bucket名はpath情報を入力し
接続テストを行う段階でエラーが発生
なおEC2にはinstance profileを設定しているので、AWSのsecret access keyなどの入力は不要なはず
Airbyteのドキュメントもそう記載されているし、Airbyte version0.63では同じ設定で接続が成功していました
Configuration check failed
Could not connect to the S3 bucket with the provided configuration. Unable to load AWS credentials from any provider in the chain: [EnvironmentVariableCredentialsProvider: Unable to load AWS credentials from environment variables (AWS_ACCESS_KEY_ID (or AWS_ACCESS_KEY) and AWS_SECRET_KEY (or AWS_SECRET_ACCESS_KEY)), SystemPropertiesCredentialsProvider: Unable to load AWS credentials from Java system properties (aws.accessKeyId and aws.secretKey), WebIdentityTokenCredentialsProvider: You must specify a value for roleArn and roleSessionName, com.amazonaws.auth.profile.ProfileCredentialsProvider@552ed807: profile file cannot be null, com.amazonaws.auth.EC2ContainerCredentialsProviderWrapper@387bf2d9: Unauthorized (Service: null; Status Code: 401; Error Code: null; Request ID: null; Proxy: null)]
解決方法
Airbyteコミュニティのslackで既に解決方法が公開されていました(メッセージの転記は控えます)
EC2のmetadata_optionsのhttp_put_response_hop_limit
の値を変更することで、正常にdestination(S3)の接続テストが成功しました
Access instance metadata for an EC2 instance – Amazon Elastic Compute Cloud
In a container environment, set the hop limit to 2
terraformのコードではここを追記することで解決しました
resource "aws_instance" "datalake_airbyte" {
...
metadata_options {
http_endpoint = "enabled" # これがないとbuild時にエラーが発生する
http_put_response_hop_limit = 3 # defaultが2
}
...
}
今回設定変更したhttp_put_response_hop_limitについてChatGPTについて聞いてみた
ホップ数が低い場合(例: 1や2):メタデータサービスにアクセスするために必要なネットワーク層が複数ある場合、リクエストが途中で失敗する可能性があります。たとえば、DockerやKubernetesのように仮想ネットワークやコンテナが複数の層を追加する環境では、ホップ数が足りないとIMDSに到達できません。
このホップ数が足りてないためairbyte自身がIMDS(EC2内部の情報)にアクセスできなかったみたい
IMDS(EC2内部の情報)にawsの認証情報(instance profile)含まれていると想像
まとめ
あくまで2024/10/14時点の情報です!