署名付きURLを使ってAmazon Connectの情報をセキュアに閲覧する

記事タイトルとURLをコピーする

はじめに

こんにちは。孔子の80代目子孫兼技術5課の孔です。暑い夏が始まるのかなと思いきや、梅雨で夜は少し寒かったりして、健康によくない日が続いています。あまり外出もできない日々の中、健康にはお気をつけてくださいね。

それでは早速ですが、今回ご紹介するブログについてお話しいたします。今回はAmazon ConnectのAPIを使ったブログを用意しました。AWSはどのサービスであってもとても豊富なAPIを提供しています。Amazon Connectももちろんそうで、ユーザーがAmazon Connectを使うにあたってより便利に使えるよう数多くのAPIを提供しております。Amazon ConnectのAPIに関しては、こちらのリンクをご参考ください。

こちらのAPIの中に、「generate_presigned_url」というものが存在します。こちらのAPIは署名付きURLを生成するAPIとなります。個人的にAmazon ConnectのAPIを使って何か練習がてらコードを書いてみたいなと思っていたところ、このAPIを使って何かいいことができるんじゃないかな?と思い、今回やったことを共有する目的でブログを書きました。

本記事ではboto3を使用して実装を行いますが、boto3およびpythonの基礎的な話は今回は省略します。また、本記事に登場するインスタンスIDなどは全部伏せておりますため、ご自身で実装をする際には本記事に登場するコードを参考に値をアレンジしてお使いください。それでは、始めます。

そもそも、署名付きURLとは?

※署名付きURLがどのようなものなのか、おわかりの方はスキップしても大丈夫です。

署名付きURLとは、名前の通り「署名がついているURL」となります。普通のURLといいますと「google.com 」のように、誰でもアクセスできるものですね。しかし署名付きURLは期限が決まっていて、かつその署名を知っている人でないとURLにアクセスができません。例えば以下のようなURLとないます。

https://connect.ap-northeast-1.amazonaws.com/users/....
?X-Amz-Algorithm=AWS4-HMAC-SHA256&....%2Fap-northeast-1%2Fconnect%2Faws4_request
&X-Amz-Date=20200623T030121Z
&X-Amz-Expires=3600
&X-Amz-SignedHeaders=host
&X-Amz-Signature=....

こちらのURLはgenerate_presigned_urlでuser_describeを実行したときに発行されるURLのサンプルとなります。任意でURLを切ってますが、最後にsignatureという単語が見えますね。このようにこの署名をURLにつけて送らない限り、閲覧したい情報を見えないような仕組みとなっているのが署名付きURLとなります。ちなみにexpiresという単語も見えますが、こちらは署名付きURLの有効期限を表しています(秒単位となります)

いざ、コードを書いてみよう

コードはこちらになります。

from boto3 import client
from requests import get


client = client('connect')
# Connectのユーザーを作成する
create_user_response = client.create_user(
    Username='testUser',
    Password='testPassWord01',
    IdentityInfo={
        'FirstName': 'test',
        'LastName': 'user',
        'Email': 'test@test.com'
    },
    PhoneConfig={
        'PhoneType': 'SOFT_PHONE',
        'AutoAccept': True,
        'AfterContactWorkTimeLimit': 0,
    },
    SecurityProfileIds=[
        'XXXX',
    ],
    RoutingProfileId='XXXX',
    InstanceId='XXXX',
)

# describe_userメソッドのパラメータを定義する
params = {
    'UserId': create_user_response['UserId'],
    'InstanceId': 'XXXX'
}

# 署名付きURLを発行する
url = client.generate_presigned_url(
    'describe_user',
    Params=params,
    ExpiresIn=300,
    HttpMethod=None,
)

response = get(url)
print(response.url)  # 署名付きURLを出力する
print(response.text)  # URLからgetしたbodyを出力する

※インスタンスIDなどでXXXXが登場しますが、こちらはご自身の環境に合わせて適切な値を入れてください。

今回想定しているシーンは、ユーザーを作成するAmazon Connect管理者が、ユーザー情報を作成してその作成した内容を該当ユーザーに送るコードを開発しているシーンとなります。そこで署名付きURLを使用することでよりセキュアにユーザーが作成完了ユーザー情報を閲覧できる、的なシーンですね。最後は標準出力でURLとbodyを出してますが、標準出力をメールに送る的な処理だと想像して読んでください😇

それぞれのAPIのパラメータがどのような意味なのかについてです。

create_user APIに関しては、ユーザーを作成する際に必要なもろもろの情報を渡しています。ユーザーの名前は、パスワードは、ログイン名は、電話機やセキュリティプロファイルなどは何を使うのか、などなどです。

その次にgenerate_presigned_url APIです。こちらのAPIは第1引数API名を文字列で入力します(API一覧は先ほどのConnect APIリンクをご参考ください)第2引数に指定したAPIが必要とするパラメータを渡し、その次に期限を入れます(秒数となります)最後のHttpMethodにはurlを生成するためのHTTPメソッドを入力します。ドキュメントによりますと、こちらはどのようなメソッドでもOKだそうです。

こちらのコードを実行するといかのような結果となります。

> https://connect.ap-northeast-1.amazonaws.com/users/....(署名付きURL)
> {
  "User" : {
    "PhoneConfig" : {
      "DeskPhoneNumber" : "",
      "PhoneType" : "SOFT_PHONE",
      "AfterContactWorkTimeLimit" : 0,
      "AutoAccept" : true
    },
    "Arn" : "XXXX",
    "IdentityInfo" : {
      "Email" : "test@test.com",
      "LastName" : "user",
      "FirstName" : "test"
    },
    ....(以下省略)
  }
}

最後に

今回はAmazon ConnectのAPIの一種である、署名付きURLの発行についてみてみました。APIの中ではとても便利で、よりAWSを使いこなせる便利なAPIがたくさんありますのでぜひお時間のある際に一通り目を通してみると面白い発見があるかもです!それではみなさん、お元気で!