私自身がコンテナや、コンテナ関連のAWSサービスについてはほぼ分からない状態だったのですが、そこからできる限り効率的に知識をキャッチアップしたくて学習したときの道のりです。同じように困っていらっしゃる方のお役に立てばと思い、記事にしてみました。この道のりの通りに進んでいただければ、時間を無駄にすることなく、多少なりともスムーズに知識をキャッチアップできると思います。主要な概念や全体像を理解するまでの道のりいきなり詳細に踏み込んでも、つまりいきなりFargateなどのAWSサービスを使っても、すぐに迷子になることは目に見えていましたので、まずは全体感や重要な概念、用語を理解しようと思いました。そこで色々と調べていると、次の記事を見つけました。ものすごく分かりやすかったです。)この記事で紹介されていた以下リンクも、後から読もうと思っています。)これを読んでよく分かったのは、以下の点です。Hubのようなもので、Dockerイメージを管理するところ。AWSだとECRがこれにあたる。それとは別次元で、以下がある。コントロールプレーンコンテナ数の管理など、コンテナの管理をするもの。データプレーンを起動する役割したりする。ECSがこれにあたる。データプレーン実際にコンテナが動く場所で、EC2やFargateがこれにあたる。上記の記事を読んでも、ECSのクラスター、サービス、タスク、コンテナの概念はよく分かりませんでした。Fargate)との違いについても、ほぼ理解できませんでした。いったトピックについては、以下の記事がとても分かりやすいです。)DockerコンテナをFargateで動かすことの素晴らしさこうやって調査をしていきますと、Fargateというサービスの何が素晴らしいのか、という点が見えてきました。Beanstalkなど)よりも自由度が高くなりIaaS(EC2など)よりも生産性が高くなる(DockerのインストールやOSセキュリティパッチの適用などから解放される)ということです。一言でいうと「良い塩梅でめっちゃいい」ということですね。EC2(つまりIaaS)でコンテナを動かすことはできます。それにはEC2インスタンスを構築し、Dockerという基盤をインストールする必要があります。OSセキュリティパッチなどの面倒を見続けなければなりません。それは、ものすごく大変なことです。そのあたりの大変さをAWSが引き受けてくれる、というのがFargateの素晴らしいところです。私たちは、Dockerイメージさえつくれば良いのです。いった点から、色々な制約はもちろんあるものの、マネージドの恩恵を最大限に受けるようにした方が得策だと感じてきました。build」と、docker-compose.ymlを使う「docker-compose」の関係Dockerについてまだ慣れていない私は、この二つの関係がよく分からず混乱していました。この点については、以下の記事で分かりやすく解説されています。buildを包含するもの」、ということです。docker-composeではDockerイメージのビルドや、他のDockerコンテナとの連携などを制御できます。Fargateを使って、Dockerイメージを動かしてみることにしました。Bootが動くコンテナをつくってみようと思いました。その際、以下の記事を参考にさせていただきました。)こちらの記事を参考に、以下のDockerfileを、Mavenプロジェクト直下に作成しました。["java","-jar","/my-app.jar"]そして、Dockerイメージをつくります。my-apptオプションは作成したイメージにどんな名前をつけるか、を指定するものです。ところが、このイメージの名前というものが意外に分かりづらいのです。ここに指定したものは、何を意味するのか、何に影響してくるのかが、分かりません。tオプションについては、以下の公式リファレンスで解説されています。http://docs.docker.jp/engine/reference/commandline/build.html#thttp://docs.docker.jp/engine/reference/commandline/tag.htmlしかし、これらを読んでもイマイチよく分かりません。他の記事を調べても「なるほど!そういうことか!」という思いに至ることができませんでした。公式リファレンスや先人の解説記事の内容をつなぎ合わせると、イメージ名は以下のものだと分かってきました。「イメージ名」とは?イメージ名というのは、全世界のなかでイメージを一意に特定するためのIDみたいなものです。やって一意に特定するのかというとどのレジストリで管理されているか?レジストリ、というのはDockerHubのようにDockerのイメージを管理するところです。平たく言うと、DockerHubなのか?ECRなのか?全く別のホストなのか?、ということです。ここにはホスト名やIPアドレス、およびポート名が記載されることになります。そのレジストリの中の、なんというリポジトリなのか?リポジトリというのは、レジストリの中にあるもので、Githubのリポジトリのようなものです。DockerHubではユーザー名によって名前空間が区切られていますから、ここが[ユーザー名]/[リポジトリ名]という構造になります。そのようにユーザー名で区切られていない場合は、シンプルに[リポジトリ名](スラッシュで区切られない)という感じです。そのリポジトリの中の、どのタグか。これもGithubのタグと同じようなものです。1.0とかバージョン番号にするのが典型ですね。-tのtオプションでタグ名を省略すると、latestがデフォルトで付きます。イメージ名は以上の3要素から構成され、具体的には以下の構造です。記述に基づいて、registry-1.docker.ioであると見なされます(つまりDockerHubだと見なされます)。タグ名が省略されていますので、latestがデフォルトで指定されます。以下で指定したのと同じ意味になる、ということだと私は解釈しています。registry-1.docker.io/my-app:latest作成したDockerイメージを、ECRに登録しますローカルPCで先ほどつくったDockerイメージを、ECRに登録していきます。この手順については公式ガイドで解説されています。https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/docker-basics.html#use-ecr以下、この公式ガイドの手順どおりに実行したことについて、解説してきます。ECRでは、レジストリはユーザー単位に作成されます。ここはDockerHubとは異なりますね。DockerHubは全体で一つのレジストリで、その中の名前空間をユーザー名で分割してる感じです。cliでログインしているユーザに紐づくレジストリとなります。このため、コマンドにはレジストリを指定する内容が出てきません。レジストリという自分専用の部屋に、今回のDockerイメージを格納するための空間(リポジトリ)を作成します。ap-northeast-1すると、以下の結果がかえってきます。}}次に、リポジトリーに登録したDockerイメージに、ECR用のイメージ名(tag)をつけます。{アカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/my-appここでついに、イメージ名にホスト名を明示的に追加したわけです。{アカウントID}.dkr.ecr.ap-northeast-1.amazonaws.comというECR上の私専用の部屋(レジストリにある、my-appというリポジトリに配置するイメージだよということを、イメージ名が表しています。タグについては省略しましたので、自動的に「latest」が付与されます。次に、レジストリ(ECR)にログインする必要があるのですが、「ログインするためのコマンド」を取得するためのコマンドを叩かねばなりません。ap-northeast-1すると、以下のコマンドを実行するよう、指示されます。{ものすごく長い文字列。時間有効な認証トークン、つまりパスワード。https://{アカウントID}.dkr.ecr.ap-northeast-1.amazonaws.comこのコマンドを実行してECRにログインします。(実際には、get-loginコマンドの結果をevalしたら楽だと思います)そして、さきほどつけたタグ名を指定して、ECRにイメージを登録します。credentialsが出てしまった場合は、以下を参考に対応しましょう。1160のようになります。管理コンソールから見ると・・・しっかり登録されています!よかった!ECRに登録したDockerイメージを、ECSを使ってFargateの上で動かします。次は、このECRに登録したdockerイメージを、Fargateの上で動かしてみましょう。Fargateで動くDockerコンテナの管理は、ECSで行います。この手順については、公式ガイドで解説されています。https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ECS_GetStarted_Fargate.htmlガイドに記載のとおり、以下ウィザードを使ってECSおよびFargateをセットアップできます。https://console.aws.amazon.com/ecs/home#/firstRun私が分かりづらかった点を、以下に記載します。Boot(のtomcat)が待ち受けているポート番号に指定します。Tomcatが5000番ポートをリッスンする設定にしているならば、5000を指定する必要があります。Fargateをつかう場合、前面で待ち受けるポートと、コンテナ側のポート番号は同じじゃないとダメみたいです。それはもはや「マッピング」ではないと思いますが・・。セキュリティグループのインバウンドルールポートマッピングでFargateが待ち受けるポート番号を、Tomcatが待ち受けるポート番号と同じにしないといけないので、そのポート番号でFargateへ流入してくるトラフィックを許可しないといけません。Fargateから他のAWSサービスを呼び出す場合は、権限設定が必要Fargateに限らない話ですが、他のAWSサービスを呼び出す権限がないのにそのサービスを呼び出そうとすると、エラーが起こります。Bootアプリ)から、DynamoDBを呼び出していました。endpoint]というエラーが出ていました。endpoint]これを素直に読めば「どこかにcredentialを置け」、と指示されていることになります。EC2のロールに権限をつけることで対象のサービスを呼び出したいところです。先ほどのエラーは、以下の流れを経て発生しています。タスクを実行するロールに、対象のAWSサービス(今回はDynamoDB)にアクセスする権限が付与されていない(上記エラーメッセージの4つ目が該当します)。しょうがなく、アクセスキーなどを探しにいったところ、見つからなかった(上記エラーメッセージの1つ目から3つ目が該当します)。いうことで、そもそもタスクを実行するロールに適切な権限さえついていれば、問題がないということです。これを実現するには、ECSのタスク定義でタスクロールを適切に設定すれば良いです。私の場合は、この「タスクロール」に何のロールも設定されていませんでした。ecsTaskExecutionRoleはデフォルトで用意されているもののようで、ひとまずこのロールを設定します。あとは、対象のAWSサービスを呼び出す権限を、このロールに付与すればOKです。ecsTaskExecutionRoleのリンクから、ロールの設定画面に飛べます。私の場合は、Fargateで動かすコンテナからDynamoDBを使いたいので、ここにAmazonDynamoDBFullAccessを付与してみました。(権限が強すぎるとは思いますが・・)すると、先ほどのエラーも出ず、通常どおりに動作しました!終わりに以上、私のキャッチアップの道のりをご紹介しました。cliの導入手順などは端折ってしまいましたが、誰かのお役に立てたらと思います。ご覧いただき、ありがとうございました。requestStockLike173nya-dora@nya-dora某大手SIerで勤務しています。個人的にデータサイエンスに取り組んでいます。好きなギタリストは、梶原順とHISASHIです。記事を書いていきたいと思います。upLoginユーザーは見つかりませんでした。