【Amplify】 Amplify CLI を使ってカスタムリソースをデプロイする

記事タイトルとURLをコピーする

こんにちは、技術1課の加藤です。
今日も今日とて Amplify。

Amplify ではあらかじめ用意されているテンプレートから生成した CloudFormation スタック以外に、ユーザーが作成したテンプレートを流すことができる機能があります。

今回はこの機能を使ったチュートリアルということで、 Amplify を使って EC2 インスタンスを立ててみます。

手順

以下手順で行っていきます。

  1. Amplify プロジェクトを作成
  2. カスタムリソースを定義
  3. テンプレート内容を定義
  4. デプロイ

公式ドキュメントはこちら
Custom CloudFormation stacks

1. Amplify プロジェクトを作成

とりあえず Amplify のプロジェクトを作りましょう。
フロントも何もなく、ただ EC2 を立てるだけという Amplify を使う意味...? 状態で作成をしていきます。

$ mkdir amplify-custom-cfn
$ cd amplify-custom-cfn
$ amplify init

init 時の選択肢は全てデフォルトで Enter を押しました。

2. カスタムリソースを定義

まずカスタムリソースを定義していきます。
リソースの定義は amplify/backend/backend-config.json に記載されています。

デフォルトでは何も入っていない {} が書いてあるだけです。
ここに、EC2 インスタンスを立てるためのカスタムリソース instance を作りましょう。

{
  "instance": {
    "EC2": {
      "service": "EC2",
      "providerPlugin": "awscloudformation"
    }
  }
}

次に上記の定義に対応したテンプレートファイルを配置します。
配置場所は amplify/backend/instance/EC2/template.json になる様子。
またテンプレートに渡すパラメータは template.json と同じディレクトリ に parameters.json として保存します。

$ mkdir -p amplify/backend/instance/EC2
$ touch amplify/backend/instance/EC2/{template,parameters}.json

この状態ではまだ Amplify CLI はカスタムリソースの存在を認識していません。 amplify statusをしても何も出てこないことが確認できます。

$ amplify status

Current Environment: dev

| Category | Resource name | Operation | Provider plugin |
| -------- | ------------- | --------- | --------------- |

カスタムリソースを Amplify CLI に認識してもらうには、以下のように checkout をしてあげる必要があります。

$ amplify env checkout dev
✔ Initialized provider successfully.
Initialized your environment successfully.
$ amplify status

Current Environment: dev

| Category | Resource name | Operation | Provider plugin   |
| -------- | ------------- | --------- | ----------------- |
| Instance | EC2           | Create    | awscloudformation |

これで Amplify CLI にカスタムリソースの存在を知らせることができました。

3. テンプレート内容を定義

とはいえまだ template.json の中身は空っぽです。
今回は EC2 と SecurityGroup をデフォルト VPC に作成していきます。以下を template.json に書き込んでください。
(※ 値については適宜自分の指定したい値に書き換えてご利用ください)

{
    "Parameters": {
    "env": {
      "Type": "String"
    },
    "KeyName": {
      "Type": "AWS::EC2::KeyPair::KeyName"
    }
  },
  "Resources": {
    "Instance": {
      "Type": "AWS::EC2::Instance",
      "Properties": {
        "InstanceType": "t3.micro",
        "ImageId": "ami-0a1c2ec61571737db",
        "KeyName": {
          "Ref": "KeyName"
        },
        "BlockDeviceMappings": [{
          "DeviceName": "/dev/xvda",
          "Ebs": {
            "VolumeType": "gp2",
            "VolumeSize": 8
          }
        }],
        "SecurityGroupIds": [{
          "Ref": "SecurityGroup"
        }],
        "Tags": [{
          "Key": "Name",
          "Value": "AmplifyCustomCfnTest"
        }]
      }
    },
    "SecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "GroupName": "AmplifyCustomCfnTest",
        "GroupDescription": "for AmplifyCustomCfnTest",
        "SecurityGroupIngress": [{
          "CidrIp": "0.0.0.0/0",
          "FromPort": 22,
          "ToPort": 22,
          "IpProtocol": "tcp",
          "Description": "SSH Access from Anywhere"
        }]
      }
    }
  }
}

また parameters.json にキーペアの情報を入力しておきます。自分の利用しているキーペアの名前を入れてあげてください。

{
  "KeyName": "<KeyPairName>"
}

ちなみにパラメータのうち env はResourcesで特に利用していないのですが、この指定をせずにデプロイすると以下のエラーが発生しました。

Parameters: [env] do not exist in the template

パラメータを利用する場合、 env はテンプレート内での使用有無に関わらず用意してあげる必要があるみたいです。

4. デプロイ

ではデプロイをしてみましょう。

$ amplify push

これで環境が立ち上がります。
EC2 が一台立ち上がっていれば成功です。

5. 環境削除

以下コマンドで環境を削除します。

$ amplify delete

この時、 amplify ディレクトリ ごとガサっと消えちゃうようです。
作成したコードも一緒に消えちゃうみたいなので、手がいたテンプレートの管理はお気をつけて。

まとめ

独自に作成した CFn をAmplifyを使って流してみました。
今回はとりあえず作ってみよう、ということで EC2 を立ててみましたが、かなり汎用的にAmplifyを利用することができそうです。

Amplify が提供している機能を使ってベースの実装はショートカットしつつ、バッチ処理などで必要なリソースは今回使ったカスタムCFnで作成していく、なんてことがやりやすくなっていきますね。

今後も Amplifyの記事継続的にアップしていきます。