aws escのecs_params.yml の設定

AWS ECS のタスク定義で使うもの。(docker-composeの形式ではサポートしていないものが多いので)

下記を定義しておく。

version: 1
task_definition:
  ecs_network_mode: string
  task_role_arn: string
  task_execution_role: string
  task_size:
    cpu_limit: string
    mem_limit: string
  services:
    <service_name>:
      essential: boolean
      cpu_shares: integer
      mem_limit: string
      mem_reservation: string
      healthcheck:
        test: ["CMD", "curl -f http://localhost"]
        interval: string
        timeout: string
        retries: integer
        start_period: string 
run_params:
  network_configuration:
    awsvpc_configuration:
      subnets: 
        - subnet_id1 
        - subnet_id2
      security_groups: 
        - secgroup_id1
        - secgroup_id2
      assign_public_ip: ENABLED

下記のような感じでファイルを指定すれば読み込んでくれる

$ ecs-cli --ecs-params ${ecs_params.yml} 

AWS fargateで Task failed ELB health checks in (elb elb-name) がでた際には…

自分が携わってるサービスではaws fargateでデフォルトで設定してると発生する。
そのときの、対策メモ

fargateのスピンアップは遅い(自分のアプリでは)

fargateはコンテナの起動後から、すぐにELBが負荷分散のチェックが入るようで、デフォルトの設定だとすぐにタイムアウトして、Task failed ELB health checks in (elb elb-name)これを投げる。なんか、AWSでよくあるセキュリティグループとかの設定がー…とか思うんだけど、一番よくあるのは、このケース。
fargateの設定の中に、ヘルスチェックの猶予期間があるけど、これはデフォルトで120秒くらいにはしておこうと思う…
ターゲットグループの方でチェックしてもいいけど、アプリ切り替えとかしたときに、そっちの設定変更するときとか大変だし。

アベイラビリティゾーンの設定が…

よくプライベートセグメントとパブリックセグメントでわけてたりするんですけど、設定間違ってパブリックにしたりしてて、ELBが期待してるセグメントと違うことがあった。

他にもあったら追記します

Javaアプリをdocker化してくれるjibを環境ごとに分岐する

Java(Spring)アプリをdocker化してくれるんだけど、環境ごとに分けたいことはあるので、パラメータを切り替えられるようにする。

buildscript {
    ext {
        springBootVersion = '2.0.3.RELEASE'
                jibVersion = "0.9.8"
    }
    repositories {
        mavenCentral()
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath "gradle.plugin.com.google.cloud.tools:jib-gradle-plugin:${jibVersion}"
    }
}

apply plugin: 'org.springframework.boot'
apply plugin: 'com.google.cloud.tools.jib'
    dependencies {
        compile('org.springframework.boot:spring-boot-starter-webflux')
        compile('org.springframework.boot:spring-boot-starter-thymeleaf')
    }

/**
* jibの設定 ifで分岐する
*/
    if(project.build == 'product') {
        jib {
            from {
                image = 'adoptopenjdk/openjdk8:alpine'
            }
            to {
                image = 'sample/jib-demo-product-app'
            }
            container {
                jvmFlags = ['-Xms512m', '-Xdebug']
                mainClass = 'com.example.demo.DemoApplication'
                args = []
                ports = ['8080/tcp']
            }

        }
    } else {
        jib {
            from {
                image = 'adoptopenjdk/openjdk8:alpine'
            }
            to {
                image = 'sample/jib-demo-app'
            }
            container {
                jvmFlags = ['-Xms512m', '-Xdebug']
                mainClass = 'com.example.demo.DemoApplication'
                args = []
                ports = ['8080/tcp']
            }

        }
    }

上記のように設定し、gradleコマンドをキックするときに、引数を渡してあげればいい

$ ./gradlew -Pbuild=product

=================
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
sample/jib-demo-product-app   latest              4fe1925bb902        48 years ago        220MB

こんな感じで作成される。 48years ago ってでてるけど、なんなんだろ。まぁCREATEDだからいいか

他にもjibのタスク呼び出しとかあるが、JibExtensionとかいろいろ呼ぶの面倒そうなので、逃げでもある

awsのlambdaをserverless framework runtime Java8の環境構築

AWSのlambdaをserverless frameworkでJavaで動かそうとしているので、環境構築メモ

serverless frameworkインストール

まずはnpmでインストール

$ npm install -g serverless 

templateプロジェクト作成

今回は、aws-gradle-javaで作ることに

$ serverless create --template aws-java-gradle --path ${プロジェクト名}
$ cd ${プロジェクト名}

ローカル環境で実行

Javaプロジェクトをビルドしたあとにローカル環境で実行してみる
hello というエンドポイントが設定されてるので、これで実行してみる

$ serverless invoke local --function hello

Serverless: In order to get human-readable output, please implement "toString()" method of your "ApiGatewayResponse" object.
log4j:WARN No appenders could be found for logger (com.serverless.Handler).

log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

com.serverless.ApiGatewayResponse@475530b9

こんな感じで、Javaが実行される

awsのアップロード等は次回