こなメル

学習したことのメモや、趣味について

docker-compose.ymlで構築されたプロジェクトをECRにpushする & ECSで公開する

はじめに

この記事は、私がDocker Compose CLIを利用して、ECSでプロジェクトを実行するまでの手順をメモしたものです。
使用するプロジェクトは、以下のサンプルを利用しています。

github.com

前提

  • AWSアカウントがあること
  • IAMユーザーが作成されていること

AWS CLIをインストールする

docs.aws.amazon.com

AWS CLIの設定をする

docs.aws.amazon.com

ECRでリポジトリを作成する

f:id:konakomoti:20210919125748p:plain
リポジトリを作成」をクリック

f:id:konakomoti:20210919133507p:plain
リポジトリ名は、サンプルフォルダと同じ名前の example にします。それ以外はデフォルトのままで、「リポジトリを作成」をクリックします

サンプルをclone & docker-compose.ymlを書き換え

$ git clone https://github.com/docker/ecs-plugin.git
$ cd ecs-plugin/example/

imageを書き換えます。ECRの「プッシュコマンドの表示」から書き換えるタグ名を確認します。

version: "3.8"
services:
  frontend:
    build: app
    # ↓削除
    # x-aws-pull_credentials: <<<your arn for your secret you can get with docker ecs secret list>>>
    # ↓書き換え
    # image: <<<your docker hub user name>>>/timestamper
    image: 1111111111.dkr.ecr.ap-northeast-1.amazonaws.com/example:latest
    ports:
      - "5000:5000"
    depends_on:
      - backend
  backend:
    image: redis:alpine

f:id:konakomoti:20210919160042p:plain
リポジトリを選択した状態で「プッシュコマンドの表示」をクリック

f:id:konakomoti:20210919160239p:plain
書いてある場所

ローカルで確認する

$ docker-compose up

localhost:5000 にアクセスするとサンプルのサイトが見れます。

ECRレジストリに対し、Dockerクライアントを認証する

再度「プッシュコマンドの表示」をクリックし、

f:id:konakomoti:20210919160946p:plain
コピーして実行します

f:id:konakomoti:20210919161049p:plain
Login Successed と表示されればOK

exmapleリポジトリにイメージをpushする

$ docker-compose push

ECRのexmapleリポジトリにイメージがpushされていることが確認できます。 f:id:konakomoti:20210919161416p:plain

AWS用のコンテキストを作成 & 切り替え

今回は aws という名前にしました。

$ docker context create ecs aws

f:id:konakomoti:20210919161938p:plain
作成したaws profileを使用します

コンテキストが作成されているか確認し、

$ docker context list

'aws' に切り替えます。

$ docker context use aws

ECSへデプロイ

Docker Compose コマンド一覧はこちらに記載されています。

matsuand.github.io

※自分の環境では5分程度かかりました

$ docker compose up

コンテナの一覧を表示します。

$ docker compose ps

PORTSに表示されているURLからサイトを確認することができます。 f:id:konakomoti:20210919195356p:plain

コンテナとネットワークの停止 & 削除

※こちらも数分かかります

$ docker compose down

参考サイト

以下の記事を参考にさせていただきました。

tech.smartcamp.co.jp

curlコマンドでnoteからデータを取得してみる

はじめに

使い方を公式で説明しているわけではないが、noteにはAPIがあるみたい。

【2020年度】noteのAPI一覧【完全版】

curlコマンドの使い方を学ぶついでに、noteに投稿されている記事のタイトルを取得してみる。

curlコマンドとjqコマンド

$ curl --version
curl 7.64.1
$ jq --version
jq-1.6

2020/12/17当時

curlコマンドでnoteの、特定ユーザの記事タイトルを取得してみる

f:id:konakomoti:20201217140430p:plain
実行時の投稿記事

$ curl https://note.com/api/v2/creators/kypowder/contents\?kind=note\&page=1

?と&をエスケープするため、\を入れている。

{"data":{"contents":[{"id":24798670,"type":"TextNote","status":"published","name":"テストタイトル2","description":null,"price":0,"key":"n4551d7093a0b","slug":"slug-n4551d7093a0b","publishAt":"2020/12/17 13:17","thumbnailExternalUrl":"","eyecatch":null,"user":{"id":3414203,"name":"こな","urlname":"kypowder","nickname":"こな","userProfileImagePath":"https://assets.st-note.com/production/uploads/images/31550000/profile_f1ad3c646727d3424b996812d90901f0.jpg?fit=bounds\u0026format=jpeg\u0026quality=45\u0026width=330","customDomain":null,"disableSupport":false,"likeAppealText":null,"likeAppealImage":null,"purchaseAppealTextNote":null,"twitterNickname":"YoKaU2"},"canRead":true,"isAuthor":false,......

見やすくするためにjqコマンドをパイプでつなげる。

$ curl https://note.com/api/v2/creators/kypowder/contents\?kind=note\&page=1 | jq

f:id:konakomoti:20201217140531p:plain
jqをパイプでつなげた

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  4473    0  4473    0     0  20612      0 --:--:-- --:--:-- --:--:-- 20612

↑ 最初の数行に表示される転送情報をスキップしたい場合、-sオプションを追加する。

しかし、エラー情報まで消えてしまうので、-Sも追加しとく。

$ curl -Ss https://note.com/api/v2/creators/kypowder/contents\?kind=note\&page=1 | jq

オブジェクトの部分抽出

$ curl -Ss https://note.com/api/v2/creators/kypowder/contents\?kind=note\&page=1 | jq ".data"

f:id:konakomoti:20201217140625p:plain
.dataの中身を抽出

data{

}

の中を抽出できた。

配列を抽出する場合、

$ curl -Ss https://note.com/api/v2/creators/kypowder/contents\?kind=note\&page=1 | jq ".data | .contents"

とすることで

f:id:konakomoti:20201217140708p:plain
.contentsの中身を抽出

配列に対して、.xxは適応できないので、.[]を使う。

$ curl -Ss https://note.com/api/v2/creators/kypowder/contents\?kind=note\&page=1 | jq ".data | .contents[]"

f:id:konakomoti:20201217140745p:plain
.で、外側の配列を取り除く

一番外側にある配列を除去してくれる。

.contents | .[]としなくても.contents[]で繋げられる。

".data.contents[]"でもいける。

$ curl -Ss https://note.com/api/v2/creators/kypowder/contents\?kind=note\&page=1 | jq ".data | .contents[] | .name"

オブジェクトになったので.xxで指定することで、

f:id:konakomoti:20201217140820p:plain

投稿記事のタイトルのみを抽出できた。

これをさらに整形することもでき、

$ curl -Ss https://note.com/api/v2/creators/kypowder/contents\?kind=note\&page=1 | jq "{title: [.data | .contents[].name]}"

とすることで、

f:id:konakomoti:20201217140838p:plain

いい感じに作り直すこともできる。

参考情報

curl コマンド 使い方メモ

jqを活用してAPIレスポンス等から欲しい情報だけを抽出する【初級編】

【2020年度】noteのAPI一覧【完全版】