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時間まで引き上げられるっぽいのですが、この関数のパラメータとしては渡せないので、どうしていくかこれから考えてみます。