Menu

Friday, November 29, 2019

[Laravel - AWS] วิธีการเก็บ Cache Credentials สำหรับ AWS SDK ของ PHP
[Laravel - AWS] How to Cache Credentials for the AWS SDK for PHP

Credentials จะถูกเรียกใช้ทุกครั้งที่มีการส่ง request ไปยัง Amazon Web Services

มีหลายวิธีที่จะตั้งค่า Credentials นี้ สามารถอ่านได้ที่ Credentials for the AWS SDK for PHP Version 3

ถ้า Application ของเรารันบนเครื่อง Amazon EC2 วิธีการที่แนะนำ คือ การใช้ IAM role เพื่อดึง Credentials แบบชั่วคราวมาใช้งาน

สำหรับการใช้งาน IAM roles, metadata service จะถูกเรียกถูกครั้งที่เรียกใช้ Credentials

หมายเหตุ การเรียกใช้ metadata service คือ การส่ง request ไปที่ metadata server ใน เครื่อง EC2 ซึ่งอาจจะมี network latency ได้

เพื่อหลีกเลี่ยงการเรียกใช้ metadata service ทุกครั้ง เราต้องสร้าง class LaravelAwsCacheAdapter ที่ implements Aws\CacheInterface ตามด้านล่างนี้
<?php

namespace App\Ship\Adapters;

use Aws\CacheInterface;
use Cache;

class LaravelAwsCacheAdapter implements CacheInterface
{
    /**
     * @inheritdoc
     */
    public function get($key)
    {
        return Cache::get($key);
    }

    /**
     * @inheritdoc
     */
    public function remove($key)
    {
        Cache::forget($key);
    }

    /**
     * @inheritdoc
     */
    public function set($key, $value, $ttl = 0)
    {
        Cache::put($key, $value, $this->convertTtl($ttl));
    }

    /**
     * The AWS CacheInterface takes input in seconds, but the Laravel Cache classes use minutes. To support
     * this intelligently, we round up to one minute for any value less than 60 seconds, and round down to
     * the nearest whole minute for any value over one minute.
     *
     * @param $ttl
     * @return float|int
     */
    protected function convertTtl($ttl)
    {
        $minutes = floor($ttl / 60);

        if ($minutes == 0) {
            return 1;
        } else {
            return $minutes;
        }
    }
}

หลังจากนั้นให้เราตั้งค่า option credentials สำหรับ AWS client เป็น LaravelAwsCacheAdapter ตามตัวอย่างข้างล่างนี้

S3 ใน filesystems.php
's3' => [
    'driver' => 's3',
    'key' => env('AWS_KEY'),
    'secret' => env('AWS_SECRET'),
    'credentials' => new \App\Ship\Adapters\LaravelAwsCacheAdapter(),
    'region' => env('AWS_REGION'),
    'bucket' => env('AWS_BUCKET'),
    'timeout' => env('AWS_CREDENTIAL_TIMEOUT'),
],

SQS ใน queue.php
'sqs' => [
    'driver' => 'sqs',
    'key'    => env('SQS_PUBLIC_KEY'),
    'secret' => env('SQS_SECRET_KEY'),
    'credentials' => new \App\Ship\Adapters\LaravelAwsCacheAdapter(),
    'prefix' => env('SQS_PREFIX'),
    'queue'  => env('SQS_QUEUE_NAME'),
    'region' => env('SQS_REGION'),
    'timeout' => env('AWS_CREDENTIAL_TIMEOUT'),
],

No comments:

Post a Comment