AWS ES Domain

Saya mencoba menjelaskan langkah-langkah apa yang harus dilakukan untuk melakukan migrasi data dari self-managed Elasticsearch cluster ke Amazon Elasticsearch Service.

Langkah-langkah ini berdasarkan pengalaman pribadi melakukan migrasi dengan acuan panduan dokumentasi-dokumentasi dari AWS. Kamu bisa membaca dokumentasi Migrating to Amazon Elasticsearch Service dan tidak melanjutkan membaca langkah-langkah yang saya pakai.

Pastinya kamu harus membuat atau memiliki snapshot yang akan dimigrasi, dan diupload ke AWS S3, jika belum silahkan baca bagian Take and Upload the Snapshot.

1: Berikan izin


Kamu harus membuat sebuah IAM Role yang memiliki policy untuk memberikan izin Elasticsearch cluster ini untuk menggunakan snapshot yang sudah disiapkan didalam AWS S3.

1.1: Buat sebuah IAM Role

Pada bagian Select type of trusted entity pilih AWS Service. Kemudian pada bagian Choose a use case pilih saja EC2 jika Elasticsearch tidak kamu temukan, karena nanti bisa kamu gubah.

1.2: Attach permissions policies

Buat sebuah policy jika belum mempunyai, dengan isi sebagai berikut:

{
  "Version": "2012-10-17",
  "Statement": [{
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::migration-bucket"
      ]
    },
    {
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:DeleteObject"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::migration-bucket/*"
      ]
    }
  ]
}

migration-bucket yang tertera diatas bisa kamu ganti tergantung nama AWS S3 bucket tempat menyimpan snapshot yang akan di-restore.

Lanjutkan dengan memberi nama untuk policy ini, contohnya AmazonS3ElasticsearchBackupAccess, dan konfirmasi membuat policy-nya.

Kembali ke halaman membuat IAM Role sebelumnya, klik tombol refresh sebelah kanan, dan cari nama policy yang tadi kamu buat, kemudian pilih dan lanjutkan.

1.3: Review

Lanjutkan dengan memberi nama untuk role ini, contohnya AmazonESSnapshotRole, dan konfirmasi membuat role-nya.

1.4: Trust relationships

Jika sebelumnya kamu memilih EC2 sebagai trusted entity dari AWS Service untuk role ini, maka kamu perlu menggubah Trust relationships dari role yang tadi dibuat, dengan masuk ke halaman detil role, pilih tab Trust relationships, klik tombol Edit trust relationship, kemudian ganti isinya sebagai berikut:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "es.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

Kemudian lanjutkan update.

1.5: Berikan izin sebuah user atau role

Izin untuk user atau role ini harus dibuat supaya Elasticsearch cluster dapat mengakses AWS S3 memanfaatkan IAM Role yang tadi kamu buat.

Izin ini saya perkirakan hanya untuk user atau role yang tidak mempunyai akses penuh terhadap semua Action dan Resource didalam akun AWS kamu. Jika mempunyai user atau role tersebut, saya perkirakan kamu dapat melewati bagian ini.

Jika tidak, maka buat sebuah Policy, contoh nama AmazonESSnapshotPassRole, dengan permission sebagai berikut:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iam:PassRole",
      "Resource": "arn:aws:iam::123456789012:role/AmazonESSnapshotRole"
    }
  ]
}

Kemudian Add permissions dan pilih policy tadi terhadap sebuah user, atau role jika kamu sudah memahami pemakaian IAM Role.

1.6: Konfigurasi di Kibana

Saya perkirakan jika kamu mengaktifkan Fine–grained access control, maka diperlukan konfigurasi di Kibana. Silahkan coba lewati bagian ini jika kamu tidak mengaktifkan.

Masuk ke Kibana menggunakan kredensial master user yang kamu tentukan saat membuat Elasticsearch cluster ini. Kamu bisa menemukan URL Kibana di halaman Overview.

Di Kibana, pilih Security, Role Mappings, dan Add. Untuk Role, pilih manage_snapshots. ARN untuk user masuk ke bagian users, dan ARN untuk role masuk ke bagian Backend roles. Langkah ini untuk memberikan izin Fine–grained access control menggunakan snapshot.

Gunakan ARN user yang memiliki akses terhadap AWS S3 dimana snapshot yang akan dipakai tersimpan. Kemudian gunakan ARN role AmazonESSnapshotRole.

