0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

個人的備忘録:ECS コンテナで "go: not found" が発生したときの対処法と、実際にインストールしてみた

Posted at

はじめに

ECS を運用していると、コンテナ内で Go コマンドが見つからない (go: not found) という問題に直面することがあります。

本記事では、その原因と解決方法を詳しく解説します。

個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。

書こうと思ったきっかけ

最近、ECS 上で Go を用いたアプリケーションのマイグレーションを行おうとした際に、go コマンドが実行できず困った経験がありました。

その過程で、ECS 内で Go を使用する際のベストプラクティスを学びました。

同じ問題で悩む方の参考になればと思い、本記事を投稿しました。

ECS コンテナ内で go が見つからない場合の解決方法

ECS のコンテナ内で go コマンドが見つからない (go: not found) 場合、以下のいずれかが原因です。

  • コンテナに Go がインストールされていない
  • Go のパスが PATH に含まれていない
  • ECS のコンテナイメージが golang ベースではなく、Go 実行環境を含んでいない

解決策

① コンテナに Go がインストールされているか確認

まず、以下のコマンドで Go がインストールされているか確認します。

ls /usr/local/go/bin

もし go というファイルが存在しない場合、Go がコンテナに入っていません。

② コンテナに Go をインストール

Alpine Linux ベースの場合

apk add --no-cache go

Debian / Ubuntu ベースの場合

apt update && apt install -y golang

Go をインストール後、バージョンを確認:

go version

③ Go の PATH を修正

もし go/usr/local/go/bin/go にある場合、PATH に追加してください。

export PATH=$PATH:/usr/local/go/bin

その後、再度 go version を確認:

go version

④ Go を含む Docker イメージを使用

本番環境や ECS では、go run を使わず、事前に Go バイナリをビルドしてデプロイするのが一般的です。

ローカルで Go バイナリをビルド

ECS のコンテナで go を直接実行しないように、事前に Go バイナリを作成し、それをデプロイします。

GOOS=linux GOARCH=amd64 go build -o migrate_app migrate/migrate.go

Dockerfile を修正

以下のように Go のビルドステージを追加し、ECS でバイナリを実行できるようにします。

# Go を使ってビルド
FROM golang:1.20 AS builder
WORKDIR /app
COPY . .
RUN go build -o migrate_app migrate/migrate.go

# 軽量なコンテナにバイナリのみコピー
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/migrate_app .
ENTRYPOINT ["/app/migrate_app"]

go run を使わずに ECS でマイグレーション

上記の Dockerfile でイメージを ECS にデプロイした後、以下のコマンドで ECS 内で実行します。

aws ecs execute-command \
  --cluster my-ecs-cluster \
  --task <TASK_ID> \
  --container my-app-repo \
  --interactive \
  --command "/app/migrate_app"

もしくは、ECS タスクの command を変更し、直接 migrate_app を実行するように設定することも可能です。

まとめ

ls /usr/local/go/bin で Go があるか確認
apk add goapt install golang で Go をインストール
export PATH=$PATH:/usr/local/go/binPATH を修正
go build -o migrate_app migrate/migrate.go でバイナリを作成し ECS で実行

ECS では Go を直接インストールするより、事前にビルドしたバイナリをデプロイする方法が推奨されます!

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?