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

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

https化に伴い、表示できなくなっているリンクについて修復中。
2018年から遡って修正し、2015年分まで修正完了。


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

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