事象
AWS ECSのサービスを新しく作ってNode.js製のプロジェクトを動かしたら、以下のエラーになった。
[ERROR] Error [CredentialsError]: Missing credentials in config, if using AWS_CONFIG_FILE, set AWS_SDK_LOAD_CONFIG=1
設定確認
このプロジェクトではS3などのAWSサービスを利用しているのでAWSの認証情報を設定する箇所がある。
設定は以下
const aws = require('aws-sdk')
if (process.env.LOCAL == 'true') {
// ローカル開発環境なら~/.aws/credentialsを参照する
aws.config.credentials = new aws.SharedIniFileCredentials()
} else {
// ECSならECSのロールを参照する
aws.config.credentials = new aws.ECSCredentials({
httpOptions: { timeout: 5000 },
maxRetries: 10,
retryDelayOptions: { base: 200 },
})
}
aws.config.region = "ap-northeast-1"
module.exports = aws
コメントにある通り、ローカル開発環境ではローカル環境の認証設定ファイルを参照し、ECSならECSのロールを見るようになっているはず。
なのでエラーの if using AWS_CONFIG_FILE ・・・
には該当しない
解決
ダメなのはロール設定の方だった
↑ タスクロールの方にS3参照権限ポリシを持つロールを割り当てたら動いた
メモ
タスクロールとタスク実行ロールの違いは
- タスクロール: ECSのコンテナ内からAWSの別のサービスにアクセスする時のロールを割り当てる
- タスク実行ロール: ECSコンテナを立ち上げるエージェントのロールを割り当てる。(上のようにコンテナの中身がすることには関与しない)例えばログをCloudWatchに保存するなどはこっちのロールになる。
以上。
参考
参考にさせていただきました