defmodule Formation.Aws.IAM.Manager do alias Formation.Aws.Bucket alias Formation.Aws.IAM alias Formation.S3.Credential def create(client, resource, params) def create(client, %Bucket{} = bucket, %{ id: id, permission: "basic" = permission }) do policy_document = IAM.Policy.build(id, bucket, permission) user_name = "opsmaru-user-#{id}" create_user_params = %{ "Path" => "/", "UserName" => user_name, "Tags" => %{ "member" => [ %{"Key" => "component", "Value" => id} ] } } with {:ok, _user_response, _} <- AWS.IAM.create_user(client, create_user_params), {:ok, %{"CreatePolicyResponse" => create_policy_response}, _} <- AWS.IAM.create_policy(client, %{ "PolicyName" => "opsmaru-policy-#{id}", "PolicyDocument" => Jason.encode!(policy_document) }), {:ok, _attach_policy_response, _} <- AWS.IAM.attach_user_policy(client, %{ "UserName" => user_name, "PolicyArn" => create_policy_response["CreatePolicyResult"]["Policy"]["Arn"] }), {:ok, access_key_response, _} <- AWS.IAM.create_access_key(client, %{"UserName" => user_name}) do Credential.create(%{ type: :instance, endpoint: "s3.#{client.region}.amazonaws.com", bucket: bucket.name, region: client.region, acl: bucket.acl, access_key_id: access_key_response["CreateAccessKeyResponse"]["CreateAccessKeyResult"]["AccessKey"][ "AccessKeyId" ], secret_access_key: access_key_response["CreateAccessKeyResponse"]["CreateAccessKeyResult"]["AccessKey"][ "SecretAccessKey" ] }) end end end