一時クレデンシャルでServerless Frameworkを動かす
AWSのEC2インスタンスにアタッチされたIAM Roleから別のIAM Roleにassumeできるようにしてあって、assume先の権限でServerless Frameworkを動かす必要がある場合、 ~/.aws/config
にRoleを書いてもできませんでした。→前回の記事
手動でassumeして、一時クレデンシャル(temporary credentials)を取得して、そのアクセスキーを環境変数に設定すれば、 ~/.aws/config
関係なく、Serverless Frameworkを実行できましたので、メモしておきます。
準備
IAM Roleを2つ準備して、EC2インスタンスも準備して、Roleをアタッチするところまでは前回の記事と同じです。
- IAM Role sample-ec2-role: なにも権限のないIAM Role。EC2にアタッチ
- IAM Role sample-admin: S3などServerless Framework実行に必要な権限。sample-ec2-roleからassumeできるようにTrust Relationshipを設定
一時クレデンシャル取得
assume先のIAM Role(以下例ではsample-adminという名前のIAM Role)をARNで指定して、assume-role
コマンドを実行します。
$ aws sts assume-role --role-arn arn:aws:iam::123456789012:role/sample-admin --role-session-name sample-session
すると、以下のJSONが返ってきます。
{ "Credentials": { "AccessKeyId": "ASIAXXXXXXXXXXXXXXXX", "SecretAccessKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "SessionToken": "xxxxxxxxxxxxxxxx....", "Expiration": "2021-04-30T06:14:32Z" }, "AssumedRoleUser": { "AssumedRoleId": "AROAXXXXXXXXXXXXXXXXX:sample-session", "Arn": "arn:aws:sts::123456789012:assumed-role/sample-admin/sample-session" } }
Serverless Framework実行
取得したJSONにあるアクセスキーなどをServerless Frameworkから参照させるために、環境変数を設定します。
$ export AWS_ACCESS_KEY_ID=ASIAXXXXXXXXXXXXXXXX $ export AWS_SECRET_ACCESS_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" $ export AWS_SESSION_TOKEN="xxxxxxxxxxxxxxxx...."
実行。
$ serverless deploy
無事できました。
追記
スクリプト化しました。