いろいろやってみるにっき

てきとーに生きている奴の日記

古いエントリのサムネイル画像がリンク切れになってたりするけど、チマチマ修正中


Amazon ECS CLIでローカル環境テスト 自前のコンテナ編

Amazon ECS CLIでローカル環境テストの続き。

shigeo-t.hatenablog.com

 今度は自前のコンテナでテストしたい。そこでECS側にクラスターやタスク定義を作った。一応動作も確認。

 

タスク定義のJSONをコピペする

ところがECSのタスク定義、コンソールで設定したらJSONをコピペできない。

f:id:shigeo-t:20210621093056p:plain

JSONが書かれている部分はロックされているし、ソースを表示してもJSON部分が含まれない。

せっかくVMはコピペできるように復活させたのに。

shigeo-t.hatenablog.com

 

これは困ったと思っていたらコピペの方法があった。

dev.classmethod.jp

ECSタスク定義で利用できるJSONを作る方法

 元ネタのJSONを取得する

最初に編集するための元ネタとなるJSONを取得します。今回のJSONはマネジメントコンソールにのみ表示されているので、ものすごい愚直な方法でとってきますYO

マネジメントコンソールのECSタスク定義メニューから該当のタスク定義を開きます。ここで[Create new revision]をクリック。

タスク定義編集画面に遷移するので、ここで、画面一番下にある[Conrigure via JSON]ボタンをクリック。

 

実際には日本語で表示しているので、オレのところではこうなってる。

f:id:shigeo-t:20210621093531p:plain

開いた「タスク定義の新しいリビジョンの作成」の一番下にスクロールするとこのように右側からJSONがポップアップしてくる。

f:id:shigeo-t:20210621093650p:plain

 

これでコピペできた。

f:id:shigeo-t:20210621094201p:plain

 

Docker Composeファイルの作成

コピペで作ったタスク定義JSONのecs_py_host.jsonからdocker composeのYAMLを作成。already existsが出たが無事作成できた。

docker@ubuntu:~/ecs$ ecs-cli local create --task-def-file ecs_py_host.json --output docker-compose.ecs_py.yml
INFO[0000] Reading task definition from /home/docker/ecs/ecs_py_host.json
 
INFO[0000] Task Definition network mode is ignored when running containers locally. Tasks will be run in the ecs-local-network.  networkMode=awsvpc
WARN[0000] awslogs log driver is ignored when running locally. Tasks will default to json-file instead. This can be changed in your compose override file. 
docker-compose.ecs_py.yml file already exists. Do you want to write over this file? [y/N]
y
INFO[0005] Successfully wrote docker-compose.ecs_py.yml 
INFO[0005] docker-compose.ecs_py.override.yml already exists, skipping write.

元のタスク定義JSONからするとぎゅっと短い。

version: "3.4"
services:
  ecs_py:
    environment:
      AWS_CONTAINER_CREDENTIALS_RELATIVE_URI: /creds
      ECS_CONTAINER_METADATA_URI: http://169.254.170.2/v3
    image: 398078058327.dkr.ecr.ap-northeast-1.amazonaws.com/ecs_py:latest
    labels:
      ecs-local.task-definition-input.type: local
      ecs-local.task-definition-input.value: /home/docker/ecs/ecs_py_host.json
    logging:
      driver: awslogs
      options:
        awslogs-group: /ecs/ecs_py
        awslogs-region: ap-northeast-1
        awslogs-stream-prefix: ecs
    networks:
      ecs-local-network: null
networks:
  ecs-local-network:
    external: true

 

ローカル環境で起動

生成されたdocker-compose.ecs_py.ymlを使ってローカル環境でコンテナを起動する。

