Hai!

Pada jurnal ini saya ingin sharing mengenai bagaimana mengimplementasikan layanan AWS Lambda untuk trigger dari Events di AWS CodeCommit.

Seperti lumbung, AWS CodeCommit adalah layanan di AWS yang memungkinkan kita untuk menyimpan atau menghosting repositori Git secara scalable, dan sangat kompatibel dengan tool-tool Git pada umumnya. AWS CodeCommit mirip seperti GitHub.

Dalam AWS CodeCommit, kita bisa mengkonfigurasi triggering action di beberapa events, seperti:

  1. Push code
  2. Membuat branch baru
  3. Membuat tag
  4. Merge (menggabungkan) branch

Dan setelah dikonfigurasi, kita bisa mengirimkan pemberitahuan (Misal ke SMS, Email) ketika event terjadi menggunakan layanan pihak ketiga atau dari AWS sendiri, yang mana disini akan kita coba menggunakan Amazon Simple Notification Service (SNS). Bagaimana proses tersebut bisa dilakukan secara otomatis? kita akan memanfaatkan layanan lain dari AWS yaitu AWS Lambda.

Untuk arsitekturnya, kurang lebih seperti berikut ini:

Disclamer: untuk penjelasan tentang masing-masing layanan, akan dijelaskan terpisah di blog lain ya! Terima kasih.

Mari kita coba.

Buka AWS Management Console di https://console.aws.amazon.com. Pada langkah pertama, kita akan membuat repositori baru di aws CodeCommit. Klik di kolom pencarian, tulis commit, dan pilih hasil teratas yaitu CodeCommit.

Di bawah ini adalah tampilan dashboard dari CodeCommit. Terlihat masih kosong karena saya belum memiliki repositori apapun. Klik Creaye repository untuk membuatnya.

Isikan nama repository, misal lab-repository dan tuliskan deskripsi. Lalu klik Create.

Akan muncul notifikasi Success yang menandakan repositori berhasil dibuat.

Catatan: simpan URL dari repositori ke teks editor. URL tersebut akan kita gunakan untuk pengujian di akhir.

Selanjutnya, ketik IAM dikolom pencarian. Lalu pilih hasil teratas.

Masuk ke tab Users, dan klik user masing-masing (sebagai owner dari repository)

Catatan: Untuk penjelasan tentang hak akses dari repositori secara detail akan dijelaskan di jurnal lain ya!

Masuk ke tab Security Credentials dan gulir ke bawah sampai bagian HTTPS Git Credentials AWS CodeCommit. Lalu klik Generate Credentials.

Akan muncul pop-up dari kredensial kita. Bisa diunduh lalu Close.

Selanjutnya kita beralih ke layanan Simple Notification Service (SNS) yang akan mengirimkan pemberitahuan ke kita ketika terjadi event di AWS CodeCommit.

Ketik sns di kolom pencarian, dan pilih hasil teratas.

Berikut tampilan dashboard dari Amazon SNS.

Pertama, kita buat topic terlebih dahulu. Masuk ke menu Topics. Lalu klik Create topic.

Untuk tipe pilih Standard, nama misal diset lab-topic, dan untuk pilihan lainnya biarkan default. Lalu klik Create.

Pastikan topic berhasil dibuat.

Selanjutnya, kita perlu membuat Subscriptions. Terlihat dashboard subscriptions saya masih kosong, dan bisa langsung klik Create subscription.

Sesuaikan Topic ARN, bisa langsung drop down, pilih Protocol (saya pilih Email, jadi nanti pemberitahuan akan masuk ke email), dan isikan email tujuan di kolom Endpoint. Dan bisa langsung klik Create.

Pastikan subcription berhasil dibuat. Kurang lebih akan muncul seperti berikut ini.

Bisa kita cek kotak masuk email yang kita isikan di endpoint tadi. Dan kita perlu konfirmasi subscriptionnya.

Setelah Amazon SNS selesai dikonfigurasi, kita masuk ke AWS Lambda. Ketik lambda di kolom pencarian, dan pilih hasil teratas.