2: Restore snapshot


Sebelum memulai restore, kamu harus membuat sebuah konfigurasi repository didalam Elasticsearch cluster.

2.1: Mendaftarkan migration repository

Untuk membuat sebuah konfigurasi repository, kamu harus menggunakan IAM kredensial yang memiliki akses terhadap Elasticsearch cluster, karena didalam konfigurasi itu mempunyai property role_arn.

Jika Elasticsearch cluster berada didalam sebuah VPC, maka kamu hanya dapat mengaksesnya melalui AWS services yang berada didalam VPC yang sama, contohnya sebuah Instance EC2.

Jadi silahkan tentukan melalui apa tergantung posisi Elasticsearch cluster kamu, didalam sebuah VPC atau tidak.

Untuk mendaftarkan repository, karena harus menggunakan IAM kredensial, maka kamu bisa menggunakan alat yang lebih mudah, yaitu:

  • Postman jika tidak didalam VPC, gunakan IAM kredensial didalam bagian Authorization, atau;
  • awscurl, jika didalam VPC, dengan perintah sebagai berikut:
awscurl -X PUT --service es --region us-west-1 \
--access_key <ganti_dengan_access_key_kamu> \
--secret_key <ganti_dengan_secret_key_kamu> \
https://<ganti_dengan_elasticsearch_domain_endpoint_kamu>/_snapshot/migration-repository \
-H 'Content-Type: application/json' \
-d '{
  "type": "s3",
  "settings": {
    "bucket": "migration-bucket",
    "base_path": "<ganti_dengan_folder_aws_s3_snapshot_kamu_disimpan_atau_hapus_property_ini_jika_tidak_memakai_folder>",
    "region": "us-west-1",
    "compress": true,
    "role_arn": "arn:aws:iam::123456789012:role/AmazonESSnapshotRole"
  }
}'

Value dari --region ganti dengan lokasi dimana Elasticsearch cluster dan AWS S3 kamu berada.

2.2: Memilih snapshot

Jika repository diatas berhasil dibuat, maka kamu bisa melihat daftar snapshot yang tersedia, bisa tetap menggunakan Postman atau curl.

Jika kamu mengaktifkan Fine–grained access control, maka otentikasi master user harus digunakan pada bagian ini untuk mengakses Elasticsearch cluster, tergantung apakah memakai IAM ARN, atau Create master user yaitu terdapat username dan password.

Jika memakai username dan password, maka kamu bisa menggunakan HTTP basic authentication.

curl -XGET -u "<username>:<password>" \
https://<ganti_dengan_elasticsearch_domain_endpoint_kamu>/_snapshot/migration-repository/_all?pretty=true

Kamu akan melihat daftar seperti dibawah ini (bagian tertentu saya hapus)

[{
    "snapshot" : "snap_6.3.2_20201120000501",
    "uuid" : "apki4AP-Se12dua6AmqBAg",
    "version_id" : 6030299,
    "version" : "6.3.2",
    "indices" : [ ... ],
    "include_global_state" : true,
    "state" : "SUCCESS",
    "shards" : {
      "total" : 20,
      "failed" : 0,
      "successful" : 20
    }
  }, {
    "snapshot" : "snap_6.3.2_20201120010501",
    "uuid" : "uFtWFjHhSpOUzhFB13BQoRw",
    "version_id" : 6030299,
    "version" : "6.3.2",
    "indices" : [ ... ],
    "include_global_state" : true,
    "state" : "SUCCESS",
    "shards" : {
      "total" : 20,
      "failed" : 0,
      "successful" : 20
    }
  }]

2.3: Restore snapshot

Masih memakai penjelasan poin diatas mengenai otentikasi. Kamu tentukan snapshot mana yang akan di-restore

curl -XPOST -u "<username>:<password>" \
https://<ganti_dengan_elasticsearch_domain_endpoint_kamu>/_snapshot/migration-repository/snap_6.3.2_20201120000501/_restore?wait_for_completion=true \
-H 'Content-Type: application/json' \
-d '{
  "indices": "...",
  "include_global_state": false
}'

2.4: Periksa hasil restore

curl -XGET -u "<username>:<password>" \
https://<ganti_dengan_elasticsearch_domain_endpoint_kamu>/_cat/indices?v