0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CDKにて、ECSタスクにEFSマウントをできず困った話

0
Posted at

こんにちは。
アシミネです。
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

error.png

「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ロールを渡せば、それらにアクセス権限を渡せるメソッドですね。

CDKDocument.png
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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?