---
# System prepended metadata

title: ecs-agent

---

# ecs-agent

## 順番
伊藤->大谷->根岸->前田->深谷->箕輪

ドライバー大谷 書記根岸

agent.go
doStartのvpcSubnetAttributesのあたりから
- TaskENIEnabledだったらリソースをinitializeする
  - TaskEngineState TaskEngine を渡している
    - interfaceはなんか似てる
  - vpc周りのネットワーク設定を行っている
  - 制限を見ている
  - registerContainerInstance
    - iam取る
    - capabilities見てる めっちゃappendしまくる実装になってる
    - ec2のtag取る
      - ユーザが入れたタグではなく?
      - ちょっとわからないのでこのまま進める
    - platform取ってくる
    - ec2 arn取ってくる
    - チェック終わったらRegisterContainerInstanceでECSに登録するみたいなことをやってる
- api/ecsclient/client.goのRegisterContainerInstance
  - →registerContainerInstance
  - ここでリクエストを投げるためのattributesを収集する
  - registerRequestを作ったらstandardClient.RegisterContainerInstanceに投げる
  - registerAttributeのvalidateを行う(登録されたかどうかのチェック)
  - これで一旦終端
- agent.goのdoStartのagent.regiseterContainerInstanceまで戻ってくる
  - serviceconnectManagerを取得してECSClientをセット
    - ServiceConnectはセッション周りのサービス
    - サービスメッシュを構成することができる
  - agent.cfg見ながらenabledならmetadataをコピーする
  - ヘルスチェックを実行してくれる
  - ハンドラがいっぱい出てくる deregisterationがリクエストをキャッチできるようにしてる
  - 最後にstartACSSessionを返して終わり
    - セッション張ります以上ではない

doStart終わり

- run.goの一番したまで行ったので終わりかも?
- doStartはagentを起動してECSへと自分の情報を登録しに行ってるの?
  - 起動した結果EC2側のagentがバリデーション・登録情報を見て、ECSの中央に登録しにくる
- agentってmanagerとclient両方にインストールされてる?
  - managerはAWS側みたいなイメージ
  - agentはclient = container instanceにしかいない
- 逆にmanagerからagentへのリクエストは確かに見られてないかも
  - タスク停止とか
- 最初の方にagent-container/agent-config.jsonを見たと思うが、ここに置くのかなと思っていた? それがよくわからない
  - handlersとかはagent配下にあるのでセットアップしていると思うが
  - doStartから読んでるagent.statAsyncRoutinesで
   - HttpのSetupが走っている
   - これを読むと良さそう

次回: agent.go/ dostart 441行目 agent.startAsyncRoutinesの先を読む

## 2023/05/24
ドライバー: 伊藤
書記:　大谷 
amazon-ece-agent/agent/agent.go (本体)


- amazon-ece-agent/agent/agent.go 
　- amazon-ece-agent/agent/run.go
　    - ヘルスチェックホスト設定
　    - 
　- newAgent()
　   - GetMetadataでコンテナインスタンスの情報を取ってくる 
　   - CreateConfig
　   - MetadataManager
　       - コンテナの状態を管理していく
  - *ecsAgent.start
      - StartDebugHundler
          - USR1シグナルを受け取れる
      - dockerstate.DockerTaskEngineStete
          - コンテナのタスクマッピング
          - コンテナの起動停止の状態管理・チェック
      - agent.initializeResouceFields
          - cgroup 
              - /ecs に独自の名前空間で自前でリソース制御してる
    　　　 - ASM/SSM/S3/その他、連携している他のAWSサービスのリソース管理
      - agent.newTaskEnging()
          - struct
              - Credential
              - State
              - Image
              - ServiceConnect
              - ExecCMD
          - Checkpoint
             - 再開できるように状態を定期保存する
          - SetclusterInConfig
              - 排他制御
              - 1agent:1clusterなので紐づくAgentに齟齬がないようにする
      - agent.terminationhundler()
          - 終了時にState保存、タスクの起動抑止をしつつ終了する
      - agent.initMetricsEngine
          - MetricsClient
              - 色々なメトリクスに対応している
          - MetricsClient_
              - MetricsClientのCollectionを取り扱える
      - agent.
      ()
          - コンテナインスタンス/VPCの情報をAgentにSet
          - ENI(AWS上の仮想NIC)とCNI(コンテナのNIC)の紐づけをする
          - 他、ネットワーク周りのプラグインの有効化等

> 次回: dostartの338 ENIの有効無効の分岐から

## 2023-05-17
ドライバー: 箕輪
書記: 伊藤

ecs-initはある程度読んでいるが、ecs-agent本体はまだ読んでいないので、多少読みたい。
今後3人とかでも読み進めるか??? (ecs-agentに限らず)

> 次回ecs-init:101 PreStopから

### PreStop()
deprecatedなので飛ばしていいか? → STOPもPreStopなのでengine.PreStop読もう!!

