Closed21

nodeアプリケーションをECSデプロイするまでの道のり docker / ECR / ECS設定

docker

  • -f: Dockerfile指定
  • -t: コンテナ名

build

# build
docker build  -f docker/Dockerfile -t app-test-image . 

debug: imageに入って操作する

# run
docker run -it app-test-image /bin/bash

node × docker issue

絶対すること

いいか!!.dockerignoreに今すぐnode_modulesを加えるんだ!!

# .dockerignore
node_modules

そうすることで、

COPY . . 

このCOPY対象にnode_modulesが含まなくなり、ビルド時間が段違いに早くなるぞ!〜

bcript error

c++で実行されるネイティブ依存があるため、実行環境ごとで必要なデータが異なる。

Error: /app/node_modules/bcrypt/lib/binding/napi-v3/bcrypt_lib.node: invalid ELF header

公式doc

https://github.com/kelektiv/node.bcrypt.js/wiki/Installation-Instructions#docker

強引な解決策

bcriptjsをインストールする。速度はネイティブなbcriptが速い(30%速度低下する)のだが、
ピュアなJSなのでネイティブ依存はなく、互換性がある。

https://github.com/dcodeIO/bcrypt.js

AWS

Deploy

ECS Deployツール、手段は多種多様

https://dev.classmethod.jp/articles/awsdevday2020-deploy-fargate-easily/

クロスアカウント問題

ホストアカウントから他のアカウントのリソースへアクセスしたい。

Route 53

ホストアカウントのドメイン -> ほかアカウントのELBへの設定方法。
AレコードにDNS名を追加すればおk。

https://dev.classmethod.jp/articles/route53-alias-crossaccount/#toc-2

https化

ホストアカウントのドメイン -> 他アカウントのACMへの設定方法。

https://dev.classmethod.jp/articles/other-account-domain-acm-certificate-swap-elb/

copilot

init

initするとインタラクションでどんどん作られていく!
作られるものは👇!

  1. VPC
  2. Application Load Balancer
  3. ECS
    • ECR: Create & Push Container Image
    • AWS Fargate Service
copilot init

https://aws.github.io/copilot-cli/docs/getting-started/first-app-tutorial/
profile 切り替え

https://aws.github.io/copilot-cli/docs/credentials/
MissingRegion: could not find region configuration

環境変数にAWS_REGIONを設定する

export AWS_REGION=ap-northeast-1
Deploy Error

iam:PassRoleが無いから、作ったサービスリソースにpass roleできない!

✘ deploy service: check if changeset is empty: create change set copilot-ZZZZZZZ-ZZZZZZZ for stack test-test: AccessDenied: User: arn:aws:sts::ZZZZZZZ:assumed-role/test-EnvManagerRole/ZZZZZZZ is not authorized to perform: iam:PassRole on resource: arn:aws:iam::ZZZZZZZ:role/test-test-CFNExecutionRole

https://github.com/aws/copilot-cli/issues/1787

https://dev.classmethod.jp/articles/iam-role-passrole-assumerole/

Terraform で ECS

Terraform とは

https://y-ohgi.com/introduction-terraform/first/about/

Terraform実行環境

dockerでTerraform環境用意できるよ!

https://y-ohgi.com/introduction-terraform/first/preparation/

Command

wip

# terraform init

# terraform plan

# terraform apply

ECS

https://y-ohgi.com/introduction-terraform/handson/ecs/

Terraform 0.11 -> 0.14

https://www.terraform.io/upgrade-guides/0-13.html
# docker run v0.12
terraform init 
terraform 0.12upgrade 

# docker run v0.13
terraform init 
terraform 0.13upgrade 
terraform plan
# Error修正

# docker run v0.14
terraform plan

Terraform directory structur

https://qiita.com/anfangd/items/1b84f69fa2a4f8a29fbc

https://dev.classmethod.jp/articles/directory-layout-bestpractice-in-terraform/

複数サブネットを一度に作る

https://zenn.dev/shonansurvivors/articles/5424c50f5fd13d

Examples

https://github.com/duduribeiro/terraform_ecs_fargate_example

https://gitlab.com/jevans3/terraform-aws-multi-az-subnets/-/tree/master

Terraformでresourceリストからarrayを生成する

//  subnets         = [aws_subnet.public_1a.id, aws_subnet.public_1c.id, aws_subnet.public_1d.id]
  subnets = aws_subnet.public.*.id

TerraformでRDSを削除するとき

RDSにはインスタンス削除時にスナップショットをとるか設定できる項目skip_final_snapshotがあります。
サンプルコードではインスタンス作成時はこの値をfalseにし、削除するときはtrueにすると書いています。
しかし、私は誤ってfalseのままdestoryを実施してしまいました。(ログを残していなかったので、推測ではありますが)

インスタンス削除時にスナップショットをとる(skip_final_snapshot = false)ならば、
合わせてfinal_snapshot_identifierの設定が必要であり、この設定をしていないまま削除(destroy)を実行すると以下のエラーがでます。

https://qiita.com/1021ky@github/items/ca80df4610aee35e2f5d#rdsインスタンス削除時のスナップショット取得設定について

ecspressoでmigration

runコマンドで、既存コンテナをコマンドだけ上書きしてワンオフ実行する

ecspresso --config staging/config.yaml run \
  --overrides='{"containerOverrides":[{"name":"hoge", "command":["yarn", "run", "migration"], "memory": 1024 }]}'

eip -> nat -> route_table はprivateサブネットのとき、ecrからpullするためには必須だった。。。

このスクラップは2021/03/10にクローズされました
作成者以外のコメントは許可されていません