Elasti Cache for Redis 버거를 만들어 봤어요.

20348 단어 AWSElastiCachetech
이쪽 손잡이를 가지고 놀아 봤어요.
https://aws.amazon.com/jp/getting-started/hands-on/boosting-mysql-database-performance-with-amazon-elasticache-for-redis/
RDS의 전 단계에서 캐시 서버로 ElastiCache를 설정하면 RDS에 대한 부하를 줄이는 제작을 체험할 수 있다.
이것은 블랙홀에 갈 때의 노트다.
Elasti Cache의 피규어를 해보고 싶은 분들을 위해 참고해 주시길 바라며 기사를 남기기로 했습니다.
EC2와 RDS 주변의 설정은 상당히 대략적으로 쓰여 어느 정도 아는 사람에게 적합하다.
해 보았을 때의 주의점과 절약을 위해 바뀐 점을 적었다.

추정 독자층

  • EC2, VPC 주변에 구조를 만드는 습관
  • RDS 만져봤어
  • ElastiCache를 만져본 적이 없음
  • 가격 참조


    계좌가 12개월의 무료 범위 내에 있으면 무료로 적용할 수 있도록 손잡이를 설치했기 때문에 개의치 않고 실시할 수 있다.
    하지만 Elasti Cache에 관심이 많아요. 12개월 무료 계좌를 가진 사람은 드물지 않나요...나는 공짜 기간에 아무런 이익도 느끼지 못한 나를 원망한다...
    이것은 참고하기 전AWS Pricing Calculator에 낸 비용이다.
    월액이지만 왠지 원가감을 잡기 위해 놔두는 느낌이다.
    RDS for MySQL
    Storage for each RDS instance (General Purpose SSD (gp2)), Storage amount (30 GB), Quantity (1), Instance type (db.t4g.micro), Utilization (On-Demand only) (100 %Utilized/Month), Deployment option (Single-AZ), Pricing strategy (OnDemand)
    Monthly:
    15.13 USD
    Amazon ElastiCache
    Nodes ( 1 instances of type Redis Standard cache t4g.micro OnDemand )
    Monthly:
    11.68 USD
    Upfront:
    0.00 USD
    EC2
    Operating system (Linux), Quantity (1), Pricing strategy (On-Demand Instances), Storage amount (30 GB), Instance type (t2.micro), General Purpose SSD (gp3) - IOPS (3000), General Purpose SSD (gp3) - Throughput (125 MBps)
    Monthly:
    10.87 USD
    실비 금액
    또한 원가 자원 관리자가 확인한 후 실제 비용(USD)은 다음과 같다.
    수작업 시간은 4시간 정도, 실제 가동 시간은 2시간 정도다.
    ElastiCache 0.07$
    RDS 0.03$
    EC2 0.03$
    총 0.13달러

    전체 개요


    이후 제목과 한슨의 항목 수는 대응했다.
    전체적으로 다음과 같은 절차다.
  • 개요.어플리케이션 서버를 위한 EC2, VPC 주변 환경 등
  • 작성
  • 1 ElastiCache의 제작
  • 2RDS 제작
  • 3EC2와 RDS 연결
  • 4EC2와 ElastiCache의 연결, 동작 확인
  • 5청소
  • 또 루트 테이블 쓰기 등은 생략했지만 대체로 구성도를 만들었다.
    ElastiCacheハンズオン
    서브넷의 IP 주소 범위는 임의의 값일 수 있습니다.왜 /20냐면, 단지 VPC의 빠른 설정에 지정된 것이 /20이기 때문이다.
    RDS의 서브넷 그룹에서 두 개의 AZ 다른 서브넷을 지정해야 하기 때문에 빈 개인 서브넷이 왜 필요합니까?
    비용에 신경 쓰면 일라스티케이치 가동 시간을 줄이기 위해 다음 순서로 진행해도 문제없다.
    概要. EC2,VPC周りの作成 → 2. RDSの立ち上げ → 3.EC2とRDSの接続 → 1.ElastiCacheの立ち上げ → 4. EC2とElastiCacheの接続,動作確認
    
    한돈이 기재한 대로 진행한다면 1.ElastiCache를 시작한 후 4.EC2에서 Elasti Cache까지 모두 출전하지 않아 비용이 많이 드는 느낌이다.
    대체로 허주온과 마찬가지로 문제가 없지만 안전팀 설정이 좀 복잡할 수 있어 안전팀 관련 그림도 준비했다.
    ElastiCacheハンズオン_セキュリティグループ

    개요. 개요.VPC, EC2, EC2의 IAM 역할은 각각 제작


    ElastiCache, RDS와 연결된 유사한 응용 프로그램 서버를 설치하는 EC2의 작업은 핸드폰에 포함되지 않습니다.
    혼자 하세요.
    VPC 개인 서브넷2, 공용 서브넷1의 구성
    EC2 t2.micro, Amazon Linux2 는 자동으로 할당된 공용 IP를 효율적이고 일반적인 인스턴스로 만들어 공용 서브넷에 구성합니다.보안 그룹에서 MyIP를 허용합니다.
    IAM에 RDSFulAccess 스크롤 및 ElastiCache Full Access의 AWS 관리 정책을 부여하고 EC2에 첨부할 준비를 합니다.
    SSH 연결을 통해 사전 요구 사항에 기재된 설치 주위의 명령을 실행합니다.

    1. ElastiCache 시작


    기본적으로 절차에 따라 진행하다.
    엔진 로그에 어떤 로그가 나올지 궁금하기 때문에 유효하다.새로 만들어서 로그 그룹을 지정합니다.
    비용을 의식하여 도AZ가 사용하지 않기 때문에 서브넷은 방금 만든 개인 서브넷을 지정한다.
    안전팀은 별도로 제작하고 지정한다.이전에 생성된 EC2 보안 그룹에서 6379 포트에 액세스할 수 있습니다.
    セキュリティグループ
    생성 중
    作成中
    완성
    完了

    2. RDS의 제작


    오로라는 비싸서 안 써요.
    MySQL 용 RDS 를 사용합니다.
    방금 만든 두 개의 개인 서브넷을 포함하는 서브넷 그룹을 만듭니다.
    다음을 설정합니다.
    실례 유형db.t4g.micro
    데이터베이스 인증 옵션 암호 인증
    VPC 보안 그룹 새로 만들기
    잘못된 자동 백업
    암호화가 잘못되었습니다.
    제작되면 VPC의 콘솔에서 RDS에 대해 새로 작성된 보안 그룹을 편집합니다.생성 후 MyIP에서 3306 포트로의 접속만 허용됩니다.
    이전에 생성된 EC2 인스턴스의 보안 그룹에서 3306 연결을 허용합니다.
    セキュリティグループ

    3. EC2 인스턴스에서 RDS로의 연결


    절차에 따라 테스트 데이터를 투입하다.
    (개인적으로 이 근처에서 mysql 명령을 잘못 들어서 시간이 좀 걸렸어요.)

    4. ElastiCache에 연결


    python 코드를 실행할 때, Redis의 단점을 입력할 수 있습니다
    로 설정해야 합니다.
    코드의 실행
    콘솔에서 캐시 주위의 동작을 확인하고 싶어서 example.py를 편집하고 print를 준비했습니다.
    또한, 먼저 redis://エンドポント의 동작을 확인하고 싶어서fetch의 실행에 대해 논평을 하였다.
    변경 부분은 주석으로 기재한다
    example.py
    import os
    import json
    
    import redis
    import pymysql
    
    class DB:
        def __init__(self, **params):
            params.setdefault("charset", "utf8mb4")
            params.setdefault("cursorclass", pymysql.cursors.DictCursor)
    
            self.mysql = pymysql.connect(**params)
    
        def query(self, sql):
            with self.mysql.cursor() as cursor:
                cursor.execute(sql)
                return cursor.fetchall()
    
        def record(self, sql, values):
            with self.mysql.cursor() as cursor:
                cursor.execute(sql, values)
                return cursor.fetchone()
    
    # Time to live for cached data
    TTL = 10
    
    # Read the Redis credentials from the REDIS_URL environment variable.
    REDIS_URL = os.environ.get('REDIS_URL')
    
    # Read the DB credentials from the DB_* environment variables.
    DB_HOST = os.environ.get('DB_HOST')
    DB_USER = os.environ.get('DB_USER')
    DB_PASS = os.environ.get('DB_PASS')
    DB_NAME = os.environ.get('DB_NAME')
    
    # Initialize the database
    Database = DB(host=DB_HOST, user=DB_USER, password=DB_PASS, db=DB_NAME)
    
    # Initialize the cache
    Cache = redis.Redis.from_url(REDIS_URL)
    
    def fetch(sql):
        """Retrieve records from the cache, or else from the database."""
        res = Cache.get(sql)
    
        if res:
            print('Cache exists!') # プリントを仕込み
            return json.loads(res)
    
        print('Cache not exists...') # プリントを仕込み
        res = Database.query(sql)
        print('Cache setting') # プリントを仕込み
        Cache.setex(sql, TTL, json.dumps(res))
        return res
    
    def planet(id):
        """Retrieve a record from the cache, or else from the database."""
        key = f"planet:{id}"
        res = Cache.hgetall(key)
    
        if res:
            print('Cache exists!') # プリントを仕込み
            return res
    
        print('Cache not exists...') # プリントを仕込み
        sql = "SELECT `id`, `name` FROM `planet` WHERE `id`=%s"
        res = Database.record(sql, (id,))
    
        if res:
            print('Cache setting') # プリントを仕込み
            Cache.hmset(key, res)
            Cache.expire(key, TTL)
    
        return res
    
    # Display the result of some queries
    print(fetch("SELECT * FROM planet"))
    # print(planet(1)) # ひとまずコメントアウト
    # print(planet(2)) # ひとまずコメントアウト
    # print(planet(3)) # ひとまずコメントアウト
    
    처음
    Cache not exists...
    Cache setting
    [{'id': 1, 'name': 'Mercury'}, {'id': 2, 'name': 'Venus'}, {'id': 3, 'name': 'Earth'}, {'id': 4, 'name': 'Mars'}, {'id': 5, 'name': 'Jupiter'}, {'id': 6, 'name': 'Saturn'}, {'id': 7, 'name': 'Uranus'}, {'id': 8, 'name': 'Neptune'}]
    
    즉시 재집행
    Cache exists!
    [{'id': 1, 'name': 'Mercury'}, {'id': 2, 'name': 'Venus'}, {'id': 3, 'name': 'Earth'}, {'id': 4, 'name': 'Mars'}, {'id': 5, 'name': 'Jupiter'}, {'id': 6, 'name': 'Saturn'}, {'id': 7, 'name': 'Uranus'}, {'id': 8, 'name': 'Neptune'}]
    
    TTL로 설정한 지 10초 후에 해보세요.
    Cache not exists...
    Cache setting
    [{'id': 1, 'name': 'Mercury'}, {'id': 2, 'name': 'Venus'}, {'id': 3, 'name': 'Earth'}, {'id': 4, 'name': 'Mars'}, {'id': 5, 'name': 'Jupiter'}, {'id': 6, 'name': 'Saturn'}, {'id': 7, 'name': 'Uranus'}, {'id': 8, 'name': 'Neptune'}]
    
    느낌이 좋아요.
    참고로fetch에서 사용된planet은 유효기간 등록 캐시를 설정하는 방법입니다.( https://redis.io/commands/setex )
    이 메서드에서는 SQL 문 자체를 키로 설정합니다.
    이어 테스트Cache.setex(key, ttl, value).주석 출력을 풀고fetch에서 평론 출력을 실행합니다.
    처음
    Cache not exists...
    Cache setting
    {'id': 1, 'name': 'Mercury'}
    Cache not exists...
    Cache setting
    {'id': 2, 'name': 'Venus'}
    Cache not exists...
    Cache setting
    {'id': 3, 'name': 'Earth'}
    
    두 번째
    Cache exists!
    {b'id': b'1', b'name': b'Mercury'}
    Cache exists!
    {b'id': b'2', b'name': b'Venus'}
    Cache exists!
    {b'id': b'3', b'name': b'Earth'}
    
    10초 경과 후
    Cache not exists...
    Cache setting
    {'id': 1, 'name': 'Mercury'}
    Cache not exists...
    Cache setting
    {'id': 2, 'name': 'Venus'}
    Cache not exists...
    Cache setting
    {'id': 3, 'name': 'Earth'}
    
    느낌이 좋아요.planet처럼 사칭으로 칸막이를 하니 레디스의 문화인 것 같다.( https://qiita.com/morrr/items/271548776938e7ddc0ec#키 정보 )
    다시 만지고 싶지만 시간이 없어서 끝났어요.
    로그에 캐시 생성 등을 출력한 줄 알았지만 자원에 대한 로그만 나왔습니다.
    {
        "CacheClusterId": "clust-002",
        "CacheNodeId": "0001",
        "LogLevel": "NOTICE",
        "Role": "S",
        "Time": "15 Mar 2022 04:54:57.145 UTC",
        "Message": "PRIMARY <-> REPLICA sync: Loading DB in memory."
    }
    

    청소


    순서대로 청소했다.
    이번 한슨을 위해 만든 EC2 실례라면 EC2 실례, VPC, 서브넷도 삭제해 주십시오.
    EC2 인스턴스를 삭제한 후 VPC를 삭제할 때 나타나는 대화 상자에서 서브넷과 인터넷 게이트웨이를 한 번에 삭제할 수도 있습니다.

    감상


    엘라스티 캐시를 만지기 위해 손잡이를 구현했다.
    한 번 만졌다는 느낌보다는 이해가 압도적으로 빠르기 때문에 모르는 서비스를 최대한 접한다.
    이번 정도의 친근함의 피규어라면 AWS 사용 설명서 튜토리얼과 이번핸드 튜토리얼 튜토리얼을 모두 찾을 수 있어 꾸준히 활용됐으면 합니다.

    좋은 웹페이지 즐겨찾기