[{"data":1,"prerenderedAt":515},["ShallowReactive",2],{"news-item-\u002Fja\u002Fnews\u002Fdeploying-node-app-to-ecs-with-docker":3},{"id":4,"title":5,"body":6,"category":503,"created by":504,"date":505,"description":12,"extension":506,"meta":507,"navigation":508,"path":509,"sections":510,"seo":511,"stem":512,"thumbnail":513,"__hash__":514},"content_ja\u002Fja\u002Fnews\u002Fdeploying-node-app-to-ecs-with-docker.md","Dockerを使ったECSへのNodeアプリ展開",{"type":7,"value":8,"toc":489},"minimark",[9,13,18,37,48,54,65,69,72,75,79,82,85,96,99,105,108,114,122,125,129,132,138,142,145,151,155,158,164,167,175,178,184,187,191,195,198,201,207,210,216,219,223,226,235,238,242,245,254,258,261,265,268,275,279,282,298,301,335,339,343,346,350,379,383,386,390,393,397,400,429,433,436,444,448,451,456,460,468,471,477,483],[10,11,12],"p",{},"この記事ではNode.jsアプリケーションをビルドし、Amazon Elastic Container Registry (ECR)およびAmazon Elastic Container Service (ECS)を用いてAmazon Web Services (AWS)へ展開することについてお話しします。具体的に言えば、以下のような手順があります。",[14,15,17],"h2",{"id":16},"_1-環境構築","1) 環境構築",[10,19,20,24,25,28,29,36],{},[21,22,23],"strong",{},"Node","と",[21,26,27],{},"Npmode","について ",[30,31,35],"a",{"href":32,"rel":33},"https:\u002F\u002Fnodejs.org\u002Fen\u002F",[34],"nofollow","こちら"," へアクセスしてから最新バージョンをインストールしてください。",[10,38,39,42,43,47],{},[21,40,41],{},"Docker","(ドッカー)について ",[30,44,35],{"href":45,"rel":46},"https:\u002F\u002Fdocs.docker.com\u002Finstall\u002F",[34]," へアクセスしてから最新バージョンをインストールしてください。",[10,49,50,53],{},[21,51,52],{},"AWS アカウント","について無料アカウントを登録しておいてください。",[10,55,56,59,60,64],{},[21,57,58],{},"AWS CLI","について",[30,61,35],{"href":62,"rel":63},"https:\u002F\u002Faws.amazon.com\u002Fcli\u002F",[34],"へアクセスしてから、お使いのOSに応じて手順を行ってください。",[14,66,68],{"id":67},"_2-dockerおよびawsの概要","2) DockerおよびAWSの概要",[10,70,71],{},"Dockerとは、どこへもプッシュし、実行できるコンテナを用いてアプリケーションと依存関係や環境変数をビルドするためのオープンソースソフトウェアをいいます。Dockerではハードウェアやフラットフォームから隔離しているのでコンテナに入るアプリケーションをどんな環境にも独立的に実行することができます。",[10,73,74],{},"Amazon Web Services (AWS)は費用のかからない拡張可能かつ安全なクラウドサービスを提供します。前述の如く、この記事ではECRとECSのサービスについてのみお話しします。",[14,76,78],{"id":77},"_3-nodejsアプリ作成","3) Node.jsアプリ作成",[10,80,81],{},"以下のように展開のためのサンプルアプリケーションを予め作成しておいてください。簡単なNode.jsアプリケーションで良いです。",[10,83,84],{},"端末に以下のように入力します。",[86,87,92],"pre",{"className":88,"code":90,"language":91},[89],"language-text","\u002F\u002F 新たなディレクトリー作成\n$ mkdir ecs-nodejs-app\n\n\u002F\u002F 作成したてのディレクトリーへの移動 \n$ cd ecs-nodejs-app\n\n\u002F\u002F npm初期化\n$ npm init -y\n\n\u002F\u002F expressインストール\n$ npm install express\n\n\u002F\u002F server.jsファイル作成\n$ touch server.js\n","text",[93,94,90],"code",{"__ignoreMap":95},"",[10,97,98],{},"server.jsファイルを開いて、以下のコードをそこにコピー・ペーストします。",[86,100,103],{"className":101,"code":102,"language":91},[89],"\u002F\u002F server.js\n\nconst express = require('express')\nconst app = express()\n\napp.get('\u002F', (req, res) => {\nres.send('Welcome from a Node.js app!')\n})\n\napp.listen(3000, () => {\nconsole.log('Server is up on 3000')\n})\n",[93,104,102],{"__ignoreMap":95},[10,106,107],{},"以下のコマンドでアプリケーションを起動します。",[86,109,112],{"className":110,"code":111,"language":91},[89],"$ node server.js\n",[93,113,111],{"__ignoreMap":95},[10,115,116,117,121],{},"ブラウザを開いて ",[30,118,119],{"href":119,"rel":120},"http:\u002F\u002Flocalost:3000",[34]," にアクセスすると、「Welcome from a Node.js app! 」が表示されます。",[10,123,124],{},"次の手順でアプリケーションをビルドします。",[14,126,128],{"id":127},"_4-dockerファイル作成","4) Dockerファイル作成",[10,130,131],{},"以下のように、ルートディレクトリーにDockerファイルというユニークなファイルを作成することによりアプリケーションをビルドします。なお、このファイルには拡張子がありません。",[86,133,136],{"className":134,"code":135,"language":91},[89],"FROM node:8-alpine\nRUN mkdir -p \u002Fusr\u002Fsrc\u002Fapp\nWORKDIR \u002Fusr\u002Fsrc\u002Fapp\nCOPY . .\nRUN npm install\nEXPOSE 3000\nCMD [ \"node\", \"server.js\" ]\n",[93,137,135],{"__ignoreMap":95},[14,139,141],{"id":140},"_5-dockerイメージのビルド","5. Dockerイメージのビルド",[10,143,144],{},"Dockerを設定して実行したことを確認してください。今やDockerファイルが作成済なので、以下のようにDockerイメージを「 -t 」コマンドでビルドします。",[86,146,149],{"className":147,"code":148,"language":91},[89],"$ docker build -t ecs-nodejs-app .\n",[93,150,148],{"__ignoreMap":95},[14,152,154],{"id":153},"_6-dockerコンテナ実行","6. Dockerコンテナ実行",[10,156,157],{},"これまで、Dockerイメージ作成の完了です。作成したDockerイメージを確認するために以下のコマンドを打ちます。",[86,159,162],{"className":160,"code":161,"language":91},[89],"$ docker images\n",[93,163,161],{"__ignoreMap":95},[10,165,166],{},"作成したてのDockerイメージは登録時間で一番新しいものです。",[168,169],"img",{"className":170,"alt":95,"src":173,"style":174},[171,172],"block","mx-auto","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F28113202\u002Fimg_docker.png","width: 100%;",[10,176,177],{},"前もってイメージIDをコピーしておきます。コンテナを実行するために以下のコマンドを打ちます。",[86,179,182],{"className":180,"code":181,"language":91},[89],"$docker run -p 80:3000 {image-id}\n\n\u002F\u002F コピーしたイメージIDを{image-id}に入れます。\n",[93,183,181],{"__ignoreMap":95},[10,185,186],{},"ここで、ポート：80:3000へアプリケーションを展開します。Dockerをローカル実行するのでhttp: \u002F\u002F localhost にアクセスして確認します。",[168,188],{"className":189,"alt":95,"src":190,"style":174},[171,172],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F28155452\u002Flocal.png",[14,192,194],{"id":193},"_7-レジストリ作成およびそこへのdockerイメージのプッシュ","7. レジストリ作成およびそこへのDockerイメージのプッシュ",[10,196,197],{},"Amazon Elastic Container Registry (ECR) は、完全マネージド型のコンテナレジストリです。このレジストリを使うと、コンテナイメージをどこにでも簡単に保存、管理、共有、デプロイすることができます。 Amazon ECR はAmazon Elastic Container Service (ECS)と連携して開発から本稼働までのワークフローを簡素化することができます。",[10,199,200],{},"Dockerイメージをプッシュする前に、以下のコマンドを実行して、AWS CLIが自分のAWSアカウントで接続できていることを確認してください。",[86,202,205],{"className":203,"code":204,"language":91},[89],"$ aws configure\n",[93,206,204],{"__ignoreMap":95},[10,208,209],{},"AWS CLIが既にインストールされた場合、AWS設定として以下の情報が求められます。",[86,211,214],{"className":212,"code":213,"language":91},[89],"$ aws configure\nAWS Access Key ID [None]: \u003Caccesskey>\nAWS Secret Access Key [None]: \u003Csecretkey>\nDefault region name [None]: us-east-2\nDefault output format [None]:\n",[93,215,213],{"__ignoreMap":95},[10,217,218],{},"AWS CLIが正確に設定されていることを確保するため、AWS設定コマンドを再度実行して、表示される確認プロンプトでエンターキー押下してください。",[168,220],{"className":221,"alt":95,"src":222,"style":174},[171,172],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F28123142\u002Faws.png",[10,224,225],{},"レジストリ作成の手順は以下の通りとなります。",[10,227,228,229,234],{},"まず、",[30,230,233],{"href":231,"rel":232},"https:\u002F\u002Faws.amazon.com\u002F",[34],"AWSマネジメントコンソール"," へアクセスし、ログインを行います。",[10,236,237],{},"つぎ、Servicesカテゴリーから、Containersの中にあるElastic Container Service（ECS）を選択します。",[168,239],{"className":240,"alt":95,"src":241,"style":174},[171,172],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F28123526\u002Fecs-1-1024x454.png",[10,243,244],{},"つぎ、左メニューのECRからはRepositoriesへ辿ってから、Create Repositoryメニューを選択した後に、リポジトリ名（例：\"ecs-nodejs-app\"）を入力してCreate Repositoryボタンを押します。",[10,246,247,251],{},[168,248],{"className":249,"alt":95,"src":250,"style":174},[171,172],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F28123731\u002Fecr-1024x669.png",[252,253],"br",{},[168,255],{"className":256,"alt":95,"src":257,"style":174},[171,172],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F05\u002F14084222\u002Fviewpush-1024x422.png",[10,259,260],{},"つぎ、右上にあるView Push Commandsをクリックした時に表示される4つの手順どおりに、Dockerイメージをビルド、タグ作成し、プッシュします。",[168,262],{"className":263,"alt":95,"src":264,"style":174},[171,172],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F28123922\u002Fstep_ecr-1024x669.png",[10,266,267],{},"その後、Amazon ECRへ戻って、先ほど入力したリポジトリ名をクリックするとDockerイメージが見えます。 次の手順に使うので、そのイメージのURIをコピーしておいてください。",[10,269,270,274],{},[168,271],{"className":272,"alt":95,"src":273,"style":174},[171,172],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F28124312\u002Fimg_ecr-1024x295.png"," 次の手順で、 EC2インスタンスでDockerイメージを実行するために使われるTask Definitionというタスク定義）、Clusterというクラスター、Serviceというサービスを作成します。",[14,276,278],{"id":277},"_8-タスク定義の作成","8. タスク定義の作成",[10,280,281],{},"AWSでのタスクはDocker CLIでのDocker実行コマンドのように機能しており、以下のように定義されています。",[283,284,285,289,292,295],"ul",{},[286,287,288],"li",{},"Container images",[286,290,291],{},"Volumes",[286,293,294],{},"Networks Environment Variables",[286,296,297],{},"Port mappings",[10,299,300],{},"以下に、タスク定義の作成手順を示します。",[302,303,305,308,311,314,317,320,323,326,329,332],"div",{"style":304},"padding-left: 30px",[10,306,307],{},"1. ESCダッシュボードにあるTask Definitionsより、Create new Task Definitionを押下",[10,309,310],{},"2. Launch TypeでEC2を選択",[10,312,313],{},"3. タスク名（例：\"ecs-nodejs-app-task\"）を入力してから他の項目を飛ばして、下部へ辿ってAdd containerを押下",[10,315,316],{},"4. コンテナ名（例：\"ecs-nodejs-app-container\"）を入力",[10,318,319],{},"5. 前の手順でコピーしておいたイメージのURIをImageにペースト",[10,321,322],{},"6. Memory Limitsで\"Soft Limit\"を選択し、適当な値を（例：\"512\"）を入力",[10,324,325],{},"7. Port Mappingで、各ポートを\"80: 3000\"で入力、プロトコルを\"tcp\"と選択",[10,327,328],{},"8. Environment Variablesへ辿って、Keyに\"NODE_ENV\"、Valueに\"production\"を入力",[10,330,331],{},"9. 他の項目を飛ばして一番下にあるAddを押下",[10,333,334],{},"10. Create Task Definition画面へ戻し、対象のコンテナとDockerイメージが表示され、下部へ辿ってCreateを押下",[168,336],{"className":337,"alt":95,"src":338,"style":174},[171,172],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F28124940\u002Fcontainer-1024x710.png",[14,340,342],{"id":341},"_9-クラスターの作成","9. クラスターの作成",[10,344,345],{},"以下に、クラスターの作成手順を示します。",[168,347],{"className":348,"alt":95,"src":349,"style":174},[171,172],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F28125117\u002Fcluster-1024x252.png",[302,351,352,355,358,361,364,367,370,373,376],{"style":304},[10,353,354],{},"1. ServicesカテゴリーよりECSを押してECSダッシュボードへ戻す",[10,356,357],{},"2. 左メニューよりAmazon ECS（EKSではない）の直下にあるClustersをクリックしてCreate Clusterを押下",[10,359,360],{},"3. クラスター・テンプレートとしてEC2 Linux + Networkingを選択してNext Stepを押下",[10,362,363],{},"4. クラスター名（例：\"ecs-nodejs-app-cluster\"）を入力",[10,365,366],{},"5. EC2 Instance Typeでデフォルトのままにするか\"t2.micro\"を選択",[10,368,369],{},"6. Number of instancesに\"1\"、EBS Storageに\"30\"を入力",[10,371,372],{},"7. Key pairでデフォルトのままにするか、対象のEC2インスタンスへSSHしたい場合の既存キーを選択",[10,374,375],{},"8. VPCでCreate a new VPCを押して新規作成して、下部へ辿る",[10,377,378],{},"9. Container instance IAM roleで作成した権限（例：\"ECStoEC2role\"）を選択してCreateを押下",[168,380],{"className":381,"alt":95,"src":382,"style":174},[171,172],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F28125454\u002Fcluster_1-1024x784.png",[10,384,385],{},"処理に数分がかかります。終わったらView Clusterを押下することで、Active状態が見えます。",[14,387,389],{"id":388},"_10-クラスター実行用サービスの作成","10. クラスター実行用サービスの作成",[10,391,392],{},"この手順で、クラスターを実行するためのサービスを作成します。",[168,394],{"className":395,"alt":95,"src":396,"style":174},[171,172],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F28125848\u002Fservice-1024x316.png",[10,398,399],{},"以下に、サービスの作成手順を示します。",[302,401,402,405,408,411,414,417,420,423,426],{"style":304},[10,403,404],{},"1. 左メニューのECSよりTask Definitionを押してから、定義したタスク（例：\"ecs-nodejs-app-task\"）を選択",[10,406,407],{},"2. 最新版を選択",[10,409,410],{},"3. Create new revisionの横にあるActionカテゴリーよりCreate Serviceを選択",[10,412,413],{},"4. Configure Serviceページで、Launch typeでEC2を選択",[10,415,416],{},"5. Clusterで作成したクラスター（例：\"ecs-nodejs-app-cluster\"）を選択",[10,418,419],{},"6. サービス名（例：\"ecs-nodejs-app-service\"）を入力",[10,421,422],{},"7. Number of Tasksに \"1\"を入力",[10,424,425],{},"8. 他の項目や次のページを飛ばして、4ページへと移動してから下部へ辿ってCreate Serviceを押下",[10,427,428],{},"9. Launch Statusページで、作成したサービスに緑チェックマークが入る。View Serviceを押した後に、TasksタブのLast Statusが\"PENDING\"であるならば、少し時間が経過し、または、再描画アイコンをクリックすることで\"RUNNING\"になる",[168,430],{"className":431,"alt":95,"src":432,"style":174},[171,172],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F28130204\u002Fservice_1-1024x822.png",[10,434,435],{},"ClusterからEC2 instancesタブで対象のインスタンス・コンテナを押すことで公開DNSリンクを生成します。",[10,437,438,442],{},[168,439],{"className":440,"alt":95,"src":441,"style":174},[171,172],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F28130521\u002Fec2-1024x476.png",[252,443],{},[168,445],{"className":446,"alt":95,"src":447,"style":174},[171,172],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F28130712\u002Fdns-1024x490.png",[10,449,450],{},"ブラウザーでその公開DNSへアクセスすると、作成したアプリが開きます。",[10,452,453],{},[21,454,455],{},"ec2-52-193-75-195.ap-northeast-1.compute.amazonaws.com",[168,457],{"className":458,"alt":95,"src":459,"style":174},[171,172],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F28130829\u002Fdemo.png",[10,461,462,467],{},[30,463,466],{"href":464,"rel":465},"https:\u002F\u002Fgitlab.com\u002Fbwv-hp\u002Fecs-demo.git",[34],"Github","からサンプルソースを参考にしましょう！",[14,469,470],{"id":470},"参考元",[10,472,473],{},[30,474,475],{"href":475,"rel":476},"https:\u002F\u002Fdocs.aws.amazon.com\u002FAmazonECS\u002Flatest\u002Fdeveloperguide\u002Fgetting-started.html",[34],[10,478,479],{},[30,480,481],{"href":481,"rel":482},"https:\u002F\u002Fblog.clairvoyantsoft.com\u002Fdeploy-and-run-docker-images-on-aws-ecs-85a17a073281",[34],[10,484,485],{},[30,486,487],{"href":487,"rel":488},"https:\u002F\u002Fmedium.com\u002Fboltops\u002Fgentle-introduction-to-how-aws-ecs-works-with-example-tutorial-cea3d27ce63d",[34],{"title":95,"searchDepth":490,"depth":490,"links":491},2,[492,493,494,495,496,497,498,499,500,501,502],{"id":16,"depth":490,"text":17},{"id":67,"depth":490,"text":68},{"id":77,"depth":490,"text":78},{"id":127,"depth":490,"text":128},{"id":140,"depth":490,"text":141},{"id":153,"depth":490,"text":154},{"id":193,"depth":490,"text":194},{"id":277,"depth":490,"text":278},{"id":341,"depth":490,"text":342},{"id":388,"depth":490,"text":389},{"id":470,"depth":490,"text":470},"tech talk","Briswell Vietnam Co Ltd","2021-05-18","md",{},true,"\u002Fja\u002Fnews\u002Fdeploying-node-app-to-ecs-with-docker",null,{"title":5,"description":12},"ja\u002Fnews\u002Fdeploying-node-app-to-ecs-with-docker","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2021\u002F04\u002F28132456\u002Fecs-t.png","wqQ0OG2Mlw-ztK7x-T8qUVARbMvYJ6PmfcRmg-9ze8E",1782205039978]