More Related Content Similar to TerraformでECS+ECRする話 (20) TerraformでECS+ECRする話2. - 平山 聡
- @株式会社ガラパゴス(←5社目
- サーバーサイド&インフラ文系エンジニア
- 先日Swiftデビューもしました
- 社内ポエマー
- 前職以前は無駄にいろんな言語で無駄にいろんなターゲットを相手に
- 68Kアセンブラ, C, C++, Java, Javascript, Objective-C, Object Pascal, Pascal, Ruby, VB, etc
- 4D, FileMaker, Oracle, PostgreSQL, etc
- iOS, iTron, Mac OS(Classic), Mac OS X, RHEL, Solaris, Windows, etc
- 官公庁, 金融機関, 公共機関, 研究機関, 企業, プロシューマー, コンシューマー, etc
自己紹介
3. - 主な事業
- スマートフォンアプリの受託開発
- 機械学習で何かする
- 主な技術
- Java、Rails、Swift、Tensorflow、AWS...など
- 自社アプリも開発してます!
- エンジニアブログ
- http://gtech.hatenablog.com/
ガラパゴスの紹介
Start fit
「脱・三日坊主」始めて続く ダイエットフィットネスアプリ
iOS / Apple Watch
ひっそり40万+DL
https://itunes.apple.com/jp/app/tuo-san-ri-fang-zhu-shimete/id985618426?mt=8
5. - ECS (Amazon EC2 Container Service)
- docker
- コンテナAをクラスタ(インスタンス) 1で動かす、というような管理
- ECR (Amazon EC2 Container Registry)
- docker repository
- docker hubと異なり容量と転送量で課金( S3的なイメージ)
- Terraform
- インフラどーんするやつ
- VPC以下のAWSリソースを一気に
ざっくりすぎる要素の説明
10. ロール設定
- インスタンスで以下のロールを許可する必要がある
- ecs:
- CreateCluster, DeregisterContainerInstance, DiscoverPollEndpoint, Poll,
RegisterContainerInstance, StartTelemetrySession, Submit*, StartTask
- ecr:
- BatchCheckLayerAvailability, BatchGetImage, GetDownloadUrlForLayer,
GetAuthorizationToken
- ec2:
- Describe*, AuthorizeSecurityGroupIngress
- LB配下に置く場合は、加えて以下も必要
- elasticloadbalancing:
- Describe*, DeregisterInstancesFromLoadBalancer, RegisterInstancesWithLoadBalancer
11. Proxy環境でのecs-agent設定
- dockerインストール時の注意
- docker自身も環境変数etcのproxy設定を読まないので proxyを使うように設定ファイルを作る必要
がある
- ecs-agentインストール時の注意
- ecs-agentも環境変数やdockerに設定したproxy設定を読まないので( ry
- NO_PROXYを指定する必要がある
- 169.254.169.254,169.254.170.2,/var/run/docker.sock
- この設定値は公式ドキュメント参照
- http://docs.aws.amazon.com/AmazonECS/latest/developerguide/http_proxy_config.html
- これらのIPはiptableも編集する必要がある
18. - docker imageを更新した時
- docker push後、タスク定義を最新にしても、古いタスクが動いたままになって新しいコンテナが動
かない
- deployment_minimum_healthy_percent(最小ヘルス率)を満たす分だけ古いコンテナを残し
て入れ替わる
- deployment_minimum_healthy_percentを満たす分だけ新しいコンテナに入れ替わると残り
も全部入れ替わる
- デフォルトでは100%が指定されているので入れ替わらない
- 複数のコンテナインスタンスがある場合は適切に設定する
- このとき、手動でタスクを停止すると、 LBからインスタンスがデタッチされてしまう
ECSハマりポイント
25. tfファイルの作成
resource "aws_instance" "app" {
ami = "ami-0567c164"
associate_public_ip_address = "false"
availability_zone = "ap-northeast-1a"
instance_type = "t2.micro"
key_name = "techtalk"
root_block_device = {
volume_size = "20"
volume_type = "gp2"
}
subnet_id = "${aws_subnet.private_1.id}"
tags {
Name = "techtalk_app"
}
vpc_security_group_ids = ["${aws_security_group.private.id}"]
}
- リソースの設定はそのまま key = “value” の
形式で書く
- あっちゃこっちゃタブを行き来したりしなくてい
い
- 依存するリソースの値を変数として参照できる
27. ECSリソース
- aws_instanceリソース
- ECSクラスタを動かすインスタンス
- 通常はAmazon ECS Optimized AMIを指定する
- aws_ecs_clusterリソース
- Amazon ECS -> クラスターに相当
- aws_ecs_task_definitionリソース
- Amazon ECS -> タスク定義に相当
- aws_ecs_serviceリソース
- Amazon ECS -> クラスター -> サービスに相当
30. 作られるリソースの確認
- terraform plan すると実行計画を確認できる
$ terraform plan
Refreshing Terraform state in-memory prior to plan…
(略)
+ aws_ecr_repository.repo
arn: "<computed>"
name: "techtalk"
registry_id: "<computed>"
repository_url: "<computed>"
(略)
Plan: 2 to add, 0 to change, 0 to destroy.
$
31. - terraform apply したら一式できる
- リソース追加しいときはtfファイルに追加してapply
リソースの作成
$ terraform apply
aws_ecr_repository.repo: Creating...
arn: "" => "<computed>"
name: "" => "techtalk"
registry_id: "" => "<computed>"
repository_url: "" => "<computed>"
(略)
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
$
32. $ terraform destroy
Do you really want to destroy?
Terraform will delete all your managed infrastructure.
There is no undo. Only 'yes' will be accepted to confirm.
Enter a value: yes
aws_ecr_repository.repo: Refreshing state... (ID: techtalk)
(略)
aws_ecr_repository.repo: Destroying...
aws_ecr_repository.repo: Destruction complete
Destroy complete! Resources: 2 destroyed.
$
- 一部だけ消したいときはそのリソースをtfファイルから消してapply
- terraform destroyで全部消える
リソースの削除
33. - インフラをコードに記述
- 論理的一貫性がある
- 冪等性がある
- コンソール上での悩みの多くが解決
- easy
- 独自言語だがJSON拡張
- AWS SDKでイチから書くのに比べてはるかに少なくシンプルな記述
- tfファイルは使い回しできる
- 同じような構成のインフラを何度でも作れる
- tfファイル自体にはAWSアカウントの情報は含まれないので別のアカウントに適用できる
- 分割できるので要素ごとに書いておいて必要なぶんだけ使うようにできる
しあわせになれるところ