web-dev-qa-db-ja.com

S3バケットをファイルシステムとしてAWS ECSコンテナーにマウントする

Rexray/s3fsドライバーを使用してAWS ECS DockerコンテナーのボリュームとしてS3をマウントしようとしています。

プラグインをインストールしたローカルマシンでこれを行うことができます

$docker plugin install rexray/s3fs

dockerコンテナにS3バケットをマウントしました。

$docker plugin ls

ID                  NAME                 DESCRIPTION                                   ENABLED

3a0e14cadc17        rexray/s3fs:latest   REX-Ray Fuse Driver for Amazon Simple Storage   true 

$docker run -ti --volume-driver=rexray/s3fs -v s3-bucket:/data img

これをAWS ECSで複製しようとしています。

以下のドキュメントに従ってみました: https://docs.aws.Amazon.com/AmazonECS/latest/developerguide/docker-volumes.html

Driverの値を指定すると、タスクを実行できず、「すべての要件を満たすコンテナインスタンスがないため、タスクを配置できませんでした」と表示されます。エラー。

私はt2.mediumインスタンスを使用しており、タスクの要件を与えているため、ハードウェア要件の問題ではないはずです。

ジョブ定義からドライバ構成を削除すると、タスクが実行されます。

何かを設定するのに失敗しているようです。

誰かが同じことを試したり試したりしたことがありますか、知識を共有してください。

ありがとう!!

5
Pratik Mungekar

Rexray/s3fsドライバーを使用するアプローチは正しいです。

これらは、Amazon Linux 1で機能させるために私が従った手順です。

まず、s3fsをインストールする必要があります。

yum install -y gcc libstdc+-devel gcc-c+ Fuse fuse-devel curl-devel libxml2-devel mailcap automake openssl-devel git gcc-c++
git clone https://github.com/s3fs-Fuse/s3fs-Fuse
cd s3fs-Fuse/
./autogen.sh
./configure --prefix=/usr --with-openssl
make
make install

ドライバーをインストールします。アクセスキーやAWSリージョンの代わりにIAMロールを使用するなど、変更が必要なオプションがいくつかあります。

docker plugin install rexray/s3fs:latest S3FS_REGION=ap-southeast-2 S3FS_OPTIONS="allow_other,iam_role=auto,umask=000" LIBSTORAGE_INTEGRATION_VOLUME_OPERATIONS_MOUNT_ROOTPATH=/ --grant-all-permissions

ECSエージェントを再起動する非常に重要なステップです。私はまた、適度に更新します。

yum update -y ecs-init
service docker restart && start ecs

これで、タスク定義を作成する準備ができました。重要な部分は、次に示すボリューム構成です。

"volumes": [
  {
    "name": "name-of-your-s3-bucket",
    "Host": null,
    "dockerVolumeConfiguration": {
      "autoprovision": false,
      "labels": null,
      "scope": "shared",
      "driver": "rexray/s3fs",
      "driverOpts": null
    }
  }
]

次に、コンテナー定義でマウントポイントを指定するだけです。

"mountPoints": [
  {
    "readOnly": null,
    "containerPath": "/where/ever/you/want",
    "sourceVolume": "name-of-your-s3-bucket"
  }
]

これで、s3バケットにアクセスするための適切なIAM権限がある限り、コンテナーが起動し、s3をボリュームとして使用することができます。

「ATTRIBUTE」というタスクの実行中にエラーが発生した場合は、プラグインがec2インスタンスに正常にインストールされ、ecsエージェントが再起動されていることを再確認してください。また、ドライバ名が「rexray/s3fs」であることを再確認してください。

3
wimnat

Ecsクラスターec2インスタンスには、rexrayドライバーがインストールされている必要があります。このawsブログポストで、彼らはこれについて議論しています。 https://aws.Amazon.com/blogs/compute/Amazon-ecs-and-docker-volume-drivers-Amazon-ebs/

開始を支援するために、2ノードのECSクラスターを構築するAWS CloudFormationテンプレートを作成しました。テンプレートは、rexray/ebsボリュームドライバーを各ノードにブートストラップし、REX-Rayが必要とするAPIアクションを呼び出せるようにするインラインポリシーを持つIAMロールを割り当てます。

同じことがs3ドライバーにも当てはまります

2
Robert Hutto

ガイダンスを提供してくれた@wimnatに感謝します。

LaunchConfiguration UserDataを介してECSクラスターのEc2インスタンスにrexray/s3fsプラグインをインストールすることに関して、これは私が最終的に得たものです(AMIバージョンamzn-AMI-2018.03.o-Amazon-ecs-optimizedの場合):

  #install s3fs required by rexray/s3fs docker plugin
          yum install -y gcc libstdc+-devel gcc-c+ Fuse fuse-devel curl-devel libxml2-devel mailcap automake openssl-devel git gcc-c++
          git clone https://github.com/s3fs-Fuse/s3fs-Fuse
          cd s3fs-Fuse/
          ./autogen.sh
          ./configure --prefix=/usr --with-openssl
          make
          make install
          #install plugin to enable s3 volumes, using the task execution role to access s3.
          docker plugin install rexray/s3fs:0.11.1  S3FS_REGION=us-east-1 S3FS_OPTIONS="allow_other,iam_role=auto,umask=000" LIBSTORAGE_INTEGRATION_VOLUME_OPERATIONS_MOUNT_ROOTPATH=/ --grant-all-permissions

注意点:

  1. Rexray/s3fs:latestを使用すると、「docker volume ls」を実行するとボリュームが表示されましたが、ボリュームをマウントするとエラーが発生しました( https://github.com/rexray/rexray/issues/1187 )。
  2. バージョン付きのrexray/s3fsを使用している場合は、マウントを定義するときに、そのバージョンをドライバー名に含める必要があります。つまり、Driver: 'rexray/s3fs:0.11.1'
  3. コンテナーインスタンスに必要な属性があることを確認するには、aws-cliを使用できます:aws ecs list-attributes --cluster my-cluster --target-type container-instance --profile myprofile --attribute-name ecs.capability.docker -plugin.rexray/s3fs.0.11.1
  4. EcsエージェントはUserDataスクリプトの完了後に起動するようです。エージェントを再起動したり、エージェントが起動するのを待つ必要はありません。
    1. インストールは、デフォルトの暗号化が有効になっているバケット(AES256)で機能します。独自のkmskeyを使用してバケットを暗号化する場合は、暗号化/復号化を処理するための正しいs3fsオプションを提供する必要があります。私はこれを試していません。
0
jakobnordztrom

s3fsコマンドを直接実行してバケットをコンテナにマウントするだけで、s3fsをECSコンテナで動作させることができます。私はrexrayドライバーに精通していません。s3fsを使用するだけでいくつかの利点が得られる可能性がありますが、多くの使用例ではこれで十分に機能し、UserDataの編集は必要ありません。

コンテナのエントリポイントを次のように設定することで、少しスムーズになりました。

#!/bin/bash

bucket=my-bucket

s3fs ${bucket} /data -o ecs

echo "Mounted ${bucket} to /data"

exec "$@"

-o ecsオプションは、ECSタスクの役割を引き受けるために重要です。通常の-o iam_role=autos3fsを使用すると、ECSエージェントを実行するEC2インスタンスのIAMの役割を引き受けます。

注:s3fsによってインストールされたapt-get install s3fsのバージョンは古く、この記事の執筆時点ではこのオプションを利用できません。つまり、ソースからs3fsをインストールする必要がある場合があります。

0
qwwqwwq