암호화 된 EBS 볼륨이있는 인스턴스 시작에 대해 (빠르다)

암호화된 EBS 루트 볼륨을 가진 인스턴스를, Lambda를 사용해 자동 기동시키려고 했을 때에 빠진 부분이 있었기 때문에 정리했습니다.

EBS 루트 볼륨 암호화



다음 문서에서 볼 수 있듯이 현재 EBS는 인스턴스의 루트 볼륨 암호화를 지원합니다.
htp : // 아 ws. ty 페파 d. 이 m/아ws_쟈팡/2015/12/네 w-엔 cryp해서 d-에 bs-보오 tゔぉぅ메 s. HTML
이번은 이 루트 볼륨 암호화를 실시한 인스턴스의 자동 기동을 할 때에 빠진 점에 대해 씁니다.

인스턴스 시작 실패



이번에는 AWS Lambda를 사용하여 인스턴스 시작 자동화를 도모하려고 했습니다.
사용한 스크립트는 AMI 백업을 수행하는 Lambda 함수(python) 을 바탕으로 작성한, 다음의 인스턴스 기동 배치입니다.
스톱과 함께 GitHub에도 놓여 있습니다.
htps : // 기주 b. 코 m / 타츠오 48 / 헤이 - rld / t ree / ms r / mb 다 펑 c 치온 s

startinstance.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import json

import boto3

import pprint

TAG_KEY_AUTO_START = 'auto-start'


print('Loading function')

pp = pprint.PrettyPrinter(indent=4)

# 関数名 : lambda_handler
def lambda_handler(event, context):
    print("Received event: " + json.dumps(event, indent=2))

    ec2_client   = boto3.client('ec2')

    ret = execute_start_instance(ec2_client)
    print 'Start instance success(%s).' % (ret)

    return 0
    raise Exception('Something went wrong')

# 関数名 : execute_start_instance
# 戻り値 : 実行結果
# 引数  : ec2_client
#       : ec2_resource
# 機能  : インスタンスを起動する。
def execute_start_instance(ec2_client):
    response = ec2_client.describe_instances()

    result = None
    for ec2_group in response['Reservations']:
        for instance_info in ec2_group['Instances']:
            ret = is_target(instance_info)

            if (ret == False):
                continue
            instance_id = instance_info.get('InstanceId')
            response = ec2_client.start_instances(InstanceIds=[instance_id,])
            print response
            result = True
    return result

# 関数名 : is_target
# 戻り値 : 起動要否
# 引数  : instance_info <dict>
# 機能  : 起動要否を判定する
def is_target(instance_info):
    val = get_tag_value(
        instance_info,
        TAG_KEY_AUTO_START
    )

    if val is None:
        return False

    return True

# 関数名 : get_tag_value
# 戻り値 : タグ値(当該キーに合致するものがなければNone)
# 引数  : instance_info <dict>
#       : key <str>
# 機能  : インスタンス情報から指定キーのタグ値を取得する
def get_tag_value(instance_info, key):
    tags = instance_info.get('Tags')
    if tags == None:
        return None

    for tag in tags:
        if not (key == tag['Key']):
            continue

        tag_value = tag['Value']
        if tag_value == "true":
            return True

    return None

그러나 Lambda 함수를 여러 번 실행해도 다음과 같은 올바른 응답이 반환되었지만 인스턴스가 시작되지 않았습니다. . . .
{u'StartingInstances': [{u'InstanceId': 'インスタンスID', u'CurrentState': {u'Code': 0, u'Name': 'pending'}, u'PreviousState': {u'Code': 80, u'Name': 'stopped'}}], 'ResponseMetadata': {'HTTPStatusCode': 200, 'RequestId': 'kkksfh084k-l9hh-8iy6-hshs4-ipsug88w9hwh'}}

원인 : 실행 역할의 권한 부족



여러가지 조사했지만 원인은 매우 단순한 것이었습니다.
KMS(Key Management Service)의 실행 허가가 빠졌습니다. .
이번에는 저는 기본 키가 아닌 암호화 키를 직접 만들고 사용했습니다.
그 경우, 해당의 암호화 키의 「키 유저」혹은 실행 롤의 정책으로 키의 이용을 허가할 필요가 있었습니다.
암호화 키의 「키 유저」로 설정하는 경우는 다음과 같이 GUI로 설정할 수 있습니다.


실행 롤의 정책이라면 이런 식으로.

실행 역할의 정책으로 설정하는 경우
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1236596007000",
            "Effect": "Allow",
            "Action": [
                "kms:*"
            ],
            "Resource": [
                "作成したキーのARN"
            ]
        }
    ]
}

끝에



원인은 지극히 당연하고 당연합니다만 평소 사용하지 않는 기능이라고 거기까지 가는데도 고생합니다.
앞으로도 업무 내외 불문하고 만지지 않은 기능에 접하도록 해야 한다고 생각했습니다.

좋은 웹페이지 즐겨찾기