docker@ubuntu:~/ecs$ ecs-cli local up --task-def-compose docker-compose.ecs_py.yml 
INFO[0000] The network ecs-local-network already exists 
INFO[0000] The amazon-ecs-local-container-endpoints container already exists with ID efdff8ec1fa984c5e0258e96b998adcd5ea499b9cd1554e3f7dc996af223473f 
INFO[0000] Started container with ID efdff8ec1fa984c5e0258e96b998adcd5ea499b9cd1554e3f7dc996af223473f 
INFO[0000] Using docker-compose.ecs_py.yml, docker-compose.ecs_py.override.yml files to start containers 
Creating ecs_ecs_py_1 ... 
Creating ecs_ecs_py_1 ... done

問題ない。なお、手書きでタスク定義JSONを作った時はエラーいっぱい出た。

docker@ubuntu:~/ecs$ ecs-cli local up --task-def-compose docker-compose.ecs_py.yml
INFO[0000] Creating network: ecs-local-network...       
INFO[0000] Created network ecs-local-network with ID f3c31393bc24b061ee3b8b7396f40bceb9b3adcebd457078a4e2c6c659c693c8 
INFO[0000] Created the amazon-ecs-local-container-endpoints container with ID efdff8ec1fa984c5e0258e96b998adcd5ea499b9cd1554e3f7dc996af223473f 
INFO[0002] Started container with ID efdff8ec1fa984c5e0258e96b998adcd5ea499b9cd1554e3f7dc996af223473f 
FATA[0002] Failed to unmarshal Compose file /home/docker/ecs/docker-compose.ecs_py.yml due to 
failed to load Compose file with details { /home/docker/ecs [{/home/docker/ecs/docker-compose.ecs_py.yml map[networks:map[ecs-local-network:map[external:true]] services:map[ecs_py:map[cap_add:[] cap_drop:[] command:[] devices:[::w] dns:[] dns_search:[] entrypoint:[] environment:map[:${ecs_py_} AWS_CONTAINER_CREDENTIALS_RELATIVE_URI:/creds ECS_CONTAINER_METADATA_URI:http://169.254.170.2/v3] extra_hosts:[:] healthcheck:map[interval:0s retries:0 start_period:0s test:[] timeout:0s] image:398078058327.dkr.ecr.ap-northeast-1.amazonaws.com/ecs_py:latest init:true ipc:none labels:map[KeyName: ecs-local.secret.: ecs-local.task-definition-input.type:local ecs-local.task-definition-input.value:/home/docker/ecs/ecs_py.json] links:[] logging:map[driver:fluentd options:map[KeyName:]] networks:map[ecs-local-network:<nil>] ports:[map[protocol:udp]] privileged:true read_only:true security_opt:[] shm_size:0B stdin_open:true sysctls:[=] tmpfs:[:size=0B,] tty:true ulimits:map[rtprio:map[]] volumes:[map[read_only:true type:bind]]]] version:3.4]}] map[CLUTTER_IM_MODULE:xim COLORTERM:truecolor DBUS_SESSION_BUS_ADDRESS:unix:path=/run/user/1001/bus DESKTOP_SESSION:ubuntu DISPLAY::0 DOCKER_API_VERSION:1.27 GDMSESSION:ubuntu GJS_DEBUG_OUTPUT:stderr GJS_DEBUG_TOPICS:JS ERROR;JS LOG GNOME_DESKTOP_SESSION_ID:this-is-deprecated GNOME_SHELL_SESSION_MODE:ubuntu GNOME_TERMINAL_SCREEN:/org/gnome/Terminal/screen/8d39e200_88ee_4e20_96f9_1ddb86cf37fa GNOME_TERMINAL_SERVICE::1.71 GPG_AGENT_INFO:/run/user/1001/gnupg/S.gpg-agent:0:1 GTK_IM_MODULE:ibus GTK_MODULES:gail:atk-bridge HOME:/home/docker IM_CONFIG_PHASE:2 LANG:ja_JP.UTF-8 LC_ADDRESS:en_US.UTF-8 LC_IDENTIFICATION:en_US.UTF-8 LC_MEASUREMENT:en_US.UTF-8 LC_MONETARY:en_US.UTF-8 LC_NAME:en_US.UTF-8 LC_NUMERIC:en_US.UTF-8 LC_PAPER:en_US.UTF-8 LC_TELEPHONE:en_US.UTF-8 LC_TIME:en_US.UTF-8 LESSCLOSE:/usr/bin/lesspipe %s %s LESSOPEN:| /usr/bin/lesspipe %s LOGNAME:docker LS_COLORS:rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36: OLDPWD:/home/docker PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin PWD:/home/docker/ecs QT4_IM_MODULE:xim QT_ACCESSIBILITY:1 QT_IM_MODULE:ibus SESSION_MANAGER:local/ubuntu:@/tmp/.ICE-unix/2108,unix/ubuntu:/tmp/.ICE-unix/2108 SHELL:/bin/sh SHLVL:1 SSH_AGENT_PID:2203 SSH_AUTH_SOCK:/run/user/1001/keyring/ssh TERM:xterm-256color TEXTDOMAIN:im-config TEXTDOMAINDIR:/usr/share/locale/ UNZIP:-O CP932 USER:docker USERNAME:docker VTE_VERSION:5202 WINDOWPATH:2 XAUTHORITY:/run/user/1001/gdm/Xauthority XDG_CONFIG_DIRS:/etc/xdg/xdg-ubuntu:/etc/xdg XDG_CURRENT_DESKTOP:ubuntu:GNOME XDG_DATA_DIRS:/usr/share/ubuntu:/usr/local/share/:/usr/share/:/var/lib/snapd/desktop XDG_MENU_PREFIX:gnome- XDG_RUNTIME_DIR:/run/user/1001 XDG_SEAT:seat0 XDG_SESSION_DESKTOP:ubuntu XDG_SESSION_ID:2 XDG_SESSION_TYPE:x11 XDG_VTNR:2 XMODIFIERS:@im=ibus ZIPINFO:-O CP932 _:/usr/local/bin/ecs-cli]}: services.ecs_py.ulimits.rtprio soft is required

 

AWS上ECSタスク定義から直接ローカル実行

前回参照例の「AWS上ECSタスク定義から直接ローカル実行」章は実行していなかった。自前のECSタスク定義を準備できたので実行してみる。

dev.classmethod.jp

 

まずはARNを取得。

docker@ubuntu:~/ecs$ aws ecs describe-task-definition --task-definition ecs_py --query "taskDefinition.taskDefinitionArn" --output text
arn:aws:ecs:ap-northeast-1:398078058327:task-definition/ecs_py:1

ECSローカル実行。

docker@ubuntu:~/ecs$ ecs-cli local up --task-def-remote arn:aws:ecs:ap-northeast-1:398078058327:task-definition/ecs_py:1 
INFO[0000] Reading task definition from ecs_py:1
       
INFO[0000] Task Definition network mode is ignored when running containers locally. Tasks will be run in the ecs-local-network.  networkMode=awsvpc
WARN[0000] awslogs log driver is ignored when running locally. Tasks will default to json-file instead. This can be changed in your compose override file. 
INFO[0000] Successfully wrote docker-compose.ecs-local.yml 
INFO[0000] Successfully wrote docker-compose.ecs-local.override.yml 
INFO[0000] The network ecs-local-network already exists 
INFO[0000] The amazon-ecs-local-container-endpoints container already exists with ID efdff8ec1fa984c5e0258e96b998adcd5ea499b9cd1554e3f7dc996af223473f 
INFO[0000] Started container with ID efdff8ec1fa984c5e0258e96b998adcd5ea499b9cd1554e3f7dc996af223473f 
INFO[0000] Using docker-compose.ecs-local.yml, docker-compose.ecs-local.override.yml files to start containers 
Recreating ecs_ecs_py_1 ... 
Recreating ecs_ecs_py_1 ... done

参照例のようにポートマッピングは必要ないので問題なく動いた。

 

お時間あったら、他のエントリもクリックして頂ければ幸いです。