TerraformがFunctionComputeをサポートしました

こんにちは。ソリューションアーキテクト 森 (@mosuke5) です。
私の大好きなTerraformが、Alibaba Cloud ProviderがイベントドリブンコンピューティングのFunction Computeにも対応していたのでさくっと試してみました。ご報告です。

なおこちらのブログのサンプルコードはこちらからご確認できます。

account_idが必要

まず利用する上で注意が必要なのがaccount_idが必要であること。API KEYだけでは操作できません。理由はFunction Computeのエンドポイントにaccount_idが使われているためです。なぜそういう仕様にしたのかはアリババの人に聞いてみたいところです(わたしの宿題)。

rootアカウントのidなのでアカウント管理者に聞かなければ、、、と思いきやFCのコンソール画面の右サイドバーにエンドポイントの記載があり、そこを参照すると一番簡単に入手できます。

LogServiceとRAM

FCを構築する前にLogServiceとRAM Roleのリソースを構築しました。
理由は、こちらがなくても利用はできますが、FCの実行結果のログはLogServiceと連携できるようになっており、こちらがないとトリガー経由での実行結果が分かりづらいことと、ソースコードをオブジェクトストレージからインポートできるようにするためです。

GUIでRAM Roleを割り当てる場合には、自動でロールとそのポリシーを作成してくれますが、Terraform等で自動化するためには自分で作る必要があります。
今回の例では、LogServiceのPostとオブジェクトストレージへのGetのみ有効にしてポリシーを作成していきました。

resource "alicloud_ram_policy" "policy" {
  name = "fc-policy"
  statement = [
          {
            effect = "Allow"
            action = ["log:PostLogStoreLogs"]
            resource = [
              "acs:log:*:*:project/${alicloud_log_project.example.name}/logstore/${alicloud_log_store.example.name}"]
          },
          {
            effect = "Allow"
            action = ["oss:Get*"]
            resource = ["acs:oss:*:*:${var.oss_bucket}"]
          }
          ]
  description = "this is a policy test"
  force = true
}

Function Computeを作成する

続いて、FCのリソースを作っていきます。
Terraformに限ったことではないですが、serviceとfunctionとtriggerの3つを作成する必要があります。serviceを作成するときに、上記で作ったRAM RoleとLogServiceとの連携を忘れないようにしましょう。

resource "alicloud_fc_service" "foo" {
  name = "my-fc-service"
  description = "my fc service for terraform test"
  internet_access = false
  role = "${alicloud_ram_role.role.arn}"
  log_config = [
    {
      project = "${alicloud_log_project.example.name}"
      logstore = "${alicloud_log_store.example.name}"
    }
  ]
}

resource "alicloud_fc_function" "foo" {
  service = "${alicloud_fc_service.foo.name}"
  name = "hello-world"
  description = "my fc function for terraform test"
  oss_bucket = "${var.oss_bucket}"
  oss_key = "function_compute.py.zip"
  memory_size = "512"
  runtime = "python2.7"
}

resource "alicloud_fc_trigger" "foo" {
  service = "${alicloud_fc_service.foo.name}"
  function = "${alicloud_fc_function.foo.name}"
  name = "hello-trigger"
  type = "timer"
  source_arn = "test"
  config = <<EOF
    {
        "payload": "aaaaa",
        "cronExpression": "0 0/1 * * * *",
        "enable": true
    }
  EOF
}

cronExpressionは秒まで指定できる

時間でのトリガーを使ったのが初めてでしたが、cronExpressionと書いてあったので、Crontabと同じだ!と思い込んでいてハマりました。
Crontabとちがって1番目は「分」ではなく「秒」になります。また、秒に対しては”/”が使えないので注意です。

source_arnがまだ不具合

timerトリガーの場合にはsource_arnは不要なのですが、ないとエラーで怒られます。また、なにか記載してもterraform.stateには空で格納されるため、現時点ではterraform apply毎に変更が発生することになっています。ここは今後改善されると思います。

実行結果を確認する

実行結果はLogServiceのコンソールから無事確認することができました。

さいごに

イベントドリブンのコンピューティングは、クラウドのサービス間をつなぐ用途で使われることがおおいです。このような状況になるとTerraformのようなクラウド上のリソース管理サービスはより一層重要になってくると考えています。
まだTerraformを触ったことない人はいますぐ試しておきましょう。こちら入門ブログを貼っておきます。

また、今回のサンプルはGithubに公開しておきました。
https://github.com/mosuke5/terraform_examples_for_alibabacloud/tree/master/function_compute_sample

 

 

この記事をシェアする