IT・ビッグデータ徒然ブログ

関西でインフラ、データ基盤系のエンジニアになりたい

Lambda用にテンポラリーアクセスキーを作成する(あくまで試行錯誤の過程)

以前期限付きURLをLambdaで作成する方法を紹介しました。
そこで最大7日間まで設定できると高をくくったのですが、
いざ使ってみるとものの数時間で、

This token has expired

的なエラーが返ってきます。。。
念のため、何度か確認したのですが、設定した値より前にダメになりました。
何か問題がないかと確認したところ、以下の仕様っぽいです。

  • Lambdaで期限付きURLを発行するとテンポラリのアクセスキーが生成される。
  • 期限より前にテンポラリーアクセスキーの期限がterminateされるとURLも使えなくなる。

これは面倒ですね。。。
であれば、以下のように、

import boto3
from boto3.session import Session



def lambda_handler(event, context):

  BUCKET = '<バケット>'
  KEY = '<ファイル名(パスを含む)>'
  
  #持っているアクセスキーとシークレットキーを指定
  session = Session(aws_access_key_id = '<アクセスキー>',
                aws_secret_access_key = '<シークレットキー>',
                region_name = 'ap-northeast-1')

  s3 = session.client('s3')

  url = s3.generate_presigned_url(
      ClientMethod = 'get_object',
      Params = {'Bucket' : BUCKET, 'Key' : KEY},
      ExpiresIn = 6048000,
      HttpMethod = 'GET'
    )

  print(url)

とすれば問題ないのですが、これだとアクセスキーが完全に露出してしまうのでセキュリティ的に怖いです。

なので、一時的なアクセスキーを作成する方法をさくっと調べてみました。

アクセスキーの作り方 + assumeroleのポリシーを作成 + ポリシーをLambda実行するロールに割り当て + boto3でassumeroleを実行(今回はLambdaでやってみる)

assumeroleポリシーを作成

まずはIAMに移動し、ポリシーで以下のようなポリシーを作成します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "<sidの値>",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::<数字>:role/<ロール名>"
        }
    ]
}

ポリシーをLambda実行するロールに割り当て

これはそのままIAMのロールにてポリシーを割り当てを設定すればよいです。

boto3でassumeroleを実行

今回はLambdaで以下のようなプログラムを作ってみました。

import boto3

def lambda_handler(event,context):

    sts = boto3.client('sts')
    result = sts.assume_role(
                 RoleArn = '<assumeポリシーで設定したロールのARN>',
                 RoleSessionName = '<適当なセッション名>',
                 DurationSeconds=3600
     )

    print(result)

これをテストで動かしてみると結果にアクセスキーが生成されます。

課題

しかし、上記プログラムでDurationSecondsの値を3600(1時間)以上に設定するとエラーが発生。

"errorMessage": "An error occurred (ValidationError) when calling the AssumeRole operation: The requested DurationSeconds exceeds the MaxSessionDuration set for this role.",

boto3のリファレンスを見てみると、、、

  • DurationSecondsの最大値は3600

うーんこれは困りましたね。。。
文章ではSessionSecondsの設定で12時間まで引き上げられるっぽいのですが、この関数のパラメータとしては渡せないので、どうしていくかこれから考えてみます。