Kita buat fungsi baru dengan klik Create function.

Pilih Author from Scratch. Isikan nama, misal lab-function, pilih runtime disini saya menggunakan Python 3.8.

Gulir ke bawah, pada Execution Role, pilih Use an existing role dengan drop down lambda_sns_execution yang telah dibuat sebelumnya. Lalu klik Create function.

Pastikan fungsi berhasil dibuat ya! Berikut tampilannya.

Kita gulir ke bawah, dan pada teks editor lambda_function.py, edit dengan kode:

import boto3

account_id = boto3.client('sts').get_caller_identity().get('Account')
codecommit = boto3.client('codecommit')
sns = boto3.resource('sns')
topic_arn = "arn:aws:sns:us-west-2:%s:lab-topic" % account_id
topic = sns.Topic(topic_arn)

REPO_LINK = "https://console.aws.amazon.com/codecommit/home?region=%s#/repository/%s"

def lambda_handler(event, context):
    print("Processing %s record(s)" % len(event['Records']))
    messages, regions = process_records(event['Records'])
    print("Sending %s notification(s)" % len(messages))
    send_notifications(messages, regions)
    return True

def process_records(records):
    messages = {}
    regions = {}

    for record in records:
        # extract record info
        repo_name = record['eventSourceARN'].split(':')[-1]

        regions[repo_name] = record['awsRegion']
        if repo_name not in messages:
            messages[repo_name] = {}

        for ref in record['codecommit']['references']:
            # extract commit info
            commit_id = ref['commit']
            branch = ref['ref'].split('/')[-1]

            # fetch commit data
            data = codecommit.get_commit(
                repositoryName=repo_name,
                commitId=commit_id,
            )

            message = data['commit']['message']

            if branch not in messages[repo_name]:
                messages[repo_name][branch] = []

            # store (commit_id, message) tuple
            messages[repo_name][branch].append((commit_id, message.strip()))

    return messages, regions

def send_notifications(messages, regions):

    for repo_name in messages:
        repo_url = REPO_LINK % (regions[repo_name], repo_name)
        email_text = "%s repository has had new commits added.\n\n" % repo_name
        email_text += "Repository URL: %s\n\n" % repo_url
        for branch in messages[repo_name]:
            email_text += "----------------------------------------\n"
            email_text += "Branch %s\n\n" % branch
            for commit_id, msg in messages[repo_name][branch]:
                email_text += ' - %s: "%s"\n' % (commit_id, msg)

        topic.publish(
            Message=email_text,
            Subject='AWS CodeCommit - %s' % repo_name,
        )

Lalu simpan dan klik Deploy.

Selanjutnya, kita klik + Add Trigger.

Pada Trigger configuration, pilih CodeCommit. Pilih repositori, tentukan nama trigger, events, dan branch ya. Gulir ke bawah dan klik Add Trigger

Pastikan trigger berhasil dibuat dan kita bisa mulai pengujian.

Disini saya akan melakukan pengujian menggunakan instance dari EC2. Ketik ec2 pada kolom pencarian, dan pilih hasil teratas.

Bisa buat instance baru, atau bisa menggunakan instance yang sudah ada. Pilih dan klik Connect.

Saat sudah masuk ke instance, kita konfigurasi kan dulu global configuration dari git nya ya.

git config --global credential.helper 'cache --timeout 10800'
git config --global user.name "your.user"
git config --global user.email your.email@example.com

Lalu kita clone reposotori yang telah dibuat di CodeCommit dan gunakan kredensial yang telah diunduh di IAM:

git clone [URL]

Kita masuk ke folder lab-reposotiry yang telah kosong, dan coba buat file README.md

Lalu kita coba push ke repositori:

git add README.md
git commit -m "Initial Commit"
git push origin master

Dan saat berhasil push, bisa kita cek kotak masuk email. Kita akan mendapatkan notifikasi bahwa ada user yang telah melakukan commit.

Sekian!