こんにちは。
アシミネです。
CDK学習中の身です。
CDKにて、ECS Fargate で実行するタスクにEFSボリュームをマウントしようとしたところ、タスク起動エラーになり、これを解決できず困っていました。
単純に私がEFSの仕様理解不足が原因で、必要な設定が漏れていただけでしたが、せっかくなのでそのエラー内容と対処方法をここに残そうと思います。
どなたか同じエラーに苦しむ方の助けになれば幸いです。
それでは本題に参りましょう。
エラー:ResourceInitializationError
遭遇したエラーはこちら。
ResourceInitializationError: failed to invoke EFS utils commands to set up EFS volumes: stderr: b'mount.nfs4: access denied by server while mounting 127.0.0.1:/' : unsuccessful EFS utils command execution; code: 32
「EFSにアクセス拒否されて、EFSセットアップ用のコマンドが実行できない」といったことをタスク側が嘆いている感じですね。
このエラーが原因でタスクが起動失敗と判断され、いつまでたっても起動リトライを繰り返していました。
解決方法:IAM認証 & 転送暗号化を有効にする
私が書いたコードでは、IAM認証、さらに転送暗号化を有効にできていませんでした。
そのため、それらの有効化で無事にタスクが起動しました!
起動できた時のコードがこちら↓
import * as efs from 'aws-cdk-lib/aws-efs'
import { FargateTaskDefinition } from 'aws-cdk-lib/aws-ecs';
/////
略
/////
const fileSystem = efs.FileSystem(this, 'hoge', { 略 });
fileSystem.grantReadWrite(serviceTaskRole);
const taskDefinition = new FargateTaskDefinition(this, 'TaskDefinitionAshimine', {
taskRole: serviceTaskRole,
volumes: [
{
name: 'Efs',
efsVolumeConfiguration: {
fileSystemId: fileSystem.fileSystemId,
transitEncryption: 'ENABLED',
authorizationConfig: {
iam: 'ENABLED'
},
},
}
],
- 略 -
});
grantReadWriteメソッドにてタスクロールにアクセス権限を付与しています。
さらに、タスク定義を作成するFargateTaskDefinitionコンストラクトのvolumesプロパティにて、
transitEncryption: 'ENABLED',
authorizationConfig: { iam: 'ENABLED' },
と実装することでIAM認証と転送暗号化を有効化できます。
うーん、私がこれまでマネコンにてECSタスクを立ち上げる際、こんな設定をしなくてもエラーなくマウントできていました。(設定していないことは問題かもしれませんが、、、)
では、なぜ今回CDKにてこの設定が必要だったのでしょうか。
根本原因
結論、今回エラーになった原因は、grantReadWriteメソッドを利用しているのにIAM認証と転送暗号化を有効化していなかったこと、でした。
なぜこの設定が必要なのか。
説明していきますね。
grantReadWriteメソッド
今回、EFSへのアクセス権限付与にgrantReadWriteメソッドを利用しました。
引数にIAMユーザーもしくはIAMロールを渡せば、それらにアクセス権限を渡せるメソッドですね。

AWS CDK Reference Documentationより。
参考:https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_efs.FileSystem.html#grantwbrreadwbrwritegrantee
私はタスクロールをこのメソッドに渡したのですが、CDKは「そのIAMロール以外はアクセスを認めません」と認識します。
すると、タスクもEFSにアクセスする際には「ちゃんと認証されてるIAMロールを持ってますよ!」と宣言しなければいけないわけですね。
もともと私が書いたコードでは、タスク定義にてIAM認証を有効化していなかった = 手ぶらでEFSにアクセスしようとした結果、EFSから拒否されていたわけでした 😢
IAM認証の設定時には転送暗号化が必須となります。
それらはセットであると覚えておけばいいですね。
IAM認証と転送暗号化設定はベストプラクティス
ECSにEFSをマウントするときにはIAM認証・転送暗号化を設定することがベストプラクティスです。(参考:https://docs.aws.amazon.com/AmazonECS/latest/developerguide//efs-best-practices.html)
つまり、grantReadWriteメソッドを使うと、ベストプラクティスに則ることが必須になり、結果的に安全でベストな設計になるわけですね。
ベストプラクティスを知らなかった私が、エラー対処を経てベストな設計にすることができました。
これがCDKのいいところですね!
さいごに
エラーにぶつかり、それを乗り越え、こういったアウトプットとして形にできる経験/得られる達成感は自己を肯定してくれますね。
引き続きアウトプット頑張っていきます。
先に紹介したベストプラクティスのドキュメントを読み、その内容を記事にまとめました。
もしよければこちらもどうぞ。→https://qiita.com/Ashi_Cloud/items/15cfbdf94268894d7669
