一時クレデンシャルで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

無事できました。

追記

スクリプト化しました。

suzuki-navi.hatenablog.com

suzuki-navi.hatenablog.com