- engine.go: `*Engine.PreStop()`
    - dockerの情報を取得してagentを停止する
        - getDockerClient -> docker.go: Client()
        - docker.StopAgent()
    - docker.go: client.StopAgent()
        - findAgentContainer
            - agentを利用してコンテナリストを取得
            - コンテナリスト→名前でマッチするものを返す
        - 見付かったコンテナについて、タイムアウト10sを設けてStopContainerする
        
### PostStop()
> PostStop cleans up the credentials endpoint setup by disabling loopback routing and removing the rerouting rule from the netfilter table

> PostStop は、ループバック ルーティングを無効にし、ネットフィルター テーブルから再ルーティング ルールを削除することで、資格情報エンドポイントのセットアップをクリーンアップします。


### ReloadCache()
> ReloadCache reloads the cached image of the ECS Agent into Docker

> ReloadCache は、ECS エージェントのキャッシュされたイメージを Docker に再ロードします

- ダウンローダ: どこかにキャッシュを保存していてそれを取得する。ecs agent(dockerのイメージ)を取得する。
- キャッシュが無ければダウンロード&キャッシュしなおす。
- ecs-agentをキャッシュからロードする。

次回: amazon-ece-agent/agent/agent.go (本体)

## 2023-04-12
ドライバー: ねぎぽさん
書紀: 箕輪

### StartSupervised()
- docker clientの呼び出し
    - Clientはpublic
    - sync組み込み
        - dockerOnce = sync.Once
        - 一回だけ実行される
        - syncOnce詳細は興味のあるひとは個別に
    - pingされている
    - backoff
        - 参考 backoff パッケージ
            https://pkg.go.dev/github.com/aws/amazon-ecs-agent/ecs-init/backoff
    - newDockerClient
        - socketを定義
        - dockerClientFactory.NewVersionedClient
            - ２箇所に定義(テスト目的)
            - goDockerClient.new
            - 外部ライブラリ
                - ここ読むと中身がわかるはず....
        - pingして失敗したらbackoffしてretry
    - filesystemも保持
    - dependencies依存だけを管理するように見える
- ここまででdockerに対して操作可能に
    - RemoveExistingAgentContainer
        - docker.go内に定義
    - forでループ
        - StartAgent
            - CreateContainer
                - 設定を保持したコンテナ立ち上げ
            - StartContainer
            - WaitContainer
                - 返り値が以上だとエラーに
                - HTTPリクエスト wait api
                    - dockerのAPIが存在している
                    - 42、宇宙の真理、何らか変換される
            - upgradeAgent
                - dockerの中にECS agentをロードする
                - cache.newDownloader
                    - どっかからダウンロードしてきてfilesystemに保存してそう
                - load
                    - agentLoaderは関数
                    - RecordCachedAgentエラーハンドリング用
            - container.FailureAgentExitCode
                - failedContainerLogWindowSize
                    - 表示するエラーの行数
                    - Terminal?
- cacheをどう管理しているの？
- 次回ecs-init:101 PreStopから


## 2023-03-01


リポジトリ: https://github.com/aws/amazon-ecs-agent


## 起動するところ


- amazon linuxだとsystemctrl経由でこれできどうされてる。
  - https://github.com/aws/amazon-ecs-agent/blob/master/packaging/amazon-linux-ami-integrated/ecs.service
  
  - ExecStart `/usr/libexec/amazon-ecs-init start`
- amazonlinuxに関連してそうなファイルはこの辺に有る
    - https://github.com/aws/amazon-ecs-agent/tree/master/packaging/amazon-linux-ami-integrated
  
 
 
## 起動するのはこの辺ぽい


- https://github.com/aws/amazon-ecs-agent/blob/master/ecs-init/ecs-init.go

## mainからよむ

- https://github.com/aws/amazon-ecs-agent/blob/master/ecs-init/ecs-init.go#L39
  - 引数をパース
  - ロガー初期化
  - actionsメソッドで、サブコマンドに対応するengine.*を撮ってきて実行する
  - アクションがなかったら案内出して終了
  
## それぞれサブコマンドが実行される


- https://github.com/aws/amazon-ecs-agent/blob/master/ecs-init/engine/engine.go

## pre-startサブコマンド


- constでデフォルトパラメータが設定されてたり
- New
    - cache.NewDownloader
    - なんか色々初期化
    
- PreStart
    - PrestartGPU
        - gpu初期化
        - nvidiaべったりな実装
        - nvidiaGpuManager.setup
        - /dev/nvidiaGPU*で探す
    - LoopbackRouting.Enable
    - ipv6のadvertisement機能off
    - GetDockerClient
    - AgentCacheStatusでagentの状態確認してる
        - ecs-agent用起動用のメタデータの状態確認している
        - /var/lib/ecs/data/ecs_agent_data.json
        
## 次回
- 別のサブコマンドを読む